在公司,目前使用的树莓派,具有联网自动发送ip的功能。由于没找到源码,于是参考网上的各个版本,编写了Go版本的程序,代码如下:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net"
"net/http"
"os/exec"
"strings"
)
//声明并赋值钉钉的机器人接口地址,此处地址仅为示例,实际可用地址请参考钉钉开发文档
var accesstoken string = "https://oapi.dingtalk.com/robot/send?access_token="
//声明一个map,用于map嵌套
var data_content map[string]interface{}
//声明一个map,用于保存go风格的信息
var data_map map[string]interface{}
//用于初始化所有需要post的信息
func Ding_Init() {
//获取当前主机的ip,以字符串的形式赋值给local_addr
conn, err := net.Dial("udp", "www.google.com.hk:80")
if err != nil {
fmt.Println(err.Error())
return
}
//返回的是host:port形式,利用Splitf分割,只取host
local_addr := strings.Split(conn.LocalAddr().String(), ":")[0]
defer conn.Close()
// fmt.Println(conn.LocalAddr().String())
//初始化map,完成嵌套,map嵌套规则以及关键字使用,参考钉钉相关的开发文档
data_content = make(map[string]interface{})
data_map = make(map[string]interface{})
data_content["content"] = "本机IP为: " + local_addr
data_map["msgtype"] = "text"
data_map["text"] = data_content
}
func Get_addrs() {
//利用json包,将go的map转换为可post的json形式
json_data, err := json.Marshal(data_map)
if err != nil {
fmt.Println("sss")
}
// fmt.Println(string(json_data))
//新建一个request
request, _ := http.NewRequest("POST", accesstoken, strings.NewReader(string(json_data)))
//设置request的请求头
request.Header.Set("Content-Type", "application/json")
//发起request
resp, err := http.DefaultClient.Do(request)
if err != nil {
fmt.Printf("post data error:%v\n", err)
} else {
fmt.Println("post a data successful.")
respBody, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("response data:%v\n", string(respBody))
}
}
//用于循环,判断当前主机的网络连接情况
func NetStatus() bool {
cmd := exec.Command("ping", "www.baidu.com", "-w", "3")
err := cmd.Run()
if err == nil {
return true
} else {
return false
}
}
func main() {
for {
if NetStatus() {
break
}
}
Ding_Init()
Get_addrs()
}
之后编译为linux下可执行文件,利用.sh文件执行该文件并注册为开机自启服务,即可实现开机联网自动汇报ip。