wcf.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. package wcf
  2. import (
  3. logs "github.com/danbai225/go-logs"
  4. "go.nanomsg.org/mangos/v3"
  5. "go.nanomsg.org/mangos/v3/protocol"
  6. "go.nanomsg.org/mangos/v3/protocol/pair1"
  7. _ "go.nanomsg.org/mangos/v3/transport/all"
  8. "google.golang.org/protobuf/proto"
  9. "strconv"
  10. "strings"
  11. )
  12. type Client struct {
  13. add string
  14. socket protocol.Socket
  15. RecvTxt bool
  16. ContactsMap []map[string]string
  17. MessageCallbackUrl string
  18. }
  19. func (c *Client) conn() error {
  20. socket, err := pair1.NewSocket()
  21. if err != nil {
  22. return err
  23. }
  24. err = socket.Dial(c.add)
  25. if err != nil {
  26. return err
  27. }
  28. c.socket = socket
  29. return err
  30. }
  31. func (c *Client) send(data []byte) error {
  32. return c.socket.Send(data)
  33. }
  34. func (c *Client) Recv() (*Response, error) {
  35. msg := &Response{}
  36. recv, err := c.socket.Recv()
  37. if err != nil {
  38. return msg, err
  39. }
  40. err = proto.Unmarshal(recv, msg)
  41. return msg, err
  42. }
  43. // Close 退出
  44. func (c *Client) Close() error {
  45. c.DisableRecvTxt()
  46. return c.socket.Close()
  47. }
  48. // IsLogin 查看是否登录
  49. func (c *Client) IsLogin() bool {
  50. err := c.send(genFunReq(Functions_FUNC_IS_LOGIN).build())
  51. if err != nil {
  52. logs.Err(err)
  53. }
  54. recv, err := c.Recv()
  55. if err != nil {
  56. logs.Err(err)
  57. }
  58. if recv.GetStatus() == 1 {
  59. return true
  60. }
  61. return false
  62. }
  63. // GetSelfWXID 获取登录的id
  64. func (c *Client) GetSelfWXID() string {
  65. err := c.send(genFunReq(Functions_FUNC_GET_SELF_WXID).build())
  66. if err != nil {
  67. logs.Err(err)
  68. }
  69. recv, err := c.Recv()
  70. if err != nil {
  71. logs.Err(err)
  72. }
  73. return recv.GetStr()
  74. }
  75. // GetMsgTypes 获取消息类型
  76. func (c *Client) GetMsgTypes() map[int32]string {
  77. err := c.send(genFunReq(Functions_FUNC_GET_MSG_TYPES).build())
  78. if err != nil {
  79. logs.Err(err)
  80. }
  81. recv, err := c.Recv()
  82. if err != nil {
  83. logs.Err(err)
  84. }
  85. return recv.GetTypes().GetTypes()
  86. }
  87. // GetContacts 获取通讯录
  88. func (c *Client) GetContacts() []*RpcContact {
  89. err := c.send(genFunReq(Functions_FUNC_GET_CONTACTS).build())
  90. if err != nil {
  91. logs.Err(err)
  92. }
  93. recv, err := c.Recv()
  94. if err != nil {
  95. logs.Err(err)
  96. }
  97. return recv.GetContacts().GetContacts()
  98. }
  99. // GetDBNames 获取数据库名
  100. func (c *Client) GetDBNames() []string {
  101. err := c.send(genFunReq(Functions_FUNC_GET_DB_NAMES).build())
  102. if err != nil {
  103. logs.Err(err)
  104. }
  105. recv, err := c.Recv()
  106. if err != nil {
  107. logs.Err(err)
  108. }
  109. return recv.GetDbs().Names
  110. }
  111. // GetDBTables 获取表
  112. func (c *Client) GetDBTables(tab string) []*DbTable {
  113. req := genFunReq(Functions_FUNC_GET_DB_TABLES)
  114. str := &Request_Str{Str: tab}
  115. req.Msg = str
  116. err := c.send(req.build())
  117. if err != nil {
  118. logs.Err(err)
  119. }
  120. recv, err := c.Recv()
  121. if err != nil {
  122. logs.Err(err)
  123. }
  124. return recv.GetTables().GetTables()
  125. }
  126. // ExecDBQuery 执行sql
  127. func (c *Client) ExecDBQuery(db, sql string) []*DbRow {
  128. req := genFunReq(Functions_FUNC_EXEC_DB_QUERY)
  129. q := Request_Query{
  130. Query: &DbQuery{
  131. Db: db,
  132. Sql: sql,
  133. },
  134. }
  135. req.Msg = &q
  136. err := c.send(req.build())
  137. if err != nil {
  138. logs.Err(err)
  139. }
  140. recv, err := c.Recv()
  141. if err != nil {
  142. logs.Err(err)
  143. }
  144. return recv.GetRows().GetRows()
  145. }
  146. // AcceptFriend 接收好友请求
  147. func (c *Client) AcceptFriend(v3, v4 string, scene int32) int32 {
  148. req := genFunReq(Functions_FUNC_ACCEPT_FRIEND)
  149. q := Request_V{
  150. V: &Verification{
  151. V3: v3,
  152. V4: v4,
  153. Scene: scene,
  154. }}
  155. req.Msg = &q
  156. err := c.send(req.build())
  157. if err != nil {
  158. logs.Err(err)
  159. }
  160. recv, err := c.Recv()
  161. if err != nil {
  162. logs.Err(err)
  163. }
  164. return recv.GetStatus()
  165. }
  166. func (c *Client) AddChatroomMembers(roomID, wxIDs string) int32 {
  167. req := genFunReq(Functions_FUNC_ADD_ROOM_MEMBERS)
  168. q := Request_M{
  169. M: &MemberMgmt{Roomid: roomID, Wxids: wxIDs},
  170. }
  171. req.Msg = &q
  172. err := c.send(req.build())
  173. if err != nil {
  174. logs.Err(err)
  175. }
  176. recv, err := c.Recv()
  177. if err != nil {
  178. logs.Err(err)
  179. }
  180. return recv.GetStatus()
  181. }
  182. // ReceiveTransfer 接收转账
  183. func (c *Client) ReceiveTransfer(wxid, tfid, taid string) int32 {
  184. req := genFunReq(Functions_FUNC_RECV_TRANSFER)
  185. q := Request_Tf{
  186. Tf: &Transfer{
  187. Wxid: wxid,
  188. Tfid: tfid,
  189. Taid: taid,
  190. },
  191. }
  192. req.Msg = &q
  193. err := c.send(req.build())
  194. if err != nil {
  195. logs.Err(err)
  196. }
  197. recv, err := c.Recv()
  198. if err != nil {
  199. logs.Err(err)
  200. }
  201. return recv.GetStatus()
  202. }
  203. // RefreshPYQ 刷新朋友圈
  204. func (c *Client) RefreshPYQ() int32 {
  205. req := genFunReq(Functions_FUNC_REFRESH_PYQ)
  206. q := Request_Ui64{
  207. Ui64: 0,
  208. }
  209. req.Msg = &q
  210. err := c.send(req.build())
  211. if err != nil {
  212. logs.Err(err)
  213. }
  214. recv, err := c.Recv()
  215. if err != nil {
  216. logs.Err(err)
  217. }
  218. return recv.GetStatus()
  219. }
  220. // DecryptImage 解密图片 加密路径,解密路径
  221. func (c *Client) DecryptImage(src, dst string) string {
  222. req := genFunReq(Functions_FUNC_DECRYPT_IMAGE)
  223. q := Request_Dec{
  224. Dec: &DecPath{Src: src, Dst: dst},
  225. }
  226. req.Msg = &q
  227. err := c.send(req.build())
  228. if err != nil {
  229. logs.Err(err)
  230. }
  231. recv, err := c.Recv()
  232. if err != nil {
  233. logs.Err(err)
  234. }
  235. return recv.String()
  236. }
  237. // AddChatRoomMembers 添加群成员
  238. func (c *Client) AddChatRoomMembers(roomId string, wxIds []string) int32 {
  239. req := genFunReq(Functions_FUNC_ADD_ROOM_MEMBERS)
  240. q := Request_M{
  241. M: &MemberMgmt{Roomid: roomId,
  242. Wxids: strings.Join(wxIds, ",")},
  243. }
  244. req.Msg = &q
  245. err := c.send(req.build())
  246. if err != nil {
  247. logs.Err(err)
  248. }
  249. recv, err := c.Recv()
  250. if err != nil {
  251. logs.Err(err)
  252. }
  253. return recv.GetStatus()
  254. }
  255. // InvChatRoomMembers 邀请群成员
  256. func (c *Client) InvChatRoomMembers(roomId string, wxIds []string) int32 {
  257. req := genFunReq(Functions_FUNC_INV_ROOM_MEMBERS)
  258. q := Request_M{
  259. M: &MemberMgmt{Roomid: roomId,
  260. Wxids: strings.Join(wxIds, ",")},
  261. }
  262. req.Msg = &q
  263. err := c.send(req.build())
  264. if err != nil {
  265. logs.Err(err)
  266. }
  267. recv, err := c.Recv()
  268. if err != nil {
  269. logs.Err(err)
  270. }
  271. return recv.GetStatus()
  272. }
  273. // DelChatRoomMembers 删除群成员
  274. func (c *Client) DelChatRoomMembers(roomId string, wxIds []string) int32 {
  275. req := genFunReq(Functions_FUNC_DEL_ROOM_MEMBERS)
  276. q := Request_M{
  277. M: &MemberMgmt{Roomid: roomId,
  278. Wxids: strings.Join(wxIds, ",")},
  279. }
  280. req.Msg = &q
  281. err := c.send(req.build())
  282. if err != nil {
  283. logs.Err(err)
  284. }
  285. recv, err := c.Recv()
  286. if err != nil {
  287. logs.Err(err)
  288. }
  289. return recv.GetStatus()
  290. }
  291. // GetUserInfo 获取自己的信息
  292. func (c *Client) GetUserInfo() *UserInfo {
  293. err := c.send(genFunReq(Functions_FUNC_GET_USER_INFO).build())
  294. if err != nil {
  295. logs.Err(err)
  296. }
  297. recv, err := c.Recv()
  298. if err != nil {
  299. logs.Err(err)
  300. }
  301. return recv.GetUi()
  302. }
  303. // SendTxt 发送文本内容
  304. func (c *Client) SendTxt(msg string, receiver string, ates []string) int32 {
  305. req := genFunReq(Functions_FUNC_SEND_TXT)
  306. req.Msg = &Request_Txt{
  307. Txt: &TextMsg{
  308. Msg: msg,
  309. Receiver: receiver,
  310. Aters: strings.Join(ates, ","),
  311. },
  312. }
  313. err := c.send(req.build())
  314. if err != nil {
  315. logs.Err(err)
  316. }
  317. recv, err := c.Recv()
  318. if err != nil {
  319. logs.Err(err)
  320. }
  321. return recv.GetStatus()
  322. }
  323. // ForwardMsg 转发消息
  324. func (c *Client) ForwardMsg(Id uint64, receiver string) int32 {
  325. req := genFunReq(Functions_FUNC_FORWARD_MSG)
  326. req.Msg = &Request_Fm{
  327. Fm: &ForwardMsg{
  328. Id: Id,
  329. Receiver: receiver,
  330. },
  331. }
  332. err := c.send(req.build())
  333. if err != nil {
  334. logs.Err(err)
  335. }
  336. recv, err := c.Recv()
  337. if err != nil {
  338. logs.Err(err)
  339. }
  340. return recv.GetStatus()
  341. }
  342. // SendIMG 发送图片
  343. func (c *Client) SendIMG(path string, receiver string) int32 {
  344. req := genFunReq(Functions_FUNC_SEND_IMG)
  345. req.Msg = &Request_File{
  346. File: &PathMsg{
  347. Path: path,
  348. Receiver: receiver,
  349. },
  350. }
  351. err := c.send(req.build())
  352. if err != nil {
  353. logs.Err(err)
  354. }
  355. recv, err := c.Recv()
  356. if err != nil {
  357. logs.Err(err)
  358. }
  359. return recv.GetStatus()
  360. }
  361. // SendFile 发送文件
  362. func (c *Client) SendFile(path string, receiver string) int32 {
  363. req := genFunReq(Functions_FUNC_SEND_FILE)
  364. req.Msg = &Request_File{
  365. File: &PathMsg{
  366. Path: path,
  367. Receiver: receiver,
  368. },
  369. }
  370. err := c.send(req.build())
  371. if err != nil {
  372. logs.Err(err)
  373. }
  374. recv, err := c.Recv()
  375. if err != nil {
  376. logs.Err(err)
  377. }
  378. return recv.GetStatus()
  379. }
  380. // SendRichText 发送卡片消息
  381. func (c *Client) SendRichText(name string, account string, title string, digest string, url string, thumburl string, receiver string) int32 {
  382. req := genFunReq(Functions_FUNC_SEND_RICH_TXT)
  383. req.Msg = &Request_Rt{
  384. Rt: &RichText{
  385. Name: name,
  386. Account: account,
  387. Title: title,
  388. Digest: digest,
  389. Url: url,
  390. Thumburl: thumburl,
  391. Receiver: receiver,
  392. },
  393. }
  394. err := c.send(req.build())
  395. if err != nil {
  396. logs.Err(err)
  397. }
  398. recv, err := c.Recv()
  399. if err != nil {
  400. logs.Err(err)
  401. }
  402. return recv.GetStatus()
  403. }
  404. // SendXml 发送xml数据
  405. func (c *Client) SendXml(path, content, receiver string, Type int32) int32 {
  406. req := genFunReq(Functions_FUNC_SEND_XML)
  407. req.Msg = &Request_Xml{
  408. Xml: &XmlMsg{
  409. Receiver: receiver,
  410. Content: content,
  411. Path: path,
  412. Type: Type,
  413. },
  414. }
  415. err := c.send(req.build())
  416. if err != nil {
  417. logs.Err(err)
  418. }
  419. recv, err := c.Recv()
  420. if err != nil {
  421. logs.Err(err)
  422. }
  423. return recv.GetStatus()
  424. }
  425. // SendEmotion 发送emoji
  426. func (c *Client) SendEmotion(path, receiver string) int32 {
  427. req := genFunReq(Functions_FUNC_SEND_EMOTION)
  428. req.Msg = &Request_File{
  429. File: &PathMsg{
  430. Path: path,
  431. Receiver: receiver,
  432. },
  433. }
  434. err := c.send(req.build())
  435. if err != nil {
  436. logs.Err(err)
  437. }
  438. recv, err := c.Recv()
  439. if err != nil {
  440. logs.Err(err)
  441. }
  442. return recv.GetStatus()
  443. }
  444. // SendPat 发送拍一拍消息
  445. func (c *Client) SendPat(roomId, wxId string) int32 {
  446. req := genFunReq(Functions_FUNC_SEND_PAT_MSG)
  447. req.Msg = &Request_Pm{
  448. Pm: &PatMsg{
  449. Roomid: roomId,
  450. Wxid: wxId,
  451. },
  452. }
  453. err := c.send(req.build())
  454. if err != nil {
  455. logs.Err(err)
  456. }
  457. recv, err := c.Recv()
  458. if err != nil {
  459. logs.Err(err)
  460. }
  461. return recv.GetStatus()
  462. }
  463. // DownloadAttach 下载附件
  464. func (c *Client) DownloadAttach(id uint64, thumb, extra string) int32 {
  465. req := genFunReq(Functions_FUNC_SEND_PAT_MSG)
  466. req.Msg = &Request_Att{
  467. Att: &AttachMsg{
  468. Id: id,
  469. Thumb: thumb,
  470. Extra: extra,
  471. },
  472. }
  473. err := c.send(req.build())
  474. if err != nil {
  475. logs.Err(err)
  476. }
  477. recv, err := c.Recv()
  478. if err != nil {
  479. logs.Err(err)
  480. }
  481. return recv.GetStatus()
  482. }
  483. // EnableRecvTxt 开启接收数据
  484. func (c *Client) EnableRecvTxt() int32 {
  485. req := genFunReq(Functions_FUNC_ENABLE_RECV_TXT)
  486. req.Msg = &Request_Flag{
  487. Flag: true,
  488. }
  489. err := c.send(req.build())
  490. if err != nil {
  491. logs.Err(err)
  492. }
  493. recv, err := c.Recv()
  494. if err != nil {
  495. logs.Err(err)
  496. }
  497. c.RecvTxt = true
  498. return recv.GetStatus()
  499. }
  500. // DisableRecvTxt 关闭接收消息
  501. func (c *Client) DisableRecvTxt() int32 {
  502. err := c.send(genFunReq(Functions_FUNC_DISABLE_RECV_TXT).build())
  503. if err != nil {
  504. logs.Err(err)
  505. }
  506. recv, err := c.Recv()
  507. if err != nil {
  508. logs.Err(err)
  509. }
  510. c.RecvTxt = false
  511. return recv.GetStatus()
  512. }
  513. // OnMSG 接收消息
  514. func (c *Client) OnMSG(f func(msg *WxMsg)) error {
  515. socket, err := pair1.NewSocket()
  516. if err != nil {
  517. return err
  518. }
  519. _ = socket.SetOption(mangos.OptionRecvDeadline, 5000)
  520. _ = socket.SetOption(mangos.OptionSendDeadline, 5000)
  521. err = socket.Dial(addPort(c.add))
  522. if err != nil {
  523. return err
  524. }
  525. defer socket.Close()
  526. for c.RecvTxt {
  527. msg := &Response{}
  528. recv, err := socket.Recv()
  529. if err != nil {
  530. return err
  531. }
  532. _ = proto.Unmarshal(recv, msg)
  533. go f(msg.GetWxmsg())
  534. }
  535. return err
  536. }
  537. // NewWCF 连接
  538. func NewWCF(add string) (*Client, error) {
  539. if add == "" {
  540. add = "tcp://127.0.0.1:10086"
  541. }
  542. client := &Client{add: add}
  543. err := client.conn()
  544. return client, err
  545. }
  546. type cmdMSG struct {
  547. *Request
  548. }
  549. func (c *cmdMSG) build() []byte {
  550. marshal, _ := proto.Marshal(c)
  551. return marshal
  552. }
  553. func genFunReq(fun Functions) *cmdMSG {
  554. return &cmdMSG{
  555. &Request{Func: fun,
  556. Msg: nil},
  557. }
  558. }
  559. func addPort(add string) string {
  560. parts := strings.Split(add, ":")
  561. port, _ := strconv.Atoi(parts[2])
  562. newPort := port + 1
  563. return parts[0] + ":" + parts[1] + ":" + strconv.Itoa(newPort)
  564. }