contact.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. package hook
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gorilla/websocket"
  6. "github.com/zeromicro/go-zero/core/logx"
  7. "strings"
  8. "wechat-api/workphone"
  9. "wechat-api/workphone/wecom"
  10. )
  11. // 获取标签信息
  12. func (h *Hook) GetContactLabelList() (result GetContactLabelListReap, err error) {
  13. resp, err := h.Client.R().SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/GetContactLabelList")
  14. if err != nil {
  15. return
  16. }
  17. if !resp.IsSuccessState() {
  18. err = fmt.Errorf("GetContactLabelList failed with status code %d", resp.StatusCode)
  19. return
  20. }
  21. return
  22. }
  23. // 获取好友和群信息
  24. func (h *Hook) GetFriendAndChatRoomList(typeStr string) (result GetFriendAndChatRoomListReap, err error) {
  25. resp, err := h.Client.R().SetBody(&GetFriendAndChatRoomListReq{
  26. Type: typeStr,
  27. }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/GetFriendAndChatRoomList")
  28. if err != nil {
  29. return
  30. }
  31. if !resp.IsSuccessState() {
  32. err = fmt.Errorf("GetFriendAndChatRoomList failed with status code %d", resp.StatusCode)
  33. return
  34. }
  35. return
  36. }
  37. // 批量获取联系人简明信息(每次100个)
  38. func (h *Hook) BatchGetContactBriefInfo(wxids []string) (result BatchGetContactBriefInfoReap, err error) {
  39. wxidList := strings.Join(wxids, ",")
  40. resp, err := h.Client.R().SetBody(&BatchGetContactBriefInfoReq{
  41. WxidList: wxidList,
  42. }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/BatchGetContactBriefInfo")
  43. if err != nil {
  44. return
  45. }
  46. if !resp.IsSuccessState() {
  47. err = fmt.Errorf("BatchGetChatRoomMemberWxid failed with status code %d", resp.StatusCode)
  48. return
  49. }
  50. return
  51. }
  52. // 添加新的好友
  53. func (h *Hook) AddNewFriend(v3_wxid string, v4 string, desc string, addType string, role string) (result AddNewFriendReap, err error) {
  54. resp, err := h.Client.R().SetBody(&AddNewFriendReq{
  55. V3Wxid: v3_wxid,
  56. V4: v4,
  57. Desc: desc,
  58. AddType: addType,
  59. Role: role,
  60. }).SetSuccessResult(&result).Post("http://" + h.ServerIp + ":" + h.WxPort + "/AddNewFriend")
  61. if err != nil {
  62. return
  63. }
  64. if !resp.IsSuccessState() {
  65. err = fmt.Errorf("AddNewFriend failed with status code %d", resp.StatusCode)
  66. return
  67. }
  68. return
  69. }
  70. func (h *Hook) RequestChatRoomInfo(ChatRoomId, wxWxid string) error {
  71. conn, err := h.connWorkPhone()
  72. if err != nil {
  73. err = fmt.Errorf("RequestChatRoomInfo failed")
  74. return err
  75. }
  76. defer func(conn *websocket.Conn) {
  77. err = conn.Close()
  78. if err != nil {
  79. err = fmt.Errorf("RequestChatRoomInfo failed")
  80. }
  81. }(conn)
  82. message := map[string]interface{}{
  83. "MsgType": "RequestChatRoomInfoTask",
  84. "Content": map[string]interface{}{
  85. "WeChatId": wxWxid,
  86. "Flag": 1,
  87. "ChatRoomId": ChatRoomId,
  88. },
  89. }
  90. transportMessageJSON, err := json.Marshal(message)
  91. if err != nil {
  92. return err
  93. }
  94. // 发送 JSON 消息
  95. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  96. if err != nil {
  97. return fmt.Errorf("failed to send message: %v", err)
  98. }
  99. return nil
  100. }
  101. func (h *Hook) TriggerChatroomPush(wxWxid string) error {
  102. conn, err := h.connWorkPhone()
  103. if err != nil {
  104. err = fmt.Errorf("TriggerChatroomPush failed")
  105. return err
  106. }
  107. defer func(conn *websocket.Conn) {
  108. err = conn.Close()
  109. if err != nil {
  110. err = fmt.Errorf("TriggerChatroomPush failed")
  111. }
  112. }(conn)
  113. message := map[string]interface{}{
  114. "MsgType": "TriggerChatroomPushTask",
  115. "Content": map[string]interface{}{
  116. "WeChatId": wxWxid,
  117. "Flag": 1,
  118. },
  119. }
  120. transportMessageJSON, err := json.Marshal(message)
  121. if err != nil {
  122. return err
  123. }
  124. // 发送 JSON 消息
  125. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  126. if err != nil {
  127. return fmt.Errorf("failed to send message: %v", err)
  128. }
  129. return nil
  130. }
  131. // TriggerCustomerPushTask 刷新企微联系人
  132. func (h *Hook) TriggerCustomerPushTask(wxWxid string) error {
  133. conn, err := h.connWorkPhone()
  134. if err != nil {
  135. err = fmt.Errorf("TriggerCustomerPushTask failed")
  136. return err
  137. }
  138. defer func(conn *websocket.Conn) {
  139. err = conn.Close()
  140. if err != nil {
  141. err = fmt.Errorf("TriggerCustomerPushTask failed")
  142. }
  143. }(conn)
  144. message := map[string]interface{}{
  145. "MsgType": "TriggerCustomerPushTask",
  146. "Content": map[string]interface{}{
  147. "WxId": wxWxid,
  148. },
  149. }
  150. transportMessageJSON, err := json.Marshal(message)
  151. if err != nil {
  152. return err
  153. }
  154. // 发送 JSON 消息
  155. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  156. if err != nil {
  157. return fmt.Errorf("failed to send message: %v", err)
  158. }
  159. return nil
  160. }
  161. // TriggerConversationPushTask 刷新企微群组
  162. func (h *Hook) TriggerConversationPushTask(wxWxid string) error {
  163. conn, err := h.connWorkPhone()
  164. if err != nil {
  165. err = fmt.Errorf("TriggerConversationPushTask failed")
  166. return err
  167. }
  168. defer func(conn *websocket.Conn) {
  169. err = conn.Close()
  170. if err != nil {
  171. err = fmt.Errorf("TriggerConversationPushTask failed")
  172. }
  173. }(conn)
  174. message := map[string]interface{}{
  175. "MsgType": "TriggerConversationPushTask",
  176. "Content": map[string]interface{}{
  177. "WxId": wxWxid,
  178. },
  179. }
  180. transportMessageJSON, err := json.Marshal(message)
  181. if err != nil {
  182. return err
  183. }
  184. // 发送 JSON 消息
  185. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  186. if err != nil {
  187. return fmt.Errorf("failed to send message: %v", err)
  188. }
  189. return nil
  190. }
  191. func (h *Hook) TriggerUserLabelTask(wxWxid string) error {
  192. conn, err := h.connWorkPhone()
  193. if err != nil {
  194. err = fmt.Errorf("TriggerUserLabelTask failed")
  195. return err
  196. }
  197. defer func(conn *websocket.Conn) {
  198. err = conn.Close()
  199. if err != nil {
  200. err = fmt.Errorf("TriggerUserLabelTask failed")
  201. }
  202. }(conn)
  203. message := map[string]interface{}{
  204. "MsgType": "TriggerUserLabelTask",
  205. "Content": map[string]interface{}{
  206. "WxId": wxWxid,
  207. },
  208. }
  209. transportMessageJSON, err := json.Marshal(message)
  210. if err != nil {
  211. return err
  212. }
  213. // 发送 JSON 消息
  214. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  215. if err != nil {
  216. return fmt.Errorf("failed to send message: %v", err)
  217. }
  218. return nil
  219. }
  220. func (h *Hook) TriggerContactPushTask(wxWxid string) error {
  221. conn, err := h.connWorkPhone()
  222. if err != nil {
  223. err = fmt.Errorf("TriggerContactPushTask failed")
  224. return err
  225. }
  226. defer func(conn *websocket.Conn) {
  227. err = conn.Close()
  228. if err != nil {
  229. err = fmt.Errorf("TriggerContactPushTask failed")
  230. }
  231. }(conn)
  232. message := map[string]interface{}{
  233. "MsgType": "TriggerContactPushTask",
  234. "Content": map[string]interface{}{
  235. "WxId": wxWxid,
  236. },
  237. }
  238. transportMessageJSON, err := json.Marshal(message)
  239. if err != nil {
  240. return err
  241. }
  242. // 发送 JSON 消息
  243. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  244. if err != nil {
  245. return fmt.Errorf("failed to send message: %v", err)
  246. }
  247. return nil
  248. }
  249. func (h *Hook) AddFriendInChatRoom(ChatRoomId, wxWxid, friendId, desc string) error {
  250. conn, err := h.connWorkPhone()
  251. if err != nil {
  252. err = fmt.Errorf("AddFriendInChatRoom failed")
  253. return err
  254. }
  255. defer func(conn *websocket.Conn) {
  256. err = conn.Close()
  257. if err != nil {
  258. err = fmt.Errorf("AddFriendInChatRoom failed")
  259. }
  260. }(conn)
  261. message := map[string]interface{}{
  262. "MsgType": "AddFriendInChatRoomTask",
  263. "Content": map[string]interface{}{
  264. "WeChatId": wxWxid,
  265. "ChatroomId": ChatRoomId,
  266. "FriendId": friendId,
  267. "Message": desc,
  268. },
  269. }
  270. transportMessageJSON, err := json.Marshal(message)
  271. if err != nil {
  272. return err
  273. }
  274. // 发送 JSON 消息
  275. err = conn.WriteMessage(websocket.TextMessage, transportMessageJSON)
  276. if err != nil {
  277. return fmt.Errorf("failed to send message: %v", err)
  278. }
  279. return nil
  280. }
  281. // AddFriendsTask AddFriendTask 用于添加好友任务的消息结构
  282. type AddFriendsTask struct {
  283. WeChatId string `json:"WeChatId"`
  284. Phones []string `json:"Phones"`
  285. Message string `json:"message"`
  286. Remark string `json:"Remark"`
  287. TaskId int64 `json:"TaskId"`
  288. }
  289. // FindContactTask 用于查找联系人任务的消息结构
  290. type FindContactTask struct {
  291. WeChatId string `json:"WeChatId"`
  292. Content string `json:"Content"`
  293. }
  294. // MessagePayload 用于封装消息的负载结构
  295. type MessagePayload[T any] struct {
  296. Id workphone.EnumMsgType `json:"Id"`
  297. MsgType string `json:"MsgType"`
  298. Content T `json:"Content"`
  299. }
  300. // SendMessage 函数用于发送消息
  301. func SendMessage[T any](hook *Hook, msgType workphone.EnumMsgType, msgTypeStr string, content T) (map[string]interface{}, error) {
  302. conn, err := hook.connWorkPhone()
  303. if err != nil {
  304. logx.Errorf("WebSocket 连接失败: %v", err)
  305. return MessagePayload[T]{}.ToMap(), err
  306. }
  307. defer func() {
  308. if cerr := conn.Close(); cerr != nil {
  309. logx.Errorf("WebSocket 关闭失败: %v", cerr)
  310. }
  311. }()
  312. message := MessagePayload[T]{
  313. Id: msgType,
  314. MsgType: msgTypeStr,
  315. Content: content,
  316. }
  317. data, err := json.Marshal(message)
  318. if err != nil {
  319. return message.ToMap(), fmt.Errorf("JSON 序列化失败: %w", err)
  320. }
  321. if err := conn.WriteMessage(websocket.TextMessage, data); err != nil {
  322. return message.ToMap(), fmt.Errorf("发送消息失败: %w", err)
  323. }
  324. return message.ToMap(), nil
  325. }
  326. // AddFriendTask 函数用于创建并发送一个添加好友的任务
  327. // 参数:
  328. //
  329. // ownerWxId: 发起添加好友请求的微信ID
  330. // phone: 目标手机号
  331. // msg: 添加好友时附带的消息
  332. // taskId: 任务ID
  333. //
  334. // 返回值:
  335. //
  336. // 成功时返回包含添加好友任务信息的消息负载和nil错误
  337. // 失败时返回空的消息负载和相应的错误
  338. func (h *Hook) AddFriendTask(ownerWxId, phone, msg string, taskId int64) (map[string]interface{}, error) {
  339. if ownerWxId == "" || phone == "" || msg == "" {
  340. return MessagePayload[AddFriendsTask]{}.ToMap(), fmt.Errorf("invalid input parameters")
  341. }
  342. content := AddFriendsTask{
  343. WeChatId: ownerWxId,
  344. Phones: []string{phone},
  345. Message: msg,
  346. Remark: "",
  347. TaskId: taskId,
  348. }
  349. return SendMessage(h, workphone.EnumMsgType_AddFriendsTask, "AddFriendsTask", content)
  350. }
  351. // FindContactByContent 函数用于创建并发送一个查找联系人的任务
  352. // 参数:
  353. //
  354. // ownerWxId: 发起查找联系人请求的微信ID
  355. // contentMessage: 查找联系人的查询内容
  356. //
  357. // 返回值:
  358. //
  359. // 成功时返回包含查找联系人任务信息的消息负载和nil错误
  360. // 失败时返回空的消息负载和相应的错误
  361. func (h *Hook) FindContactByContent(ownerWxId, contentMessage string) (map[string]interface{}, error) {
  362. if ownerWxId == "" || contentMessage == "" {
  363. return MessagePayload[FindContactTask]{}.ToMap(), fmt.Errorf("invalid input parameters")
  364. }
  365. content := FindContactTask{
  366. WeChatId: ownerWxId,
  367. Content: contentMessage,
  368. }
  369. return SendMessage(h, workphone.EnumMsgType_FindContactTask, "FindContactTask", content)
  370. }
  371. func (m MessagePayload[T]) ToMap() map[string]interface{} {
  372. return map[string]interface{}{
  373. "Id": m.Id,
  374. "MsgType": m.MsgType,
  375. "Content": m.Content,
  376. }
  377. }
  378. // AddWecomCustomerFromSearchTask 函数用于创建并发送一个添加好友的任务
  379. // 参数:
  380. //
  381. // ownerWxId: 发起添加好友请求的微信ID
  382. // phone: 目标手机号 //qq号//微信id
  383. // msg: 添加好友时附带的消息
  384. // taskId: 任务ID
  385. //
  386. // 返回值:
  387. //
  388. // 成功时返回包含添加好友任务信息的消息负载和nil错误
  389. // 失败时返回空的消息负载和相应的错误
  390. func (h *Hook) AddWecomCustomerFromSearchTask(ownerWxId, phone, msg string, taskId int64) (map[string]interface{}, error) {
  391. if ownerWxId == "" || phone == "" {
  392. return MessagePayload[AddWecomCustomerFromSearchTask]{}.ToMap(), fmt.Errorf("invalid input parameters")
  393. }
  394. content := AddWecomCustomerFromSearchTask{
  395. WxId: ownerWxId,
  396. Key: phone,
  397. Msg: msg,
  398. Memo: "",
  399. TaskId: taskId,
  400. Labels: []string{0: ""},
  401. }
  402. return SendMessage(h, workphone.EnumMsgType(wecom.EnumMsgType_AddCustomerFromSearchTask), "AddCustomerFromSearchTask", content)
  403. }
  404. // AddWecomCustomerFromSearchTask 用于添加好友任务的消息结构
  405. type AddWecomCustomerFromSearchTask struct {
  406. WxId string `json:"WxId"`
  407. Key string `json:"Key"`
  408. Msg string `json:"Msg"`
  409. Memo string `json:"Memo"`
  410. TaskId int64 `json:"TaskId"`
  411. Labels []string `json:"Labels"`
  412. }