123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- package wcf
- import (
- logs "github.com/danbai225/go-logs"
- "go.nanomsg.org/mangos/v3"
- "go.nanomsg.org/mangos/v3/protocol"
- "go.nanomsg.org/mangos/v3/protocol/pair1"
- _ "go.nanomsg.org/mangos/v3/transport/all"
- "google.golang.org/protobuf/proto"
- "strconv"
- "strings"
- )
- type Client struct {
- add string
- socket protocol.Socket
- RecvTxt bool
- ContactsMap []map[string]string
- MessageCallbackUrl string
- }
- func (c *Client) conn() error {
- socket, err := pair1.NewSocket()
- if err != nil {
- return err
- }
- err = socket.Dial(c.add)
- if err != nil {
- return err
- }
- c.socket = socket
- return err
- }
- func (c *Client) send(data []byte) error {
- return c.socket.Send(data)
- }
- func (c *Client) Recv() (*Response, error) {
- msg := &Response{}
- recv, err := c.socket.Recv()
- if err != nil {
- return msg, err
- }
- err = proto.Unmarshal(recv, msg)
- return msg, err
- }
- // Close 退出
- func (c *Client) Close() error {
- c.DisableRecvTxt()
- return c.socket.Close()
- }
- // IsLogin 查看是否登录
- func (c *Client) IsLogin() bool {
- err := c.send(genFunReq(Functions_FUNC_IS_LOGIN).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- if recv.GetStatus() == 1 {
- return true
- }
- return false
- }
- // GetSelfWXID 获取登录的id
- func (c *Client) GetSelfWXID() string {
- err := c.send(genFunReq(Functions_FUNC_GET_SELF_WXID).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStr()
- }
- // GetMsgTypes 获取消息类型
- func (c *Client) GetMsgTypes() map[int32]string {
- err := c.send(genFunReq(Functions_FUNC_GET_MSG_TYPES).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetTypes().GetTypes()
- }
- // GetContacts 获取通讯录
- func (c *Client) GetContacts() []*RpcContact {
- err := c.send(genFunReq(Functions_FUNC_GET_CONTACTS).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetContacts().GetContacts()
- }
- // GetDBNames 获取数据库名
- func (c *Client) GetDBNames() []string {
- err := c.send(genFunReq(Functions_FUNC_GET_DB_NAMES).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetDbs().Names
- }
- // GetDBTables 获取表
- func (c *Client) GetDBTables(tab string) []*DbTable {
- req := genFunReq(Functions_FUNC_GET_DB_TABLES)
- str := &Request_Str{Str: tab}
- req.Msg = str
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetTables().GetTables()
- }
- // ExecDBQuery 执行sql
- func (c *Client) ExecDBQuery(db, sql string) []*DbRow {
- req := genFunReq(Functions_FUNC_EXEC_DB_QUERY)
- q := Request_Query{
- Query: &DbQuery{
- Db: db,
- Sql: sql,
- },
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetRows().GetRows()
- }
- // AcceptFriend 接收好友请求
- func (c *Client) AcceptFriend(v3, v4 string, scene int32) int32 {
- req := genFunReq(Functions_FUNC_ACCEPT_FRIEND)
- q := Request_V{
- V: &Verification{
- V3: v3,
- V4: v4,
- Scene: scene,
- }}
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- func (c *Client) AddChatroomMembers(roomID, wxIDs string) int32 {
- req := genFunReq(Functions_FUNC_ADD_ROOM_MEMBERS)
- q := Request_M{
- M: &MemberMgmt{Roomid: roomID, Wxids: wxIDs},
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // ReceiveTransfer 接收转账
- func (c *Client) ReceiveTransfer(wxid, tfid, taid string) int32 {
- req := genFunReq(Functions_FUNC_RECV_TRANSFER)
- q := Request_Tf{
- Tf: &Transfer{
- Wxid: wxid,
- Tfid: tfid,
- Taid: taid,
- },
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // RefreshPYQ 刷新朋友圈
- func (c *Client) RefreshPYQ() int32 {
- req := genFunReq(Functions_FUNC_REFRESH_PYQ)
- q := Request_Ui64{
- Ui64: 0,
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // DecryptImage 解密图片 加密路径,解密路径
- func (c *Client) DecryptImage(src, dst string) string {
- req := genFunReq(Functions_FUNC_DECRYPT_IMAGE)
- q := Request_Dec{
- Dec: &DecPath{Src: src, Dst: dst},
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.String()
- }
- // AddChatRoomMembers 添加群成员
- func (c *Client) AddChatRoomMembers(roomId string, wxIds []string) int32 {
- req := genFunReq(Functions_FUNC_ADD_ROOM_MEMBERS)
- q := Request_M{
- M: &MemberMgmt{Roomid: roomId,
- Wxids: strings.Join(wxIds, ",")},
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // InvChatRoomMembers 邀请群成员
- func (c *Client) InvChatRoomMembers(roomId string, wxIds []string) int32 {
- req := genFunReq(Functions_FUNC_INV_ROOM_MEMBERS)
- q := Request_M{
- M: &MemberMgmt{Roomid: roomId,
- Wxids: strings.Join(wxIds, ",")},
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // DelChatRoomMembers 删除群成员
- func (c *Client) DelChatRoomMembers(roomId string, wxIds []string) int32 {
- req := genFunReq(Functions_FUNC_DEL_ROOM_MEMBERS)
- q := Request_M{
- M: &MemberMgmt{Roomid: roomId,
- Wxids: strings.Join(wxIds, ",")},
- }
- req.Msg = &q
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // GetUserInfo 获取自己的信息
- func (c *Client) GetUserInfo() *UserInfo {
- err := c.send(genFunReq(Functions_FUNC_GET_USER_INFO).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetUi()
- }
- // SendTxt 发送文本内容
- func (c *Client) SendTxt(msg string, receiver string, ates []string) int32 {
- req := genFunReq(Functions_FUNC_SEND_TXT)
- req.Msg = &Request_Txt{
- Txt: &TextMsg{
- Msg: msg,
- Receiver: receiver,
- Aters: strings.Join(ates, ","),
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // ForwardMsg 转发消息
- func (c *Client) ForwardMsg(Id uint64, receiver string) int32 {
- req := genFunReq(Functions_FUNC_FORWARD_MSG)
- req.Msg = &Request_Fm{
- Fm: &ForwardMsg{
- Id: Id,
- Receiver: receiver,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendIMG 发送图片
- func (c *Client) SendIMG(path string, receiver string) int32 {
- req := genFunReq(Functions_FUNC_SEND_IMG)
- req.Msg = &Request_File{
- File: &PathMsg{
- Path: path,
- Receiver: receiver,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendFile 发送文件
- func (c *Client) SendFile(path string, receiver string) int32 {
- req := genFunReq(Functions_FUNC_SEND_FILE)
- req.Msg = &Request_File{
- File: &PathMsg{
- Path: path,
- Receiver: receiver,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendRichText 发送卡片消息
- func (c *Client) SendRichText(name string, account string, title string, digest string, url string, thumburl string, receiver string) int32 {
- req := genFunReq(Functions_FUNC_SEND_RICH_TXT)
- req.Msg = &Request_Rt{
- Rt: &RichText{
- Name: name,
- Account: account,
- Title: title,
- Digest: digest,
- Url: url,
- Thumburl: thumburl,
- Receiver: receiver,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendXml 发送xml数据
- func (c *Client) SendXml(path, content, receiver string, Type int32) int32 {
- req := genFunReq(Functions_FUNC_SEND_XML)
- req.Msg = &Request_Xml{
- Xml: &XmlMsg{
- Receiver: receiver,
- Content: content,
- Path: path,
- Type: Type,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendEmotion 发送emoji
- func (c *Client) SendEmotion(path, receiver string) int32 {
- req := genFunReq(Functions_FUNC_SEND_EMOTION)
- req.Msg = &Request_File{
- File: &PathMsg{
- Path: path,
- Receiver: receiver,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // SendPat 发送拍一拍消息
- func (c *Client) SendPat(roomId, wxId string) int32 {
- req := genFunReq(Functions_FUNC_SEND_PAT_MSG)
- req.Msg = &Request_Pm{
- Pm: &PatMsg{
- Roomid: roomId,
- Wxid: wxId,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // DownloadAttach 下载附件
- func (c *Client) DownloadAttach(id uint64, thumb, extra string) int32 {
- req := genFunReq(Functions_FUNC_SEND_PAT_MSG)
- req.Msg = &Request_Att{
- Att: &AttachMsg{
- Id: id,
- Thumb: thumb,
- Extra: extra,
- },
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- return recv.GetStatus()
- }
- // EnableRecvTxt 开启接收数据
- func (c *Client) EnableRecvTxt() int32 {
- req := genFunReq(Functions_FUNC_ENABLE_RECV_TXT)
- req.Msg = &Request_Flag{
- Flag: true,
- }
- err := c.send(req.build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- c.RecvTxt = true
- return recv.GetStatus()
- }
- // DisableRecvTxt 关闭接收消息
- func (c *Client) DisableRecvTxt() int32 {
- err := c.send(genFunReq(Functions_FUNC_DISABLE_RECV_TXT).build())
- if err != nil {
- logs.Err(err)
- }
- recv, err := c.Recv()
- if err != nil {
- logs.Err(err)
- }
- c.RecvTxt = false
- return recv.GetStatus()
- }
- // OnMSG 接收消息
- func (c *Client) OnMSG(f func(msg *WxMsg)) error {
- socket, err := pair1.NewSocket()
- if err != nil {
- return err
- }
- _ = socket.SetOption(mangos.OptionRecvDeadline, 5000)
- _ = socket.SetOption(mangos.OptionSendDeadline, 5000)
- err = socket.Dial(addPort(c.add))
- if err != nil {
- return err
- }
- defer socket.Close()
- for c.RecvTxt {
- msg := &Response{}
- recv, err := socket.Recv()
- if err != nil {
- return err
- }
- _ = proto.Unmarshal(recv, msg)
- go f(msg.GetWxmsg())
- }
- return err
- }
- // NewWCF 连接
- func NewWCF(add string) (*Client, error) {
- if add == "" {
- add = "tcp://127.0.0.1:10086"
- }
- client := &Client{add: add}
- err := client.conn()
- return client, err
- }
- type cmdMSG struct {
- *Request
- }
- func (c *cmdMSG) build() []byte {
- marshal, _ := proto.Marshal(c)
- return marshal
- }
- func genFunReq(fun Functions) *cmdMSG {
- return &cmdMSG{
- &Request{Func: fun,
- Msg: nil},
- }
- }
- func addPort(add string) string {
- parts := strings.Split(add, ":")
- port, _ := strconv.Atoi(parts[2])
- newPort := port + 1
- return parts[0] + ":" + parts[1] + ":" + strconv.Itoa(newPort)
- }
|