Go发送钉钉消息

好久都没有写博客了,因为最近研究的东西都比较琐碎,自己笔记记录了不少,但是写成文章也总感觉不够。正好上周五发现钉钉机器人的的接口稍作了一个改变,本着没事找事的态度,看了一下,主要就是增加了一个安全验证的机制

  1. 关键字类型,只要消息中包含关键字就可以。
  2. 加签
  3. 指定IP或者IP段
    综合三种方式来看,加签的方式稍微难度高一点,所以就折腾一下加签的方式。
    首先分享一下我写的脚本

该脚本主要是用作Zabbix报警使用,脚本也比较简单,不喜勿喷,本人的只是一个爱折腾的运维小菜鸟

package main

import (
	"bytes"
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"time"
)

func hmacSha256(stringToSign string, secret string) string {
	h := hmac.New(sha256.New, []byte(secret))
	h.Write([]byte(stringToSign))
	return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

// Sign 发送钉钉消息
func Sign() string {
	secret := "YOUR SECRET"
	webhook := "YOUR WEBHOOK"
	timestamp := time.Now().UnixNano() / 1e6
	stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret)
	sign := hmacSha256(stringToSign, secret)
	url := fmt.Sprintf("%s&timestamp=%d&sign=%s", webhook, timestamp, sign)
	return url
}

func dingToInfo(s, url string) bool {
	content, data := make(map[string]string), make(map[string]interface{})
	content["content"] = s
	data["msgtype"] = "text"
	data["text"] = content
	b, _ := json.Marshal(data)

	resp, err := http.Post(url,
		"application/json",
		bytes.NewBuffer(b))
	if err != nil {
		fmt.Println(err)
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
	return true
}

func main() {
	url := Sign()
	text := os.Args[1]
	dingToInfo(text, url)
}

该脚本替换
secret := "YOUR SECRET" webhook := "YOUR WEBHOOK"
这两处为你SECRET和WEBHOOK即可。

补充说明:
对于第一次使用钉钉机器人的小伙伴可能不知道这两个东西如何获取。

  • 创建一个三个人的钉钉群(创建完成之后就可以把另外两个人踢出,避免你测试的时候的消息打扰别人)
    创建完成钉钉群之后,创建机器人


这里我们选择加签的方式,之后就会生成一个密钥以及Webhook地址。

参考文章:
钉钉官方文档:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
SDK: https://github.com/JetBlink/dingtalk-notify-go-sdk
如果觉得麻烦的话,其实直接接SDK更简单以及方便。

posted @ 2020-06-22 13:15  情浅凉心  阅读(1427)  评论(0编辑  收藏  举报