加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang实现通过微信接收告警消息

发布时间:2020-12-16 18:27:55 所属栏目:大数据 来源:网络整理
导读:首先需要注册微信企业公众号,选团队的可以不使用认证 如图进入公众平台 选择设置.里面有CorpID 和 SecretID 这个发送的时候需要用到. 下面就是使用提供的API 开始发送信息了.具体自己可以看开发者中心里面的文档. package main import ( "bufio" "bytes"

首先需要注册微信企业公众号,选团队的可以不使用认证

如图进入公众平台 选择设置.里面有CorpID 和 SecretID 这个发送的时候需要用到.
下面就是使用提供的API 开始发送信息了.具体自己可以看开发者中心里面的文档.

package main

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

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() {
    mfile := flag.String("m","","-m msg.txt 从配置文件读取配置发送消息")
    touser := flag.String("t","@all","-t user 直接接收消息的用户昵称")
    agentid := flag.Int("i", 0,"-i 0 指定agentid")
    content := flag.String("c","Hello world","-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,Msgtype: "text",Agentid: *agentid,Text: map[string]string{"content": *content}}

    if *mfile != "" {
        buf,err := Parse(*mfile)
        if err != nil {
            println(err.Error())
            return
        }
        err = json.Unmarshal(buf,&m)
        if err != nil {
            println(err)
            return
        }
    }
    ///-p "wx2468f5838693e123" -s "JbjkM1jYq8g3GaHjOTgj27y4n4_7Dsv4FV94I5BMRSrBsm_aTsMUVJMhGu_DFGDSF"
    token,err := Get_token(*corpid,*corpsecret)
    if err != nil {
        println(err.Error())
        return
    }
    buf,err := json.Marshal(m)
    if err != nil {
        return
    }
    err = Send_msg(token.Access_token,buf)
    if err != nil {
        println(err.Error())
    }
}

//发送消息.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
}

func Parse(jsonpath string) ([]byte,error) {
    var zs = []byte("//")
    File,err := os.Open(jsonpath)
    if err != nil {
        return nil,err
    }
    defer File.Close()
    var buf []byte
    b := bufio.NewReader(File)
    for {
        line,_,err := b.ReadLine()
        if err != nil {
            if err.Error() == "EOF" {
                break
            }
            return nil,err
        }
        line = bytes.TrimSpace(line)
        if len(line) <= 0 {
            continue
        }
        index := bytes.Index(line,zs)
        if index == 0 {
            continue
        }
        if index > 0 {
            line = line[:index]
        }
        buf = append(buf,line...)
    }
    return buf,nil
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读