msg.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. package externalcontact
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // addMsgTemplateURL 创建企业群发
  8. addMsgTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template?access_token=%s"
  9. // getGroupMsgListV2URL 获取群发记录列表
  10. getGroupMsgListV2URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_list_v2?access_token=%s"
  11. // getGroupMsgTaskURL 获取群发成员发送任务列表
  12. getGroupMsgTaskURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_task?access_token=%s"
  13. // getGroupMsgSendResultURL 获取企业群发成员执行结果
  14. getGroupMsgSendResultURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_send_result?access_token=%s"
  15. // sendWelcomeMsgURL 发送新客户欢迎语
  16. sendWelcomeMsgURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg?access_token=%s"
  17. // addGroupWelcomeTemplateURL 添加入群欢迎语素材
  18. addGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/add?access_token=%s"
  19. // editGroupWelcomeTemplateURL 编辑入群欢迎语素材
  20. editGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/edit?access_token=%s"
  21. // getGroupWelcomeTemplateURL 获取入群欢迎语素材
  22. getGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/get?access_token=%s"
  23. // delGroupWelcomeTemplateURL 删除入群欢迎语素材
  24. delGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/del?access_token=%s"
  25. // remindGroupMsgSendURL 提醒成员群发
  26. remindGroupMsgSendURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/remind_groupmsg_send?access_token=%s"
  27. // cancelGroupMsgSendURL 停止企业群发
  28. cancelGroupMsgSendURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/cancel_groupmsg_send?access_token=%s"
  29. )
  30. // AddMsgTemplateRequest 创建企业群发请求
  31. type AddMsgTemplateRequest struct {
  32. ChatType string `json:"chat_type"`
  33. ExternalUserID []string `json:"external_userid"`
  34. Sender string `json:"sender,omitempty"`
  35. Text MsgText `json:"text"`
  36. Attachments []*Attachment `json:"attachments"`
  37. AllowSelect bool `json:"allow_select,omitempty"`
  38. ChatIDList []string `json:"chat_id_list,omitempty"`
  39. TagFilter TagFilter `json:"tag_filter,omitempty"`
  40. }
  41. type (
  42. // TagFilter 标签过滤
  43. TagFilter struct {
  44. GroupList []TagGroupList `json:"group_list"`
  45. }
  46. // TagGroupList 标签组
  47. TagGroupList struct {
  48. TagList []string `json:"tag_list"`
  49. }
  50. )
  51. // MsgText 文本消息
  52. type MsgText struct {
  53. Content string `json:"content"`
  54. }
  55. type (
  56. // Attachment 附件
  57. Attachment struct {
  58. MsgType string `json:"msgtype"`
  59. Image AttachmentImg `json:"image,omitempty"`
  60. Link AttachmentLink `json:"link,omitempty"`
  61. MiniProgram AttachmentMiniProgram `json:"miniprogram,omitempty"`
  62. Video AttachmentVideo `json:"video,omitempty"`
  63. File AttachmentFile `json:"file,omitempty"`
  64. }
  65. // AttachmentImg 图片消息
  66. AttachmentImg struct {
  67. MediaID string `json:"media_id"`
  68. PicURL string `json:"pic_url"`
  69. }
  70. // AttachmentLink 图文消息
  71. AttachmentLink struct {
  72. Title string `json:"title"`
  73. PicURL string `json:"picurl"`
  74. Desc string `json:"desc"`
  75. URL string `json:"url"`
  76. }
  77. // AttachmentMiniProgram 小程序消息
  78. AttachmentMiniProgram struct {
  79. Title string `json:"title"`
  80. PicMediaID string `json:"pic_media_id"`
  81. AppID string `json:"appid"`
  82. Page string `json:"page"`
  83. }
  84. // AttachmentVideo 视频消息
  85. AttachmentVideo struct {
  86. MediaID string `json:"media_id"`
  87. }
  88. // AttachmentFile 文件消息
  89. AttachmentFile struct {
  90. MediaID string `json:"media_id"`
  91. }
  92. )
  93. // AddMsgTemplateResponse 创建企业群发响应
  94. type AddMsgTemplateResponse struct {
  95. util.CommonError
  96. FailList []string `json:"fail_list"`
  97. MsgID string `json:"msgid"`
  98. }
  99. // AddMsgTemplate 创建企业群发
  100. // see https://developer.work.weixin.qq.com/document/path/92135
  101. func (r *Client) AddMsgTemplate(req *AddMsgTemplateRequest) (*AddMsgTemplateResponse, error) {
  102. var (
  103. accessToken string
  104. err error
  105. )
  106. if accessToken, err = r.GetAccessToken(); err != nil {
  107. return nil, err
  108. }
  109. var response []byte
  110. if response, err = util.PostJSON(fmt.Sprintf(addMsgTemplateURL, accessToken), req); err != nil {
  111. return nil, err
  112. }
  113. result := &AddMsgTemplateResponse{}
  114. err = util.DecodeWithError(response, result, "AddMsgTemplate")
  115. return result, err
  116. }
  117. // GetGroupMsgListV2Request 获取群发记录列表请求
  118. type GetGroupMsgListV2Request struct {
  119. ChatType string `json:"chat_type"`
  120. StartTime int64 `json:"start_time"`
  121. EndTime int64 `json:"end_time"`
  122. Creator string `json:"creator,omitempty"`
  123. FilterType int `json:"filter_type"`
  124. Limit int `json:"limit"`
  125. Cursor string `json:"cursor"`
  126. }
  127. // GetGroupMsgListV2Response 获取群发记录列表响应
  128. type GetGroupMsgListV2Response struct {
  129. util.CommonError
  130. NextCursor string `json:"next_cursor"`
  131. GroupMsgList []*GroupMsg `json:"group_msg_list"`
  132. }
  133. // GroupMsg 群发消息
  134. type GroupMsg struct {
  135. MsgID string `json:"msgid"`
  136. Creator string `json:"creator"`
  137. CreateTime int64 `json:"create_time"`
  138. CreateType int `json:"create_type"`
  139. Text MsgText `json:"text"`
  140. Attachments []*Attachment `json:"attachments"`
  141. }
  142. // GetGroupMsgListV2 获取群发记录列表
  143. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E8%AE%B0%E5%BD%95%E5%88%97%E8%A1%A8
  144. func (r *Client) GetGroupMsgListV2(req *GetGroupMsgListV2Request) (*GetGroupMsgListV2Response, error) {
  145. var (
  146. accessToken string
  147. err error
  148. )
  149. if accessToken, err = r.GetAccessToken(); err != nil {
  150. return nil, err
  151. }
  152. var response []byte
  153. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgListV2URL, accessToken), req); err != nil {
  154. return nil, err
  155. }
  156. result := &GetGroupMsgListV2Response{}
  157. err = util.DecodeWithError(response, result, "GetGroupMsgListV2")
  158. return result, err
  159. }
  160. // GetGroupMsgTaskRequest 获取群发成员发送任务列表请求
  161. type GetGroupMsgTaskRequest struct {
  162. MsgID string `json:"msgid"`
  163. Limit int `json:"limit"`
  164. Cursor string `json:"cursor"`
  165. }
  166. // GetGroupMsgTaskResponse 获取群发成员发送任务列表响应
  167. type GetGroupMsgTaskResponse struct {
  168. util.CommonError
  169. NextCursor string `json:"next_cursor"`
  170. TaskList []*Task `json:"task_list"`
  171. }
  172. // Task 获取群发成员发送任务列表任务
  173. type Task struct {
  174. UserID string `json:"userid"`
  175. Status int `json:"status"`
  176. SendTime int `json:"send_time"`
  177. }
  178. // GetGroupMsgTask 获取群发成员发送任务列表
  179. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E5%8F%91%E9%80%81%E4%BB%BB%E5%8A%A1%E5%88%97%E8%A1%A8
  180. func (r *Client) GetGroupMsgTask(req *GetGroupMsgTaskRequest) (*GetGroupMsgTaskResponse, error) {
  181. var (
  182. accessToken string
  183. err error
  184. )
  185. if accessToken, err = r.GetAccessToken(); err != nil {
  186. return nil, err
  187. }
  188. var response []byte
  189. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgTaskURL, accessToken), req); err != nil {
  190. return nil, err
  191. }
  192. result := &GetGroupMsgTaskResponse{}
  193. err = util.DecodeWithError(response, result, "GetGroupMsgTask")
  194. return result, err
  195. }
  196. // GetGroupMsgSendResultRequest 获取企业群发成员执行结果请求
  197. type GetGroupMsgSendResultRequest struct {
  198. MsgID string `json:"msgid"`
  199. UserID string `json:"userid"`
  200. Limit int `json:"limit"`
  201. Cursor string `json:"cursor"`
  202. }
  203. // GetGroupMsgSendResultResponse 获取企业群发成员执行结果响应
  204. type GetGroupMsgSendResultResponse struct {
  205. util.CommonError
  206. NextCursor string `json:"next_cursor"`
  207. SendList []*Send `json:"send_list"`
  208. }
  209. // Send 企业群发成员执行结果
  210. type Send struct {
  211. ExternalUserID string `json:"external_userid"`
  212. ChatID string `json:"chat_id"`
  213. UserID string `json:"userid"`
  214. Status int `json:"status"`
  215. SendTime int `json:"send_time"`
  216. }
  217. // GetGroupMsgSendResult 获取企业群发成员执行结果
  218. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E4%BC%81%E4%B8%9A%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C
  219. func (r *Client) GetGroupMsgSendResult(req *GetGroupMsgSendResultRequest) (*GetGroupMsgSendResultResponse, error) {
  220. var (
  221. accessToken string
  222. err error
  223. )
  224. if accessToken, err = r.GetAccessToken(); err != nil {
  225. return nil, err
  226. }
  227. var response []byte
  228. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgSendResultURL, accessToken), req); err != nil {
  229. return nil, err
  230. }
  231. result := &GetGroupMsgSendResultResponse{}
  232. err = util.DecodeWithError(response, result, "GetGroupMsgSendResult")
  233. return result, err
  234. }
  235. // SendWelcomeMsgRequest 发送新客户欢迎语请求
  236. type SendWelcomeMsgRequest struct {
  237. WelcomeCode string `json:"welcome_code"`
  238. Text MsgText `json:"text"`
  239. Attachments []*Attachment `json:"attachments"`
  240. }
  241. // SendWelcomeMsgResponse 发送新客户欢迎语响应
  242. type SendWelcomeMsgResponse struct {
  243. util.CommonError
  244. }
  245. // SendWelcomeMsg 发送新客户欢迎语
  246. // see https://developer.work.weixin.qq.com/document/path/92137
  247. func (r *Client) SendWelcomeMsg(req *SendWelcomeMsgRequest) error {
  248. var (
  249. accessToken string
  250. err error
  251. )
  252. if accessToken, err = r.GetAccessToken(); err != nil {
  253. return err
  254. }
  255. var response []byte
  256. if response, err = util.PostJSON(fmt.Sprintf(sendWelcomeMsgURL, accessToken), req); err != nil {
  257. return err
  258. }
  259. result := &SendWelcomeMsgResponse{}
  260. return util.DecodeWithError(response, result, "SendWelcomeMsg")
  261. }
  262. // AddGroupWelcomeTemplateRequest 添加入群欢迎语素材请求
  263. type AddGroupWelcomeTemplateRequest struct {
  264. Text MsgText `json:"text"`
  265. Image AttachmentImg `json:"image"`
  266. Link AttachmentLink `json:"link"`
  267. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  268. File AttachmentFile `json:"file"`
  269. Video AttachmentVideo `json:"video"`
  270. AgentID int `json:"agentid"`
  271. Notify int `json:"notify"`
  272. }
  273. // AddGroupWelcomeTemplateResponse 添加入群欢迎语素材响应
  274. type AddGroupWelcomeTemplateResponse struct {
  275. util.CommonError
  276. TemplateID string `json:"template_id"`
  277. }
  278. // AddGroupWelcomeTemplate 添加入群欢迎语素材
  279. // see https://developer.work.weixin.qq.com/document/path/92366#%E6%B7%BB%E5%8A%A0%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  280. func (r *Client) AddGroupWelcomeTemplate(req *AddGroupWelcomeTemplateRequest) (*AddGroupWelcomeTemplateResponse, error) {
  281. var (
  282. accessToken string
  283. err error
  284. )
  285. if accessToken, err = r.GetAccessToken(); err != nil {
  286. return nil, err
  287. }
  288. var response []byte
  289. if response, err = util.PostJSON(fmt.Sprintf(addGroupWelcomeTemplateURL, accessToken), req); err != nil {
  290. return nil, err
  291. }
  292. result := &AddGroupWelcomeTemplateResponse{}
  293. err = util.DecodeWithError(response, result, "AddGroupWelcomeTemplate")
  294. return result, err
  295. }
  296. // EditGroupWelcomeTemplateRequest 编辑入群欢迎语素材请求
  297. type EditGroupWelcomeTemplateRequest struct {
  298. TemplateID string `json:"template_id"`
  299. Text MsgText `json:"text"`
  300. Image AttachmentImg `json:"image"`
  301. Link AttachmentLink `json:"link"`
  302. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  303. File AttachmentFile `json:"file"`
  304. Video AttachmentVideo `json:"video"`
  305. AgentID int `json:"agentid"`
  306. }
  307. // EditGroupWelcomeTemplateResponse 编辑入群欢迎语素材响应
  308. type EditGroupWelcomeTemplateResponse struct {
  309. util.CommonError
  310. }
  311. // EditGroupWelcomeTemplate 编辑入群欢迎语素材
  312. // see https://developer.work.weixin.qq.com/document/path/92366#%E7%BC%96%E8%BE%91%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  313. func (r *Client) EditGroupWelcomeTemplate(req *EditGroupWelcomeTemplateRequest) error {
  314. var (
  315. accessToken string
  316. err error
  317. )
  318. if accessToken, err = r.GetAccessToken(); err != nil {
  319. return err
  320. }
  321. var response []byte
  322. if response, err = util.PostJSON(fmt.Sprintf(editGroupWelcomeTemplateURL, accessToken), req); err != nil {
  323. return err
  324. }
  325. result := &EditGroupWelcomeTemplateResponse{}
  326. return util.DecodeWithError(response, result, "EditGroupWelcomeTemplate")
  327. }
  328. // GetGroupWelcomeTemplateRequest 获取入群欢迎语素材请求
  329. type GetGroupWelcomeTemplateRequest struct {
  330. TemplateID string `json:"template_id"`
  331. }
  332. // GetGroupWelcomeTemplateResponse 获取入群欢迎语素材响应
  333. type GetGroupWelcomeTemplateResponse struct {
  334. util.CommonError
  335. Text MsgText `json:"text"`
  336. Image AttachmentImg `json:"image"`
  337. Link AttachmentLink `json:"link"`
  338. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  339. File AttachmentFile `json:"file"`
  340. Video AttachmentVideo `json:"video"`
  341. }
  342. // GetGroupWelcomeTemplate 获取入群欢迎语素材
  343. // see https://developer.work.weixin.qq.com/document/path/92366#%E8%8E%B7%E5%8F%96%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  344. func (r *Client) GetGroupWelcomeTemplate(req *GetGroupWelcomeTemplateRequest) (*GetGroupWelcomeTemplateResponse, error) {
  345. var (
  346. accessToken string
  347. err error
  348. )
  349. if accessToken, err = r.GetAccessToken(); err != nil {
  350. return nil, err
  351. }
  352. var response []byte
  353. if response, err = util.PostJSON(fmt.Sprintf(getGroupWelcomeTemplateURL, accessToken), req); err != nil {
  354. return nil, err
  355. }
  356. result := &GetGroupWelcomeTemplateResponse{}
  357. err = util.DecodeWithError(response, result, "GetGroupWelcomeTemplate")
  358. return result, err
  359. }
  360. // DelGroupWelcomeTemplateRequest 删除入群欢迎语素材请求
  361. type DelGroupWelcomeTemplateRequest struct {
  362. TemplateID string `json:"template_id"`
  363. AgentID int `json:"agentid"`
  364. }
  365. // DelGroupWelcomeTemplateResponse 删除入群欢迎语素材响应
  366. type DelGroupWelcomeTemplateResponse struct {
  367. util.CommonError
  368. }
  369. // DelGroupWelcomeTemplate 删除入群欢迎语素材
  370. // see https://developer.work.weixin.qq.com/document/path/92366#%E5%88%A0%E9%99%A4%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  371. func (r *Client) DelGroupWelcomeTemplate(req *DelGroupWelcomeTemplateRequest) error {
  372. var (
  373. accessToken string
  374. err error
  375. )
  376. if accessToken, err = r.GetAccessToken(); err != nil {
  377. return err
  378. }
  379. var response []byte
  380. if response, err = util.PostJSON(fmt.Sprintf(delGroupWelcomeTemplateURL, accessToken), req); err != nil {
  381. return err
  382. }
  383. result := &DelGroupWelcomeTemplateResponse{}
  384. return util.DecodeWithError(response, result, "DelGroupWelcomeTemplate")
  385. }
  386. // RemindGroupMsgSendRequest 提醒成员群发请求
  387. type RemindGroupMsgSendRequest struct {
  388. MsgID string `json:"msgid"`
  389. }
  390. // RemindGroupMsgSend 提醒成员群发
  391. // see https://developer.work.weixin.qq.com/document/path/97610
  392. func (r *Client) RemindGroupMsgSend(req *RemindGroupMsgSendRequest) error {
  393. var (
  394. accessToken string
  395. err error
  396. )
  397. if accessToken, err = r.GetAccessToken(); err != nil {
  398. return err
  399. }
  400. var response []byte
  401. if response, err = util.PostJSON(fmt.Sprintf(remindGroupMsgSendURL, accessToken), req); err != nil {
  402. return err
  403. }
  404. return util.DecodeWithCommonError(response, "RemindGroupMsgSend")
  405. }
  406. // CancelGroupMsgSendRequest 停止企业群发请求
  407. type CancelGroupMsgSendRequest struct {
  408. MsgID string `json:"msgid"`
  409. }
  410. // CancelGroupMsgSend 提醒成员群发
  411. // see https://developer.work.weixin.qq.com/document/path/97611
  412. func (r *Client) CancelGroupMsgSend(req *CancelGroupMsgSendRequest) error {
  413. var (
  414. accessToken string
  415. err error
  416. )
  417. if accessToken, err = r.GetAccessToken(); err != nil {
  418. return err
  419. }
  420. var response []byte
  421. if response, err = util.PostJSON(fmt.Sprintf(cancelGroupMsgSendURL, accessToken), req); err != nil {
  422. return err
  423. }
  424. return util.DecodeWithCommonError(response, "CancelGroupMsgSend")
  425. }