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

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

如图进入公众平台 选择设置.里面有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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都依靠这个专用协议进行。 在websocket出现之前,一些网站为了实现消息的推送,采用最多的技术是A
使用gin框架编写服务端应用,配置路由接收websocket请求并处理。同时实现一个websocket命令行客户端用于与服务端通信。
## 前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务。当然,也不是不行,比如: ```shell * * * * * for i in $(seq 1 11);do echo hello &gt;&gt; /home/heruos/tmp.txt;sleep 5;do
前言 代码参考自《Building Distributed Application in Gin》 需求:设计一个食谱相关的API,数据存放到切片中。 设计模型和API 模型 type Recipe struct { // 菜品名 Name string `json:&quot;name&quot;
前言 通过钉钉群机器人的webhook,实现消息推送。 本文代码仅示例markdown格式的消息。 示例代码 注意修改钉钉机器人的webhook package main import ( &quot;bytes&quot; &quot;encoding/json&quot; &quot;fmt&q
golang-jwt是go语言中用来生成和解析jwt的一个第三方库,早先版本也叫jwt-go。本文中使用目前最新的v5版本。
## 前言 假设gRPC服务端的主机名为`qw.er.com`,需要为gRPC服务端和客户端之间的通信配置tls双向认证加密。 ## 生成证书 1. 生成ca根证书。生成过程会要求填写密码、CN、ON、OU等信息,记住密码。 ```shell openssl req -x509 -newkey rs
前言 在go语言中,因为字符串只能被访问,不能被修改,所以进行字符串拼接的时候,golang都需要进行内存拷贝,造成一定的性能消耗。 方式1:操作符 + 特点:简单,可读性良好。每次拼接都会产生内存拷贝,性能一般。仅适用于字符串类型的变量。 示例代码: str1 := &quot;hello &qu
前言 正常情况下,主协程一旦退出,其子协程也会全部中止并退出。为了阻塞主协程,可以使用time.Sleep(),也可以使用WaitGroup。 用法说明 // 导入sync import &quot;sync&quot; // 定义一个sync.WaitGroup var wg sync.WaitG
前言 方便在内网环境中获取服务器本机IP,省了在脚本中过滤ip或ifconfig的结果。 如果内网中有nginx的话,通过nginx获取本机IP也很方便,可参考 借助nginx自动获取本机IP 示例代码 package main import ( &quot;fmt&quot; &quot;net&
简介 logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活。logrus完全兼容标准的log库,还支持文本、JSON两种日志输出格式。 特点 相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace &gt; debug &gt; info &gt; wa
基于Gin框架编写的Web API,实现简单的CRUD功能,数据存放在MongoDB,并设置Redis缓存。
## 简介 借助 `github.com/hpcloud/tail` ,可以实时追踪文件变更,达到类似shell命令`tail -f`的效果。 ## 示例代码 以下示例代码用于实时读取nginx的`access.log`日志文件,读取到后输出到控制台。如果nginx日志做了json格式化,还可以解析
前言 go在操作MySQL时,可以使用ORM(比如gorm、xorm),也可以使用原生sql。本文以使用sqlx为例,简单记录步骤。 go version: 1.16 安装相关库 # mysql驱动 go get github.com/go-sql-driver/mysql # 基于MySQL驱动的
前言 某次在客户内网传输数据的时候,防火墙拦截了SSH的数据包,导致没法使用scp命令传输文件,tcp协议和http协议也只放开了指定端口,因此想了个用http传输的“曲线救国”方案。 假设要从192.168.1.23传输到192.168.2.34,因防火墙限制,只能从1.23访问2.34,不能从2
前言 go version: 1.18 本文主要包含JSON、Form、Uri、XML的数据解析与绑定。 JSON数据解析与绑定 go代码 package main import ( &quot;net/http&quot; &quot;github.com/gin-gonic/gin&quot;
## 前言 假设一个场景,服务端部署在内网,客户端需要通过暴露在公网的nginx与服务端进行通信。为了避免在公网进行 http 明文通信造成的信息泄露,nginx与客户端之间的通信应当使用 https 协议,并且nginx也要验证客户端的身份,也就是mTLS双向加密认证通信。 这条通信链路有三个角色
使用gin框架编写web程序作为alertmanager的webhook receiver,解析数据并发送到钉钉
前言 多阶段封装docker镜像,使用scratch镜像,尽量减小镜像包的体积。 封装用于编译的go镜像 Dockerfile FROM golang:1.20.1 AS builder WORKDIR /apps COPY . /apps/ ENV CGO_ENABLED=0 ENV GOOS=l
前言 标准库strconv提供了字符串类型与其他常用数据类型之间的转换。 strconv.FormatX()用于X类型转字符串,如strconv.FormatFloat()用于浮点型转字符串。 strconv.ParseX()用于字符串转X类型,如strconv.ParseFloat()用于字符串转