1
0

one-bot.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package channel
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "message-pusher/model"
  8. "net/http"
  9. "strconv"
  10. "strings"
  11. )
  12. type oneBotMessageRequest struct {
  13. MessageType string `json:"message_type"`
  14. UserId int64 `json:"user_id"`
  15. GroupId int64 `json:"group_id"`
  16. Message string `json:"message"`
  17. AutoEscape bool `json:"auto_escape"`
  18. }
  19. type oneBotMessageResponse struct {
  20. Message string `json:"message"`
  21. Status string `json:"status"`
  22. RetCode int `json:"retcode"`
  23. }
  24. func SendOneBotMessage(message *model.Message, user *model.User, channel_ *model.Channel) error {
  25. url := fmt.Sprintf("%s/send_msg", channel_.URL)
  26. req := oneBotMessageRequest{
  27. Message: message.Content,
  28. }
  29. if message.Content == "" {
  30. req.Message = message.Description
  31. }
  32. target := channel_.AccountId
  33. if message.To != "" {
  34. target = message.To
  35. }
  36. parts := strings.Split(target, "_")
  37. var idStr string
  38. var type_ string
  39. if len(parts) == 1 {
  40. type_ = "user"
  41. idStr = parts[0]
  42. } else if len(parts) == 2 {
  43. type_ = parts[0]
  44. idStr = parts[1]
  45. } else {
  46. return errors.New("无效的 OneBot 配置")
  47. }
  48. id, _ := strconv.ParseInt(idStr, 10, 64)
  49. if type_ == "user" {
  50. req.UserId = id
  51. req.MessageType = "private"
  52. } else if type_ == "group" {
  53. req.GroupId = id
  54. req.MessageType = "group"
  55. } else {
  56. return errors.New("无效的 OneBot 配置")
  57. }
  58. reqBody, err := json.Marshal(req)
  59. if err != nil {
  60. return err
  61. }
  62. request, _ := http.NewRequest("POST", url, bytes.NewReader(reqBody))
  63. request.Header.Set("Authorization", "Bearer "+channel_.Secret)
  64. request.Header.Set("Content-Type", "application/json")
  65. resp, err := http.DefaultClient.Do(request)
  66. if err != nil {
  67. return err
  68. }
  69. if resp.StatusCode != 200 {
  70. return errors.New(resp.Status)
  71. }
  72. var res oneBotMessageResponse
  73. err = json.NewDecoder(resp.Body).Decode(&res)
  74. if err != nil {
  75. return err
  76. }
  77. if res.RetCode != 0 {
  78. return errors.New(res.Message)
  79. }
  80. return nil
  81. }