Golang 实现微信报警,为系统的监控提供了方便

转自:苏州 狄

通过企业微信创建应用,然后设定当前的应用对某些用户可见,同时微信提供了各种接口,供开发人员调用,实现发送各种文本信息,图片,音频,视频等等。

1, 注册企业微信

首先,你得有一个企业微信,没有的自行百度注册一个。

在有企业微信的前提之下,进入企业微信管理平台(当然需要管理员权限)。微信的API文档有详细的介绍,可详细的阅读。
点击企业应用选项,在下方选择自建应用的创建应用按钮。

企业应用界面

设置头像,应用名称,应用描述之后,点击创建应用即可。
这里写图片描述

创建完应用之后,需要为这个应用设定课件范围,也就是向哪些好友提供这个应用。选择刚刚创建的应用,点击可见范围,选择人即可。
这时候,这个应用就创建好了,简单测试一下,选择发送消息,输入要发送的消息,选择特定的人群,点击发送,这时候在我们的企业微信上特定的选中人群就会收到刚刚发送的消息。

2.调用API接口,发送消息

微信的API文档中的发送消息里,详细的讲解了开发人员需要做的事。
https://work.weixin.qq.com/api/doc#10167

2.1

根据企业微信的CorpID 和应用的 Secret获取token
CorpID 在我的企业里,Secret在刚刚创建的应用里。

2.2

根据获取的token,发送要发送的内容,在发送之前需要指定发送的部门和人员,具体的设置方法见文档。

代码如下

package main

import (
    "bytes"
    "encoding/json"
    "errors"
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"
)

const (
    //发送消息使用导的url
    sendurl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=`
    //获取token使用导的url
    get_token = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=`
)

var requestError = errors.New("request error,check url or network")

type access_token struct {
    Access_token string `json:"access_token"`
    Expires_in   int    `json:"expires_in"`
}

//定义一个简单的文本消息格式
type send_msg struct {
    Touser  string            `json:"touser"`
    Toparty string            `json:"toparty"`
    Totag   string            `json:"totag"`
    Msgtype string            `json:"msgtype"`
    Agentid int               `json:"agentid"`
    Text    map[string]string `json:"text"`
    Safe    int               `json:"safe"`
}

type send_msg_error struct {
    Errcode int    `json:"errcode`
    Errmsg  string `json:"errmsg"`
}

func main() {
    touser := flag.String("t", "GaoXing", "-t user 直接接收消息的用户昵称")
    agentid := flag.Int("i", (填写自己的), "-i 0 指定agentid")
    content := flag.String("c", "微信报警", "-c 'Hello world' 指定要发送的内容")
    corpid := flag.String("p", "------(填写自己的)------", "-p corpid 必须指定")
    corpsecret := flag.String("s", "------(填写自己的)-------", "-s corpsecret 必须指定")
    flag.Parse()

    if *corpid == "" || *corpsecret == "" {
        flag.Usage()
        return
    }

    var m send_msg = send_msg{Touser: *touser, Toparty: "C_G_X", Msgtype: "text", Agentid: *agentid, Text: map[string]string{"content": *content}}

    token, err := Get_token(*corpid, *corpsecret)
    if err != nil {
        println(err.Error())
        return
    }
    fmt.Println("获取token成功:", token)
    buf, err := json.Marshal(m)
    if err != nil {
        return
    }
    err = Send_msg(token.Access_token, buf)
    if err != nil {
        println(err.Error())
    } else {
        fmt.Println("发送消息成功", string(buf))
    }

}

//发送消息.msgbody 必须是 API支持的类型
func Send_msg(Access_token string, msgbody []byte) error {
    body := bytes.NewBuffer(msgbody)
    resp, err := http.Post(sendurl+Access_token, "application/json", body)
    if resp.StatusCode != 200 {
        return requestError
    }
    buf, _ := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    var e send_msg_error
    err = json.Unmarshal(buf, &e)
    if err != nil {
        return err
    }
    if e.Errcode != 0 && e.Errmsg != "ok" {
        return errors.New(string(buf))
    }
    return nil
}

//通过corpid 和 corpsecret 获取token
func Get_token(corpid, corpsecret string) (at access_token, err error) {
    resp, err := http.Get(get_token + corpid + "&corpsecret=" + corpsecret)
    if err != nil {
        return
    }
    defer resp.Body.Close()
    if resp.StatusCode != 200 {
        err = requestError
        return
    }
    buf, _ := ioutil.ReadAll(resp.Body)
    err = json.Unmarshal(buf, &at)
    if at.Access_token == "" {
        err = errors.New("corpid or corpsecret error.")
    }
    return
}

我将微信报警做成了一个服务:
GitHub: https://github.com/ukinhappy/WeChatAlarmServer