dingtalk_robot_node.go 1.9 KB

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