背景
阿里云有个产品3个月后到期,想做个提醒发送到钉钉群里。
步骤
cat send_ding_msg.go
package main
import (
//用于生成HMAC-SHA256签名。
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"fmt"
"io"
"net/http"
"strings"
"time"
)
const (
// 替换为你的钉钉机器人 Webhook 地址
webhook = "https://oapi.dingtalk.com/robot/send?access_token=d8e72ab。。。×tamp=&sign="
// 替换为你的加签密钥
secret = "SECc3。。。"
)
// 生成加签
func getSign() (string, int64) {
timestamp := time.Now().UnixMilli() // 获取当前毫秒级时间戳
stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret) // 拼接签名字符串
h := hmac.New(sha256.New, []byte(secret)) // 创建HMAC实例
h.Write([]byte(stringToSign)) // 写入待签名字符串
sign := base64.StdEncoding.EncodeToString(h.Sum(nil)) // 计算签名并Base64编码
return sign, timestamp // 返回签名和时间戳。
}
// 发送消息到钉钉
func sendDingTalkMessage(message string) error {
sign, timestamp := getSign() // 获取签名和时间戳
url := fmt.Sprintf("%s×tamp=%d&sign=%s", webhook, timestamp, sign) // 拼接完整的URL
payload := fmt.Sprintf(`{
"msgtype": "text",
"text": {
"content": "%s"
}
}`, message) // 构建JSON消息体
resp, err := http.Post(url, "application/json", strings.NewReader(payload)) // 发送POST请求
if err != nil {
return fmt.Errorf("发送请求失败: %v", err)
}
// 关闭响应体.防止因Body重用时产生的闭包问题,defer resp.Body.Close()
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
}
}(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("读取响应失败: %v", err)
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("发送失败,状态码: %d, 响应: %s", resp.StatusCode, string(body))
}
return nil
}
func main() {
message := "MQ即将到期,请及时续费!"
err := sendDingTalkMessage(message)
if err != nil {
fmt.Printf("发送消息失败: %v\n", err)
return
}
fmt.Println("消息发送成功!")
}
构建
go build send_ding_msg.go
创建crontab,在9月11-25日每天9点发送消息。
0 9 11-25 9 * /root/go_script/send_ding_msg