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更簡單以及方便。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM