mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-02-03 10:58:44 +08:00
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package feishu
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|
"strconv"
|
|
"time"
|
|
|
|
"hotgo/internal/library/notify/feishu/internal/security"
|
|
)
|
|
|
|
const feishuAPI = "https://open.feishu.cn/open-apis/bot/v2/hook/"
|
|
|
|
// Client feishu client
|
|
type Client struct {
|
|
AccessToken string
|
|
Secret string
|
|
}
|
|
|
|
// NewClient new client
|
|
func NewClient(accessToken, secret string) *Client {
|
|
return &Client{
|
|
AccessToken: accessToken,
|
|
Secret: secret,
|
|
}
|
|
}
|
|
|
|
// Response response struct
|
|
type Response struct {
|
|
Code int64 `json:"code"`
|
|
Msg string `json:"msg"`
|
|
Data interface{} `json:"data"`
|
|
|
|
Extra interface{} `json:"Extra"`
|
|
StatusCode int64 `json:"StatusCode"`
|
|
StatusMessage string `json:"StatusMessage"`
|
|
}
|
|
|
|
// Send send message
|
|
func (d *Client) Send(message Message) (string, *Response, error) {
|
|
res := &Response{}
|
|
|
|
if len(d.AccessToken) < 1 {
|
|
return "", res, fmt.Errorf("accessToken is empty")
|
|
}
|
|
|
|
timestamp := time.Now().Unix()
|
|
sign, err := security.GenSign(d.Secret, timestamp)
|
|
if err != nil {
|
|
return "", res, err
|
|
}
|
|
|
|
body := message.Body()
|
|
body["timestamp"] = strconv.FormatInt(timestamp, 10)
|
|
body["sign"] = sign
|
|
|
|
reqBytes, err := json.Marshal(body)
|
|
if err != nil {
|
|
return "", res, err
|
|
}
|
|
|
|
var (
|
|
result *Response
|
|
URL = fmt.Sprintf("%v%v", feishuAPI, d.AccessToken)
|
|
reqString = string(reqBytes)
|
|
)
|
|
|
|
g.Client().
|
|
Retry(3, time.Second).
|
|
SetHeader("Accept", "application/json").
|
|
SetHeader("Content-Type", "application/json").
|
|
PostVar(gctx.New(), URL, &result)
|
|
if result.Code != 0 {
|
|
return reqString, result, fmt.Errorf("send message to feishu error = %s", result.Msg)
|
|
}
|
|
return reqString, result, nil
|
|
}
|