feat: support tencent custom alarm now (close #87)
This commit is contained in:
@@ -37,6 +37,8 @@ func SendMessage(message *model.Message, user *model.User, channel_ *model.Chann
|
||||
return SendLarkAppMessage(message, user, channel_)
|
||||
case model.TypeCustom:
|
||||
return SendCustomMessage(message, user, channel_)
|
||||
case model.TypeTencentAlarm:
|
||||
return SendTencentAlarmMessage(message, user, channel_)
|
||||
default:
|
||||
return errors.New("不支持的消息通道:" + channel_.Type)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
package channel
|
||||
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/sha1"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"math/rand"
|
||||
"message-pusher/model"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type TencentAlarmResponse struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
CodeDesc string `json:"codeDesc"`
|
||||
}
|
||||
|
||||
func SendTencentAlarmMessage(message *model.Message, user *model.User, channel_ *model.Channel) error {
|
||||
secretId := channel_.AppId
|
||||
secretKey := channel_.Secret
|
||||
policyId := channel_.AccountId
|
||||
region := channel_.Other
|
||||
if message.Description == "" {
|
||||
message.Description = message.Content
|
||||
}
|
||||
params := map[string]string{
|
||||
"Action": "SendCustomAlarmMsg",
|
||||
"Region": region,
|
||||
"Timestamp": strconv.FormatInt(time.Now().Unix(), 10),
|
||||
"Nonce": strconv.Itoa(rand.Intn(65535)),
|
||||
"SecretId": secretId,
|
||||
"policyId": policyId,
|
||||
"msg": message.Description,
|
||||
}
|
||||
|
||||
keys := make([]string, 0, len(params))
|
||||
for key := range params {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
srcStr := "GETmonitor.api.qcloud.com/v2/index.php?"
|
||||
for _, key := range keys {
|
||||
srcStr += key + "=" + params[key] + "&"
|
||||
}
|
||||
srcStr = srcStr[:len(srcStr)-1]
|
||||
|
||||
h := hmac.New(sha1.New, []byte(secretKey))
|
||||
h.Write([]byte(srcStr))
|
||||
signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
|
||||
|
||||
params["Signature"] = signature
|
||||
|
||||
urlStr := "https://monitor.api.qcloud.com/v2/index.php?" + urlEncode(params)
|
||||
|
||||
client := &http.Client{}
|
||||
req, err := http.NewRequest("GET", urlStr, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var response TencentAlarmResponse
|
||||
err = json.NewDecoder(resp.Body).Decode(&response)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if response.Code != 0 {
|
||||
return errors.New(response.Message)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func urlEncode(params map[string]string) string {
|
||||
var encodedParams []string
|
||||
for key, value := range params {
|
||||
encodedParams = append(encodedParams, url.QueryEscape(key)+"="+url.QueryEscape(value))
|
||||
}
|
||||
return strings.Join(encodedParams, "&")
|
||||
}
|
||||
Reference in New Issue
Block a user