dingtalk_robot_node.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package nodes
  2. import (
  3. "encoding/json"
  4. "github.com/gogf/gf/encoding/gjson"
  5. "github.com/gogf/gf/os/grpool"
  6. "net/http"
  7. "sparrow/pkg/protocol"
  8. "sparrow/pkg/ruleEngine"
  9. "sparrow/pkg/server"
  10. "sparrow/pkg/utils"
  11. "sync"
  12. )
  13. type DingTalkRobotNode struct {
  14. pool *grpool.Pool
  15. config *DingTalkRobotNodeConfig
  16. client *utils.HttpClient
  17. bufPool sync.Pool
  18. }
  19. type DingTalkRobotNodeConfig struct {
  20. WebHook string `json:"webhook"` // webhook
  21. }
  22. func (d *DingTalkRobotNode) Init(ctx ruleEngine.Context, config string) error {
  23. d.pool = grpool.New(10)
  24. if config == "" {
  25. d.config = &DingTalkRobotNodeConfig{
  26. WebHook: "http://localhost:8899/test",
  27. }
  28. } else {
  29. c := new(DingTalkRobotNodeConfig)
  30. err := json.Unmarshal([]byte(config), c)
  31. if err != nil {
  32. return err
  33. }
  34. d.config = c
  35. }
  36. client := utils.NewHttpClient()
  37. client.SetLogger(server.Log)
  38. d.client = client
  39. return nil
  40. }
  41. func (d *DingTalkRobotNode) OnMessage(ctx ruleEngine.Context, message *protocol.Message) error {
  42. body, err := d.newBody(message)
  43. if body == nil {
  44. return nil
  45. } else if err != nil {
  46. return err
  47. }
  48. req, err := utils.NewRequest("POST", d.config.WebHook, gjson.New(body))
  49. if err != nil {
  50. server.Log.Error(err)
  51. return err
  52. }
  53. req.Header.Add("Content-Type", "application/json")
  54. return d.pool.Add(func() {
  55. res, err := d.client.Do(req)
  56. if err != nil {
  57. server.Log.Errorf("请求出错%s", err.Error())
  58. return
  59. }
  60. if res != nil && res.Response() != nil {
  61. defer res.Close()
  62. if res.Response().StatusCode == http.StatusOK {
  63. ctx.TellSuccess(message)
  64. }
  65. }
  66. })
  67. }
  68. func (d *DingTalkRobotNode) newBody(message *protocol.Message) (body map[string]interface{}, err error) {
  69. msg := map[string]interface{}{
  70. "content": message.AlarmMessage,
  71. }
  72. body = map[string]interface{}{
  73. "msgtype": "text",
  74. "text": msg,
  75. }
  76. return body, nil
  77. }