notify.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package service
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/sha256"
  6. "encoding/base64"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/global"
  10. "io/ioutil"
  11. "net/http"
  12. "net/url"
  13. "time"
  14. )
  15. type NotifyService struct {
  16. }
  17. func SendTextMessage(content string) error {
  18. msg := map[string]interface{}{
  19. "msgtype": "text",
  20. "text": map[string]string{
  21. "content": content,
  22. },
  23. //"at": map[string]interface{}{
  24. // "atMobiles": atMobiles,
  25. // "isAtAll": isAtAll,
  26. //},
  27. }
  28. return SendMessage(msg)
  29. }
  30. func SendMessage(msg interface{}) error {
  31. body := bytes.NewBuffer(nil)
  32. err := json.NewEncoder(body).Encode(msg)
  33. if err != nil {
  34. return fmt.Errorf("msg json failed, msg: %v, err: %v", msg, err.Error())
  35. }
  36. value := url.Values{}
  37. value.Set("access_token", global.GlobalConfig.Token)
  38. if global.GlobalConfig.Secret != "" {
  39. t := time.Now().UnixNano() / 1e6
  40. value.Set("timestamp", fmt.Sprintf("%d", t))
  41. value.Set("sign", sign(t, global.GlobalConfig.Secret))
  42. }
  43. request, err := http.NewRequest(http.MethodPost, global.GlobalConfig.Url, body)
  44. if err != nil {
  45. return fmt.Errorf("error request: %v", err.Error())
  46. }
  47. request.URL.RawQuery = value.Encode()
  48. request.Header.Add("Content-Type", "application/json")
  49. res, err := (&http.Client{}).Do(request)
  50. if err != nil {
  51. return fmt.Errorf("send dingTalk message failed, error: %v", err.Error())
  52. }
  53. defer func() { _ = res.Body.Close() }()
  54. result, err := ioutil.ReadAll(res.Body)
  55. if res.StatusCode != 200 {
  56. return fmt.Errorf("send dingTalk message failed, %s", httpError(request, res, result, "http code is not 200"))
  57. }
  58. if err != nil {
  59. return fmt.Errorf("send dingTalk message failed, %s", httpError(request, res, result, err.Error()))
  60. }
  61. type response struct {
  62. ErrCode int `json:"errcode"`
  63. }
  64. var ret response
  65. if err := json.Unmarshal(result, &ret); err != nil {
  66. return fmt.Errorf("send dingTalk message failed, %s", httpError(request, res, result, err.Error()))
  67. }
  68. if ret.ErrCode != 0 {
  69. return fmt.Errorf("send dingTalk message failed, %s", httpError(request, res, result, "errcode is not 0"))
  70. }
  71. return nil
  72. }
  73. func httpError(request *http.Request, response *http.Response, body []byte, error string) string {
  74. return fmt.Sprintf(
  75. "http request failure, error: %s, status code: %d, %s %s, body:\n%s",
  76. error,
  77. response.StatusCode,
  78. request.Method,
  79. request.URL.String(),
  80. string(body),
  81. )
  82. }
  83. func sign(t int64, secret string) string {
  84. strToHash := fmt.Sprintf("%d\n%s", t, secret)
  85. hmac256 := hmac.New(sha256.New, []byte(secret))
  86. hmac256.Write([]byte(strToHash))
  87. data := hmac256.Sum(nil)
  88. return base64.StdEncoding.EncodeToString(data)
  89. }
  90. //@author: [Espoir](https://github.com/nightsimon)
  91. //@function: NotifyController
  92. //@description: 钉钉通知测试
  93. //@return: err error
  94. func (e *NotifyService) Send() (err error) {
  95. err = SendTextMessage("test")
  96. if err != nil {
  97. return err
  98. }
  99. return err
  100. }