Skip to content

Commit f88ff99

Browse files
jinrongaCairry
andauthored
🚀 feat(notice): 增加飞书签名字段和生成签名逻辑 (#121)
Co-authored-by: Cairry <[email protected]>
1 parent 9e91022 commit f88ff99

File tree

4 files changed

+61
-3
lines changed

4 files changed

+61
-3
lines changed

alert/consumer/consumer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ func (ec *Consume) handleAlert(rule models.AlertRule, alerts []models.AlertCurEv
332332
Content: content,
333333
Event: nil,
334334
PhoneNumber: phoneNumber,
335+
Sign: noticeData.Sign,
335336
})
336337
if err != nil {
337338
logc.Errorf(ec.ctx.Ctx, err.Error())

internal/models/notice.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ type AlertNotice struct {
1313
NoticeTmplId string `json:"noticeTmplId"`
1414
Hook string `json:"hook"`
1515
Email Email `json:"email" gorm:"email;serializer:json"`
16+
// 签名
17+
Sign string `json:"sign" gorm:"sign"`
1618
PhoneNumber []string `json:"phoneNumber" gorm:"phoneNumber;serializer:json"`
1719
}
1820

pkg/sender/entry.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package sender
22

33
import (
4+
"encoding/json"
45
"fmt"
5-
"github.com/zeromicro/go-zero/core/logc"
66
"time"
7+
78
"watchAlert/internal/models"
89
"watchAlert/pkg/ctx"
10+
11+
log "github.com/sirupsen/logrus"
12+
"github.com/zeromicro/go-zero/core/logc"
913
)
1014

1115
type (
@@ -31,6 +35,8 @@ type (
3135
Event interface{}
3236
// 电话号码
3337
PhoneNumber []string
38+
// 签名
39+
Sign string `json:"sign,omitempty"`
3440
}
3541

3642
// SendInter 发送通知的接口
@@ -97,3 +103,17 @@ func addRecord(ctx *ctx.Context, sendParams SendParams, status int, msg, errMsg
97103
logc.Errorf(ctx.Ctx, fmt.Sprintf("Add notice record failed, err: %s", err.Error()))
98104
}
99105
}
106+
107+
// GetSendMsg 发送内容
108+
func (s *SendParams) GetSendMsg() map[string]any {
109+
msg := make(map[string]any)
110+
if s == nil || s.Content == "" {
111+
return msg
112+
}
113+
err := json.Unmarshal([]byte(s.Content), &msg)
114+
if err != nil {
115+
log.Fatal("解析发送内容失败!", err)
116+
return msg
117+
}
118+
return msg
119+
}

pkg/sender/feishu.go

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

33
import (
44
"bytes"
5+
"crypto/hmac"
6+
"crypto/sha256"
7+
"encoding/base64"
8+
"encoding/json"
59
"errors"
610
"fmt"
11+
"strconv"
12+
"time"
13+
714
"watchAlert/pkg/tools"
815
)
916

@@ -22,8 +29,22 @@ func NewFeiShuSender() SendInter {
2229
}
2330

2431
func (f *FeiShuSender) Send(params SendParams) error {
25-
cardContentByte := bytes.NewReader([]byte(params.Content))
26-
res, err := tools.Post(nil, params.Hook, cardContentByte, 10)
32+
msg := params.GetSendMsg()
33+
if params.Sign != "" {
34+
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
35+
signature, err := generateSignature(params.Sign, timestamp)
36+
if err != nil {
37+
return err
38+
}
39+
msg["sign"] = signature
40+
msg["timestamp"] = timestamp
41+
}
42+
43+
msgStr, _ := json.Marshal(msg)
44+
45+
msgByte := bytes.NewReader(msgStr)
46+
47+
res, err := tools.Post(nil, params.Hook, msgByte, 10)
2748
if err != nil {
2849
return err
2950
}
@@ -38,3 +59,17 @@ func (f *FeiShuSender) Send(params SendParams) error {
3859

3960
return nil
4061
}
62+
63+
// generateSignature 生成签名
64+
func generateSignature(secret string, timestamp string) (string, error) {
65+
//timestamp + key 做sha256, 再进行base64 encode
66+
stringToSign := fmt.Sprintf("%v", timestamp) + "\n" + secret
67+
var data []byte
68+
h := hmac.New(sha256.New, []byte(stringToSign))
69+
_, err := h.Write(data)
70+
if err != nil {
71+
return "", err
72+
}
73+
signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
74+
return signature, nil
75+
}

0 commit comments

Comments
 (0)