-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.go
More file actions
134 lines (110 loc) · 3.1 KB
/
bot.go
File metadata and controls
134 lines (110 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package botclient
import (
"fmt"
"gopkg.in/resty.v1"
"io"
)
const (
sendUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s"
uploadMediaUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=%s&msgtype=file"
Text = "text"
Markdown = "markdown"
Image = "image"
News = "news"
File = "file"
All = "@all"
)
type WxWorkBot struct {
httpClient *resty.Client
key string
}
func New(key string) *WxWorkBot {
return &WxWorkBot{
httpClient: resty.New().SetHeader("User-Agent", "v1.0.0"),
key: key,
}
}
func (bot *WxWorkBot) Send(message Message) error {
var result struct {
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
}
m := &msg{
MessageType: message.GetType(),
}
switch message.GetType() {
case Text:
m.Text = message
case Markdown:
m.Markdown = message
case Image:
m.Image = message
case News:
m.News = message
case File:
m.File = message
default:
return fmt.Errorf("unsupported message type: %s", message.GetType())
}
request := bot.httpClient.NewRequest()
request.SetHeader("Content-Type", "application/json")
request.SetBody(m)
request.SetResult(&result)
response, err := request.Post(fmt.Sprintf(sendUrl, bot.key))
if err != nil {
return err
}
if !response.IsSuccess() {
return fmt.Errorf("send message failed, status code: %s", response.Status())
}
if result.ErrCode != 0 {
return fmt.Errorf("send message failed, err code: %d, err msg: %s", result.ErrCode, result.ErrMsg)
}
return nil
}
func (bot *WxWorkBot) UploadMedia(filepath string) (mediaId string, err error) {
var result struct {
Type string `json:"type"`
MediaId string `json:"media_id"`
CreatedAt string `json:"created_at"`
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
}
request := bot.httpClient.NewRequest()
request.SetFile("media", filepath)
request.SetResult(&result)
response, err := request.Post(fmt.Sprintf(uploadMediaUrl, bot.key))
if err != nil {
return "", err
}
if !response.IsSuccess() {
return "", fmt.Errorf("upload media failed, status code: %s", response.Status())
}
if result.ErrCode != 0 {
return "", fmt.Errorf("upload media failed, err code: %d, err msg: %s", result.ErrCode, result.ErrMsg)
}
return result.MediaId, nil
}
func (bot *WxWorkBot) UploadMediaReader(fileName string, read io.Reader) (mediaId string, err error) {
var result struct {
Type string `json:"type"`
MediaId string `json:"media_id"`
CreatedAt string `json:"created_at"`
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
}
request := bot.httpClient.NewRequest()
request.SetFileReader("media", fileName, read)
request.SetResult(&result)
response, err := request.Post(fmt.Sprintf(uploadMediaUrl, bot.key))
if err != nil {
return "", err
}
if !response.IsSuccess() {
return "", fmt.Errorf("upload media failed, status code: %s", response.Status())
}
if result.ErrCode != 0 {
return "", fmt.Errorf("upload media failed, err code: %d, err msg: %s", result.ErrCode, result.ErrMsg)
}
return result.MediaId, nil
}