send_wx.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package crontask
  2. import (
  3. "context"
  4. "encoding/json"
  5. "strings"
  6. "time"
  7. "wechat-api/ent"
  8. "wechat-api/ent/messagerecords"
  9. "wechat-api/ent/server"
  10. "wechat-api/ent/wx"
  11. "wechat-api/hook"
  12. "wechat-api/internal/types/payload"
  13. )
  14. func (l *CronTask) sendWx() {
  15. ctx := context.Background()
  16. config :=
  17. `{
  18. "ip": "172.18.41.219",
  19. "number": 10,
  20. "wx_list": [
  21. {
  22. "port": "30001",
  23. "wxid": "wxid_77au928zeb2p12",
  24. "nickname": "百事通"
  25. },
  26. {
  27. "port": "30007",
  28. "wxid": "wxid_edc0mvp188ms22",
  29. "nickname": "爱博闻"
  30. },
  31. {
  32. "port": "30040",
  33. "wxid": "wxid_wupstwe851nb12",
  34. "nickname": "轻马小助手"
  35. }
  36. ]
  37. }`
  38. var p payload.SendWxPayload
  39. if err := json.Unmarshal([]byte(config), &p); err != nil {
  40. l.Logger.Errorf("failed to unmarshal the payload :%v", err)
  41. return
  42. }
  43. // 更新最旧的 p.Number 条 status 值为 1 或 4 的 message_records 记录的 status 为 2
  44. messages, err := l.svcCtx.DB.MessageRecords.Query().
  45. Where(messagerecords.StatusIn(1, 4)).
  46. Order(ent.Asc(messagerecords.FieldCreatedAt)).
  47. Limit(p.Number).
  48. All(ctx)
  49. if err != nil {
  50. l.Logger.Errorf("get messageRecords list failed %v", err)
  51. return
  52. }
  53. startTime := time.Now()
  54. type SendTextMsgReq struct {
  55. Wxid string `json:"wxid"`
  56. Msg string `json:"msg"`
  57. }
  58. type SendFileMsgReq struct {
  59. Wxid string `json:"wxid"`
  60. Filepath string `json:"filepath"`
  61. Diyfilename string `json:"diyfilename"`
  62. }
  63. // 从 Redis 中获取服务器信息(ip, port)
  64. getServerInfo := func(wxid string) (string, error) {
  65. key := "crontask_wx_server_info"
  66. val, _ := l.svcCtx.Rds.HGet(ctx, key, wxid).Result()
  67. //if err != nil {
  68. // return "", err
  69. //}
  70. if val == "" {
  71. wx, err := l.svcCtx.DB.Wx.Query().Where(wx.WxidEQ(wxid)).First(l.ctx)
  72. if err != nil {
  73. l.Logger.Errorf("get wx info failed wxid=%v err=%v", wxid, err)
  74. return "", err
  75. }
  76. server, err := l.svcCtx.DB.Server.Query().Where(server.IDEQ(wx.ServerID)).First(l.ctx)
  77. if err != nil {
  78. l.Logger.Errorf("get server info failed wxid=%v err=%v", wxid, err)
  79. return "", err
  80. }
  81. val = server.PrivateIP + ":" + server.AdminPort + ":" + wx.Port
  82. l.svcCtx.Rds.HSet(ctx, key, wxid, val)
  83. }
  84. return val, nil
  85. }
  86. for _, v := range messages {
  87. serverInfo, _ := getServerInfo(v.BotWxid)
  88. infoArray := strings.Split(serverInfo, ":")
  89. serverIp, adminPort, wxPort := infoArray[0], infoArray[1], infoArray[2]
  90. // 更新 status 值为 2(发送中)
  91. tx, err := l.svcCtx.DB.Tx(l.ctx)
  92. _, err = tx.MessageRecords.UpdateOneID(v.ID).SetStatus(2).Save(ctx)
  93. if err != nil {
  94. l.Logger.Errorf("update messageRecords failed id=%v err=%v", v.ID, err)
  95. continue
  96. }
  97. hookClient := hook.NewHook(serverIp, adminPort, wxPort)
  98. if v.ContentType == 1 {
  99. err = hookClient.SendTextMsg(v.ContactWxid, v.Content)
  100. } else {
  101. err = hookClient.SendPicMsg(v.ContactWxid, v.Content, v.Meta.Filename)
  102. }
  103. if err != nil {
  104. _ = tx.Rollback()
  105. continue
  106. } else {
  107. _, err := tx.MessageRecords.UpdateOneID(v.ID).SetStatus(3).SetSendTime(time.Now()).Save(ctx)
  108. if err != nil {
  109. _ = tx.Rollback()
  110. } else {
  111. _ = tx.Commit()
  112. }
  113. }
  114. time.Sleep(time.Duration(60/p.Number) * time.Second)
  115. }
  116. finishTime := time.Now()
  117. l.Logger.Infof("This process cost %v", finishTime.Sub(startTime).String())
  118. return
  119. }