dingtalk_robot_node.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 := d.client.Post(d.config.WebHook, "application/json", gjson.New(body))
  49. return d.pool.Add(func() {
  50. if err != nil {
  51. server.Log.Errorf("请求出错%s", err.Error())
  52. return
  53. }
  54. if req != nil && req.Response() != nil {
  55. defer req.Close()
  56. if req.Response().StatusCode == http.StatusOK {
  57. ctx.TellSuccess(message)
  58. }
  59. }
  60. })
  61. }
  62. func (d *DingTalkRobotNode) newBody(message *protocol.Message) (body map[string]interface{}, err error) {
  63. msg := map[string]interface{}{
  64. "content": message.AlarmMessage,
  65. }
  66. body = map[string]interface{}{
  67. "msgtype": "text",
  68. "text": msg,
  69. }
  70. return body, nil
  71. }