message-pusher/channel/tencent-alarm.go

90 lines
2.0 KiB
Go

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, "&")
}