@@ -2,8 +2,12 @@ package sender
22
33import (
44 "bytes"
5- "errors"
5+ "crypto/hmac"
6+ "crypto/sha256"
7+ "encoding/base64"
68 "fmt"
9+ "net/url"
10+ "time"
711 "watchAlert/pkg/tools"
812)
913
@@ -29,14 +33,19 @@ func NewDingSender() SendInter {
2933}
3034
3135func (d * DingDingSender ) Send (params SendParams ) error {
32- return d .post (params .Hook , params .Content )
36+ return d .post (params .Hook , params .Sign , params . Content )
3337}
3438
3539func (d * DingDingSender ) Test (params SendParams ) error {
36- return d .post (params .Hook , DingTestContent )
40+ return d .post (params .Hook , params . Sign , DingTestContent )
3741}
3842
39- func (d * DingDingSender ) post (hook , content string ) error {
43+ func (d * DingDingSender ) post (hook , sign , content string ) error {
44+ if sign != "" {
45+ signature , timestamp := generateDingSignature (sign )
46+ hook = fmt .Sprintf ("%s×tamp=%s&sign=%s" , hook , timestamp , signature )
47+ }
48+
4049 cardContentByte := bytes .NewReader ([]byte (content ))
4150 res , err := tools .Post (nil , hook , cardContentByte , 10 )
4251 if err != nil {
@@ -45,11 +54,27 @@ func (d *DingDingSender) post(hook, content string) error {
4554
4655 var response DingResponse
4756 if err := tools .ParseReaderBody (res .Body , & response ); err != nil {
48- return errors . New ( fmt .Sprintf ("Error unmarshalling Dingding response: %s" , err .Error () ))
57+ return fmt .Errorf ("Error unmarshalling Dingding response: %s" , err .Error ())
4958 }
5059 if response .Code != 0 {
51- return errors . New ( response .Msg )
60+ return fmt . Errorf ( "%v" , response .Msg )
5261 }
5362
5463 return nil
5564}
65+
66+ // generateDingSignature 生成 Ding 签名
67+ func generateDingSignature (secret string ) (string , string ) {
68+ // 1. Get millisecond timestamp
69+ timestamp := fmt .Sprintf ("%d" , time .Now ().UnixNano ()/ int64 (time .Millisecond ))
70+
71+ // 2. Prepare the string to sign: {timestamp}\n{secret}
72+ stringToSign := fmt .Sprintf ("%s\n %s" , timestamp , secret )
73+
74+ // 3. Create HMAC-SHA256 hash
75+ h := hmac .New (sha256 .New , []byte (secret ))
76+ h .Write ([]byte (stringToSign ))
77+ hmacCode := h .Sum (nil )
78+
79+ return url .QueryEscape (base64 .StdEncoding .EncodeToString (hmacCode )), timestamp
80+ }
0 commit comments