Skip to content

Commit 5a7e64b

Browse files
author
Cairry
committed
✨ feat(sender): Supported dingtalk sign and optimized feishu sign logic
1 parent 817a887 commit 5a7e64b

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

pkg/sender/dingding.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ package sender
22

33
import (
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

3135
func (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

3539
func (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&timestamp=%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+
}

pkg/sender/feishu.go

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@ func (f *FeiShuSender) Test(params SendParams) error {
5555

5656
func (f *FeiShuSender) post(hook, sign string, msg map[string]any) error {
5757
if sign != "" {
58-
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
59-
signature, err := generateSignature(sign, timestamp)
60-
if err != nil {
61-
return err
62-
}
58+
signature, timestamp := generateFeishuSignature(sign)
6359
msg["sign"] = signature
6460
msg["timestamp"] = timestamp
6561
}
@@ -81,16 +77,17 @@ func (f *FeiShuSender) post(hook, sign string, msg map[string]any) error {
8177
return nil
8278
}
8379

84-
// generateSignature 生成签名
85-
func generateSignature(secret string, timestamp string) (string, error) {
86-
//timestamp + key 做sha256, 再进行base64 encode
87-
stringToSign := fmt.Sprintf("%v", timestamp) + "\n" + secret
80+
// generateFeishuSignature 生成 Feishu 签名
81+
func generateFeishuSignature(secret string) (string, string) {
82+
// 1. Get timestamp
83+
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
84+
85+
// 2. Prepare the string to sign: {timestamp}\n{secret}
86+
stringToSign := fmt.Sprintf("%s\n%s", timestamp, secret)
87+
8888
var data []byte
8989
h := hmac.New(sha256.New, []byte(stringToSign))
90-
_, err := h.Write(data)
91-
if err != nil {
92-
return "", err
93-
}
94-
signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
95-
return signature, nil
90+
h.Write(data)
91+
92+
return base64.StdEncoding.EncodeToString(h.Sum(nil)), timestamp
9693
}

0 commit comments

Comments
 (0)