diff --git a/WeChatFerry/rpc/proto/wcf.proto b/WeChatFerry/rpc/proto/wcf.proto index a92f637..4337076 100644 --- a/WeChatFerry/rpc/proto/wcf.proto +++ b/WeChatFerry/rpc/proto/wcf.proto @@ -18,6 +18,7 @@ enum Functions { FUNC_SEND_FILE = 0x22; FUNC_SEND_XML = 0x23; FUNC_SEND_EMOTION = 0x24; + FUNC_SEND_RICH_TXT = 0x25; FUNC_ENABLE_RECV_TXT = 0x30; FUNC_DISABLE_RECV_TXT = 0x40; FUNC_EXEC_DB_QUERY = 0x50; @@ -51,6 +52,7 @@ message Request bool flag = 13; AttachMsg att = 14; AudioMsg am = 15; + RichText rt = 16; } } @@ -195,3 +197,14 @@ message AudioMsg uint64 id = 1; // 语音消息 id string dir = 2; // 存放目录 } + +message RichText +{ + string name = 1; // 显示名字 + string account = 2; // 公众号 id + string title = 3; // 标题 + string digest = 4; // 摘要 + string url = 5; // 链接 + string thumburl = 6; // 缩略图 + string receiver = 7; // 接收人 +} diff --git a/WeChatFerry/spy/load_calls.cpp b/WeChatFerry/spy/load_calls.cpp index b5fe3b8..54698c2 100644 --- a/WeChatFerry/spy/load_calls.cpp +++ b/WeChatFerry/spy/load_calls.cpp @@ -31,7 +31,9 @@ WxCalls_t wxCalls = { /* call1, call2, call3, call4, call5, call6*/ { 0x76F010, 0x792700, 0xBC0370, 0x80F110, 0x82BB40, 0x756E30}, /* call1, call2, call3, call4, call5*/ - {0x76F010, 0x792700, 0xBC0370, 0xBB5F70, 0x756E30} + {0x76F010, 0x792700, 0xBC0370, 0xBB5F70, 0x756E30}, + /* call1, call2, call3, call4, call5*/ + {0x76E630, 0x76AE20, 0xF59E40, 0xB73000, 0x76E350} }; int LoadCalls(const wchar_t *version, WxCalls_t *calls) diff --git a/WeChatFerry/spy/rpc_server.cpp b/WeChatFerry/spy/rpc_server.cpp index 142b346..106e85e 100644 --- a/WeChatFerry/spy/rpc_server.cpp +++ b/WeChatFerry/spy/rpc_server.cpp @@ -334,6 +334,33 @@ bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len) return true; } +bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len) +{ + Response rsp = Response_init_default; + rsp.func = Functions_FUNC_SEND_RICH_TXT; + rsp.which_msg = Response_status_tag; + rsp.msg.status = 0; + + RichText_t rtt; + rtt.account = string(rt.account ? rt.account : ""); + rtt.digest = string(rt.digest ? rt.digest : ""); + rtt.name = string(rt.name ? rt.name : ""); + rtt.receiver = string(rt.receiver ? rt.receiver : ""); + rtt.thumburl = string(rt.thumburl ? rt.thumburl : ""); + rtt.title = string(rt.title ? rt.title : ""); + rtt.url = string(rt.url ? rt.url : ""); + + rsp.msg.status = SendRichTextMessage(rtt); + pb_ostream_t stream = pb_ostream_from_buffer(out, *len); + if (!pb_encode(&stream, Response_fields, &rsp)) { + LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream)); + return false; + } + *len = stream.bytes_written; + + return true; +} + static void PushMessage() { static nng_socket msg_sock; @@ -726,6 +753,11 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len ret = func_send_txt(req.msg.txt, out, out_len); break; } + case Functions_FUNC_SEND_RICH_TXT: { + LOG_DEBUG("[Functions_FUNC_SEND_RICH_TXT]"); + ret = func_send_rich_txt(req.msg.rt, out, out_len); + break; + } case Functions_FUNC_SEND_IMG: { LOG_DEBUG("[Functions_FUNC_SEND_IMG]"); ret = func_send_img(req.msg.file.path, req.msg.file.receiver, out, out_len); diff --git a/WeChatFerry/spy/send_msg.cpp b/WeChatFerry/spy/send_msg.cpp index 5088b9d..182850e 100644 --- a/WeChatFerry/spy/send_msg.cpp +++ b/WeChatFerry/spy/send_msg.cpp @@ -171,6 +171,7 @@ void SendFileMessage(string wxid, string path) popad; } } + void SendXmlMessage(string receiver, string xml, string path, int type) { if (g_WeChatWinDllAddr == 0) { @@ -294,3 +295,72 @@ void SendEmotionMessage(string wxid, string path) popad; } } + +int SendRichTextMessage(RichText_t &rt) +{ + int status = -1; + char buff[0x238] = { 0 }; + + DWORD rtCall3 = g_WeChatWinDllAddr + g_WxCalls.rt.call3; + DWORD rtCall2 = g_WeChatWinDllAddr + g_WxCalls.rt.call2; + DWORD rtCall1 = g_WeChatWinDllAddr + g_WxCalls.rt.call1; + DWORD rtCall5 = g_WeChatWinDllAddr + g_WxCalls.rt.call5; + DWORD rtCall4 = g_WeChatWinDllAddr + g_WxCalls.rt.call4; + + __asm { + pushad; + pushfd; + lea ecx,buff; + call rtCall1; + popfd; + popad; + } + + wstring receiver = String2Wstring(rt.receiver); + wstring title = String2Wstring(rt.title); + wstring url = String2Wstring(rt.url); + wstring thumburl = String2Wstring(rt.thumburl); + wstring account = String2Wstring(rt.account); + wstring name = String2Wstring(rt.name); + wstring digest = String2Wstring(rt.digest); + + WxString wxReceiver(receiver); + WxString wxTitle(title); + WxString wxUrl(url); + WxString wxThumburl(thumburl); + WxString wxAccount(account); + WxString wxName(name); + WxString wxDigest(digest); + + memcpy(&buff[0x4], &wxTitle, sizeof(wxTitle)); + memcpy(&buff[0x2C], &wxUrl, sizeof(wxUrl)); + memcpy(&buff[0x6C], &wxThumburl, sizeof(wxThumburl)); + memcpy(&buff[0x94], &wxDigest, sizeof(wxDigest)); + memcpy(&buff[0x1A0], &wxAccount, sizeof(wxAccount)); + memcpy(&buff[0x1B4], &wxName, sizeof(wxName)); + + __asm { + pushad; + pushfd; + call rtCall2; + lea ecx, buff; + push ecx; + sub esp, 0x14; + mov edi, eax; + mov ecx, esp; + lea ebx, wxReceiver; + push ebx; + call rtCall3; + mov ecx, edi; + call rtCall4; + mov status, eax; + add ebx, 0x14; + lea ecx, buff; + push 0x0; + call rtCall5; + popfd; + popad; + } + + return status; +} diff --git a/WeChatFerry/spy/send_msg.h b/WeChatFerry/spy/send_msg.h index d1d345c..878815e 100644 --- a/WeChatFerry/spy/send_msg.h +++ b/WeChatFerry/spy/send_msg.h @@ -4,8 +4,19 @@ using namespace std; +typedef struct { + string name; + string account; + string title; + string digest; + string url; + string thumburl; + string receiver; +} RichText_t; + void SendTextMessage(string wxid, string msg, string atWxids); void SendImageMessage(string wxid, string path); void SendFileMessage(string wxid, string path); void SendXmlMessage(string receiver, string xml, string path, int type); void SendEmotionMessage(string wxid, string path); +int SendRichTextMessage(RichText_t &rt); diff --git a/WeChatFerry/spy/spy.aps b/WeChatFerry/spy/spy.aps index 7746f5c..bc1a9af 100644 Binary files a/WeChatFerry/spy/spy.aps and b/WeChatFerry/spy/spy.aps differ diff --git a/WeChatFerry/spy/spy.rc b/WeChatFerry/spy/spy.rc index a7435f0..2c2d206 100644 --- a/WeChatFerry/spy/spy.rc +++ b/WeChatFerry/spy/spy.rc @@ -51,7 +51,7 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 39,0,6,0 + FILEVERSION 39,0,8,0 PRODUCTVERSION 3,9,2,23 FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -69,7 +69,7 @@ BEGIN BEGIN VALUE "CompanyName", "WeChatFerry" VALUE "FileDescription", "WeChatFerry" - VALUE "FileVersion", "39.0.6.0" + VALUE "FileVersion", "39.0.8.0" VALUE "InternalName", "spy.dll" VALUE "LegalCopyright", "Copyright (C) 2023" VALUE "OriginalFilename", "spy.dll" diff --git a/WeChatFerry/spy/spy_types.h b/WeChatFerry/spy/spy_types.h index 69fb037..7b926f7 100644 --- a/WeChatFerry/spy/spy_types.h +++ b/WeChatFerry/spy/spy_types.h @@ -120,6 +120,14 @@ typedef struct RevokeMsg { DWORD call5; } RevokeMsg_t; +typedef struct CallRichText { + DWORD call1; + DWORD call2; + DWORD call3; + DWORD call4; + DWORD call5; +} CallRichText_t; + typedef struct WxCalls { DWORD login; // 登录状态 UserInfoCall_t ui; // 用户信息 @@ -138,6 +146,7 @@ typedef struct WxCalls { Pyq_t pyq; // 接收朋友圈消息 DlAttach_t da; // 下载资源(图片、文件、视频) RevokeMsg_t rm; // 撤回消息 + CallRichText_t rt; // 消息卡片 } WxCalls_t; struct WxString { diff --git a/clients/python/wcferry/client.py b/clients/python/wcferry/client.py index 5770ad7..ef1110a 100644 --- a/clients/python/wcferry/client.py +++ b/clients/python/wcferry/client.py @@ -1,7 +1,7 @@ #! /usr/bin/env python3 # -*- coding: utf-8 -*- -__version__ = "39.0.7.1" +__version__ = "39.0.8.0" import atexit import base64 @@ -415,6 +415,43 @@ class Wcf(): rsp = self._send_request(req) return rsp.status + def send_rich_text( + self, name: str, account: str, title: str, digest: str, url: str, thumburl: str, receiver: str) -> int: + """发送富文本消息 + 卡片样式: + |-------------------------------------| + |title, 最长两行 + |(长标题, 标题短的话这行没有) + |digest, 最多三行,会占位 |--------| + |digest, 最多三行,会占位 |thumburl| + |digest, 最多三行,会占位 |--------| + |(account logo) name + |-------------------------------------| + Args: + name (str): 左下显示的名字 + account (str): 填公众号 id 可以显示对应的头像(gh_ 开头的) + title (str): 标题,最多两行 + digest (str): 摘要,三行 + url (str): 点击后跳转的链接 + thumburl (str): 缩略图的链接 + receiver (str): 接收人, wxid 或者 roomid + + Returns: + int: 0 为成功,其他失败 + """ + req = wcf_pb2.Request() + req.func = wcf_pb2.FUNC_SEND_RICH_TXT # FUNC_SEND_RICH_TXT + req.rt.name = name + req.rt.account = account + req.rt.title = title + req.rt.digest = digest + req.rt.url = url + req.rt.thumburl = thumburl + req.rt.receiver = receiver + + rsp = self._send_request(req) + return rsp.status + def get_msg(self, block=True) -> WxMsg: """从消息队列中获取消息 diff --git a/clients/python/wcferry/wcf_pb2.py b/clients/python/wcferry/wcf_pb2.py index 0a53657..67dccae 100644 --- a/clients/python/wcferry/wcf_pb2.py +++ b/clients/python/wcferry/wcf_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\twcf.proto\x12\x03wcf\"\xa4\x03\n\x07Request\x12\x1c\n\x04\x66unc\x18\x01 \x01(\x0e\x32\x0e.wcf.Functions\x12\x1b\n\x05\x65mpty\x18\x02 \x01(\x0b\x32\n.wcf.EmptyH\x00\x12\r\n\x03str\x18\x03 \x01(\tH\x00\x12\x1b\n\x03txt\x18\x04 \x01(\x0b\x32\x0c.wcf.TextMsgH\x00\x12\x1c\n\x04\x66ile\x18\x05 \x01(\x0b\x32\x0c.wcf.PathMsgH\x00\x12\x1d\n\x05query\x18\x06 \x01(\x0b\x32\x0c.wcf.DbQueryH\x00\x12\x1e\n\x01v\x18\x07 \x01(\x0b\x32\x11.wcf.VerificationH\x00\x12\x1c\n\x01m\x18\x08 \x01(\x0b\x32\x0f.wcf.AddMembersH\x00\x12\x1a\n\x03xml\x18\t \x01(\x0b\x32\x0b.wcf.XmlMsgH\x00\x12\x1b\n\x03\x64\x65\x63\x18\n \x01(\x0b\x32\x0c.wcf.DecPathH\x00\x12\x1b\n\x02tf\x18\x0b \x01(\x0b\x32\r.wcf.TransferH\x00\x12\x0e\n\x04ui64\x18\x0c \x01(\x04H\x00\x12\x0e\n\x04\x66lag\x18\r \x01(\x08H\x00\x12\x1d\n\x03\x61tt\x18\x0e \x01(\x0b\x32\x0e.wcf.AttachMsgH\x00\x12\x1b\n\x02\x61m\x18\x0f \x01(\x0b\x32\r.wcf.AudioMsgH\x00\x42\x05\n\x03msg\"\xab\x02\n\x08Response\x12\x1c\n\x04\x66unc\x18\x01 \x01(\x0e\x32\x0e.wcf.Functions\x12\x10\n\x06status\x18\x02 \x01(\x05H\x00\x12\r\n\x03str\x18\x03 \x01(\tH\x00\x12\x1b\n\x05wxmsg\x18\x04 \x01(\x0b\x32\n.wcf.WxMsgH\x00\x12\x1e\n\x05types\x18\x05 \x01(\x0b\x32\r.wcf.MsgTypesH\x00\x12$\n\x08\x63ontacts\x18\x06 \x01(\x0b\x32\x10.wcf.RpcContactsH\x00\x12\x1b\n\x03\x64\x62s\x18\x07 \x01(\x0b\x32\x0c.wcf.DbNamesH\x00\x12\x1f\n\x06tables\x18\x08 \x01(\x0b\x32\r.wcf.DbTablesH\x00\x12\x1b\n\x04rows\x18\t \x01(\x0b\x32\x0b.wcf.DbRowsH\x00\x12\x1b\n\x02ui\x18\n \x01(\x0b\x32\r.wcf.UserInfoH\x00\x42\x05\n\x03msg\"\x07\n\x05\x45mpty\"\xba\x01\n\x05WxMsg\x12\x0f\n\x07is_self\x18\x01 \x01(\x08\x12\x10\n\x08is_group\x18\x02 \x01(\x08\x12\n\n\x02id\x18\x03 \x01(\x04\x12\x0c\n\x04type\x18\x04 \x01(\r\x12\n\n\x02ts\x18\x05 \x01(\r\x12\x0e\n\x06roomid\x18\x06 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x07 \x01(\t\x12\x0e\n\x06sender\x18\x08 \x01(\t\x12\x0c\n\x04sign\x18\t \x01(\t\x12\r\n\x05thumb\x18\n \x01(\t\x12\r\n\x05\x65xtra\x18\x0b \x01(\t\x12\x0b\n\x03xml\x18\x0c \x01(\t\"7\n\x07TextMsg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x12\x10\n\x08receiver\x18\x02 \x01(\t\x12\r\n\x05\x61ters\x18\x03 \x01(\t\")\n\x07PathMsg\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x10\n\x08receiver\x18\x02 \x01(\t\"G\n\x06XmlMsg\x12\x10\n\x08receiver\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\x05\"a\n\x08MsgTypes\x12\'\n\x05types\x18\x01 \x03(\x0b\x32\x18.wcf.MsgTypes.TypesEntry\x1a,\n\nTypesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x87\x01\n\nRpcContact\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0e\n\x06remark\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x05 \x01(\t\x12\x10\n\x08province\x18\x06 \x01(\t\x12\x0c\n\x04\x63ity\x18\x07 \x01(\t\x12\x0e\n\x06gender\x18\x08 \x01(\x05\"0\n\x0bRpcContacts\x12!\n\x08\x63ontacts\x18\x01 \x03(\x0b\x32\x0f.wcf.RpcContact\"\x18\n\x07\x44\x62Names\x12\r\n\x05names\x18\x01 \x03(\t\"$\n\x07\x44\x62Table\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03sql\x18\x02 \x01(\t\"(\n\x08\x44\x62Tables\x12\x1c\n\x06tables\x18\x01 \x03(\x0b\x32\x0c.wcf.DbTable\"\"\n\x07\x44\x62Query\x12\n\n\x02\x64\x62\x18\x01 \x01(\t\x12\x0b\n\x03sql\x18\x02 \x01(\t\"8\n\x07\x44\x62\x46ield\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0e\n\x06\x63olumn\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\x0c\"%\n\x05\x44\x62Row\x12\x1c\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x0c.wcf.DbField\"\"\n\x06\x44\x62Rows\x12\x18\n\x04rows\x18\x01 \x03(\x0b\x32\n.wcf.DbRow\"5\n\x0cVerification\x12\n\n\x02v3\x18\x01 \x01(\t\x12\n\n\x02v4\x18\x02 \x01(\t\x12\r\n\x05scene\x18\x03 \x01(\x05\"+\n\nAddMembers\x12\x0e\n\x06roomid\x18\x01 \x01(\t\x12\r\n\x05wxids\x18\x02 \x01(\t\"D\n\x08UserInfo\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06mobile\x18\x03 \x01(\t\x12\x0c\n\x04home\x18\x04 \x01(\t\"#\n\x07\x44\x65\x63Path\x12\x0b\n\x03src\x18\x01 \x01(\t\x12\x0b\n\x03\x64st\x18\x02 \x01(\t\"4\n\x08Transfer\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04tfid\x18\x02 \x01(\t\x12\x0c\n\x04taid\x18\x03 \x01(\t\"5\n\tAttachMsg\x12\n\n\x02id\x18\x01 \x01(\x04\x12\r\n\x05thumb\x18\x02 \x01(\t\x12\r\n\x05\x65xtra\x18\x03 \x01(\t\"#\n\x08\x41udioMsg\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x02 \x01(\t*\xe6\x04\n\tFunctions\x12\x11\n\rFUNC_RESERVED\x10\x00\x12\x11\n\rFUNC_IS_LOGIN\x10\x01\x12\x16\n\x12\x46UNC_GET_SELF_WXID\x10\x10\x12\x16\n\x12\x46UNC_GET_MSG_TYPES\x10\x11\x12\x15\n\x11\x46UNC_GET_CONTACTS\x10\x12\x12\x15\n\x11\x46UNC_GET_DB_NAMES\x10\x13\x12\x16\n\x12\x46UNC_GET_DB_TABLES\x10\x14\x12\x16\n\x12\x46UNC_GET_USER_INFO\x10\x15\x12\x16\n\x12\x46UNC_GET_AUDIO_MSG\x10\x16\x12\x11\n\rFUNC_SEND_TXT\x10 \x12\x11\n\rFUNC_SEND_IMG\x10!\x12\x12\n\x0e\x46UNC_SEND_FILE\x10\"\x12\x11\n\rFUNC_SEND_XML\x10#\x12\x15\n\x11\x46UNC_SEND_EMOTION\x10$\x12\x18\n\x14\x46UNC_ENABLE_RECV_TXT\x10\x30\x12\x19\n\x15\x46UNC_DISABLE_RECV_TXT\x10@\x12\x16\n\x12\x46UNC_EXEC_DB_QUERY\x10P\x12\x16\n\x12\x46UNC_ACCEPT_FRIEND\x10Q\x12\x16\n\x12\x46UNC_RECV_TRANSFER\x10R\x12\x14\n\x10\x46UNC_REFRESH_PYQ\x10S\x12\x18\n\x14\x46UNC_DOWNLOAD_ATTACH\x10T\x12\x19\n\x15\x46UNC_GET_CONTACT_INFO\x10U\x12\x13\n\x0f\x46UNC_REVOKE_MSG\x10V\x12\x16\n\x12\x46UNC_DECRYPT_IMAGE\x10`\x12\x19\n\x15\x46UNC_ADD_ROOM_MEMBERS\x10p\x12\x19\n\x15\x46UNC_DEL_ROOM_MEMBERS\x10qB\r\n\x0b\x63om.iamteerb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\twcf.proto\x12\x03wcf\"\xc1\x03\n\x07Request\x12\x1c\n\x04\x66unc\x18\x01 \x01(\x0e\x32\x0e.wcf.Functions\x12\x1b\n\x05\x65mpty\x18\x02 \x01(\x0b\x32\n.wcf.EmptyH\x00\x12\r\n\x03str\x18\x03 \x01(\tH\x00\x12\x1b\n\x03txt\x18\x04 \x01(\x0b\x32\x0c.wcf.TextMsgH\x00\x12\x1c\n\x04\x66ile\x18\x05 \x01(\x0b\x32\x0c.wcf.PathMsgH\x00\x12\x1d\n\x05query\x18\x06 \x01(\x0b\x32\x0c.wcf.DbQueryH\x00\x12\x1e\n\x01v\x18\x07 \x01(\x0b\x32\x11.wcf.VerificationH\x00\x12\x1c\n\x01m\x18\x08 \x01(\x0b\x32\x0f.wcf.AddMembersH\x00\x12\x1a\n\x03xml\x18\t \x01(\x0b\x32\x0b.wcf.XmlMsgH\x00\x12\x1b\n\x03\x64\x65\x63\x18\n \x01(\x0b\x32\x0c.wcf.DecPathH\x00\x12\x1b\n\x02tf\x18\x0b \x01(\x0b\x32\r.wcf.TransferH\x00\x12\x0e\n\x04ui64\x18\x0c \x01(\x04H\x00\x12\x0e\n\x04\x66lag\x18\r \x01(\x08H\x00\x12\x1d\n\x03\x61tt\x18\x0e \x01(\x0b\x32\x0e.wcf.AttachMsgH\x00\x12\x1b\n\x02\x61m\x18\x0f \x01(\x0b\x32\r.wcf.AudioMsgH\x00\x12\x1b\n\x02rt\x18\x10 \x01(\x0b\x32\r.wcf.RichTextH\x00\x42\x05\n\x03msg\"\xab\x02\n\x08Response\x12\x1c\n\x04\x66unc\x18\x01 \x01(\x0e\x32\x0e.wcf.Functions\x12\x10\n\x06status\x18\x02 \x01(\x05H\x00\x12\r\n\x03str\x18\x03 \x01(\tH\x00\x12\x1b\n\x05wxmsg\x18\x04 \x01(\x0b\x32\n.wcf.WxMsgH\x00\x12\x1e\n\x05types\x18\x05 \x01(\x0b\x32\r.wcf.MsgTypesH\x00\x12$\n\x08\x63ontacts\x18\x06 \x01(\x0b\x32\x10.wcf.RpcContactsH\x00\x12\x1b\n\x03\x64\x62s\x18\x07 \x01(\x0b\x32\x0c.wcf.DbNamesH\x00\x12\x1f\n\x06tables\x18\x08 \x01(\x0b\x32\r.wcf.DbTablesH\x00\x12\x1b\n\x04rows\x18\t \x01(\x0b\x32\x0b.wcf.DbRowsH\x00\x12\x1b\n\x02ui\x18\n \x01(\x0b\x32\r.wcf.UserInfoH\x00\x42\x05\n\x03msg\"\x07\n\x05\x45mpty\"\xba\x01\n\x05WxMsg\x12\x0f\n\x07is_self\x18\x01 \x01(\x08\x12\x10\n\x08is_group\x18\x02 \x01(\x08\x12\n\n\x02id\x18\x03 \x01(\x04\x12\x0c\n\x04type\x18\x04 \x01(\r\x12\n\n\x02ts\x18\x05 \x01(\r\x12\x0e\n\x06roomid\x18\x06 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x07 \x01(\t\x12\x0e\n\x06sender\x18\x08 \x01(\t\x12\x0c\n\x04sign\x18\t \x01(\t\x12\r\n\x05thumb\x18\n \x01(\t\x12\r\n\x05\x65xtra\x18\x0b \x01(\t\x12\x0b\n\x03xml\x18\x0c \x01(\t\"7\n\x07TextMsg\x12\x0b\n\x03msg\x18\x01 \x01(\t\x12\x10\n\x08receiver\x18\x02 \x01(\t\x12\r\n\x05\x61ters\x18\x03 \x01(\t\")\n\x07PathMsg\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x10\n\x08receiver\x18\x02 \x01(\t\"G\n\x06XmlMsg\x12\x10\n\x08receiver\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\x05\"a\n\x08MsgTypes\x12\'\n\x05types\x18\x01 \x03(\x0b\x32\x18.wcf.MsgTypes.TypesEntry\x1a,\n\nTypesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x87\x01\n\nRpcContact\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0e\n\x06remark\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x05 \x01(\t\x12\x10\n\x08province\x18\x06 \x01(\t\x12\x0c\n\x04\x63ity\x18\x07 \x01(\t\x12\x0e\n\x06gender\x18\x08 \x01(\x05\"0\n\x0bRpcContacts\x12!\n\x08\x63ontacts\x18\x01 \x03(\x0b\x32\x0f.wcf.RpcContact\"\x18\n\x07\x44\x62Names\x12\r\n\x05names\x18\x01 \x03(\t\"$\n\x07\x44\x62Table\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03sql\x18\x02 \x01(\t\"(\n\x08\x44\x62Tables\x12\x1c\n\x06tables\x18\x01 \x03(\x0b\x32\x0c.wcf.DbTable\"\"\n\x07\x44\x62Query\x12\n\n\x02\x64\x62\x18\x01 \x01(\t\x12\x0b\n\x03sql\x18\x02 \x01(\t\"8\n\x07\x44\x62\x46ield\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0e\n\x06\x63olumn\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\x0c\"%\n\x05\x44\x62Row\x12\x1c\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x0c.wcf.DbField\"\"\n\x06\x44\x62Rows\x12\x18\n\x04rows\x18\x01 \x03(\x0b\x32\n.wcf.DbRow\"5\n\x0cVerification\x12\n\n\x02v3\x18\x01 \x01(\t\x12\n\n\x02v4\x18\x02 \x01(\t\x12\r\n\x05scene\x18\x03 \x01(\x05\"+\n\nAddMembers\x12\x0e\n\x06roomid\x18\x01 \x01(\t\x12\r\n\x05wxids\x18\x02 \x01(\t\"D\n\x08UserInfo\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06mobile\x18\x03 \x01(\t\x12\x0c\n\x04home\x18\x04 \x01(\t\"#\n\x07\x44\x65\x63Path\x12\x0b\n\x03src\x18\x01 \x01(\t\x12\x0b\n\x03\x64st\x18\x02 \x01(\t\"4\n\x08Transfer\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04tfid\x18\x02 \x01(\t\x12\x0c\n\x04taid\x18\x03 \x01(\t\"5\n\tAttachMsg\x12\n\n\x02id\x18\x01 \x01(\x04\x12\r\n\x05thumb\x18\x02 \x01(\t\x12\r\n\x05\x65xtra\x18\x03 \x01(\t\"#\n\x08\x41udioMsg\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x02 \x01(\t\"y\n\x08RichText\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x63\x63ount\x18\x02 \x01(\t\x12\r\n\x05title\x18\x03 \x01(\t\x12\x0e\n\x06\x64igest\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x10\n\x08thumburl\x18\x06 \x01(\t\x12\x10\n\x08receiver\x18\x07 \x01(\t*\xfe\x04\n\tFunctions\x12\x11\n\rFUNC_RESERVED\x10\x00\x12\x11\n\rFUNC_IS_LOGIN\x10\x01\x12\x16\n\x12\x46UNC_GET_SELF_WXID\x10\x10\x12\x16\n\x12\x46UNC_GET_MSG_TYPES\x10\x11\x12\x15\n\x11\x46UNC_GET_CONTACTS\x10\x12\x12\x15\n\x11\x46UNC_GET_DB_NAMES\x10\x13\x12\x16\n\x12\x46UNC_GET_DB_TABLES\x10\x14\x12\x16\n\x12\x46UNC_GET_USER_INFO\x10\x15\x12\x16\n\x12\x46UNC_GET_AUDIO_MSG\x10\x16\x12\x11\n\rFUNC_SEND_TXT\x10 \x12\x11\n\rFUNC_SEND_IMG\x10!\x12\x12\n\x0e\x46UNC_SEND_FILE\x10\"\x12\x11\n\rFUNC_SEND_XML\x10#\x12\x15\n\x11\x46UNC_SEND_EMOTION\x10$\x12\x16\n\x12\x46UNC_SEND_RICH_TXT\x10%\x12\x18\n\x14\x46UNC_ENABLE_RECV_TXT\x10\x30\x12\x19\n\x15\x46UNC_DISABLE_RECV_TXT\x10@\x12\x16\n\x12\x46UNC_EXEC_DB_QUERY\x10P\x12\x16\n\x12\x46UNC_ACCEPT_FRIEND\x10Q\x12\x16\n\x12\x46UNC_RECV_TRANSFER\x10R\x12\x14\n\x10\x46UNC_REFRESH_PYQ\x10S\x12\x18\n\x14\x46UNC_DOWNLOAD_ATTACH\x10T\x12\x19\n\x15\x46UNC_GET_CONTACT_INFO\x10U\x12\x13\n\x0f\x46UNC_REVOKE_MSG\x10V\x12\x16\n\x12\x46UNC_DECRYPT_IMAGE\x10`\x12\x19\n\x15\x46UNC_ADD_ROOM_MEMBERS\x10p\x12\x19\n\x15\x46UNC_DEL_ROOM_MEMBERS\x10qB\r\n\x0b\x63om.iamteerb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'wcf_pb2', globals()) @@ -23,56 +23,58 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._serialized_options = b'\n\013com.iamteer' _MSGTYPES_TYPESENTRY._options = None _MSGTYPES_TYPESENTRY._serialized_options = b'8\001' - _FUNCTIONS._serialized_start=2030 - _FUNCTIONS._serialized_end=2644 + _FUNCTIONS._serialized_start=2182 + _FUNCTIONS._serialized_end=2820 _REQUEST._serialized_start=19 - _REQUEST._serialized_end=439 - _RESPONSE._serialized_start=442 - _RESPONSE._serialized_end=741 - _EMPTY._serialized_start=743 - _EMPTY._serialized_end=750 - _WXMSG._serialized_start=753 - _WXMSG._serialized_end=939 - _TEXTMSG._serialized_start=941 - _TEXTMSG._serialized_end=996 - _PATHMSG._serialized_start=998 - _PATHMSG._serialized_end=1039 - _XMLMSG._serialized_start=1041 - _XMLMSG._serialized_end=1112 - _MSGTYPES._serialized_start=1114 - _MSGTYPES._serialized_end=1211 - _MSGTYPES_TYPESENTRY._serialized_start=1167 - _MSGTYPES_TYPESENTRY._serialized_end=1211 - _RPCCONTACT._serialized_start=1214 - _RPCCONTACT._serialized_end=1349 - _RPCCONTACTS._serialized_start=1351 - _RPCCONTACTS._serialized_end=1399 - _DBNAMES._serialized_start=1401 - _DBNAMES._serialized_end=1425 - _DBTABLE._serialized_start=1427 - _DBTABLE._serialized_end=1463 - _DBTABLES._serialized_start=1465 - _DBTABLES._serialized_end=1505 - _DBQUERY._serialized_start=1507 - _DBQUERY._serialized_end=1541 - _DBFIELD._serialized_start=1543 - _DBFIELD._serialized_end=1599 - _DBROW._serialized_start=1601 - _DBROW._serialized_end=1638 - _DBROWS._serialized_start=1640 - _DBROWS._serialized_end=1674 - _VERIFICATION._serialized_start=1676 - _VERIFICATION._serialized_end=1729 - _ADDMEMBERS._serialized_start=1731 - _ADDMEMBERS._serialized_end=1774 - _USERINFO._serialized_start=1776 - _USERINFO._serialized_end=1844 - _DECPATH._serialized_start=1846 - _DECPATH._serialized_end=1881 - _TRANSFER._serialized_start=1883 - _TRANSFER._serialized_end=1935 - _ATTACHMSG._serialized_start=1937 - _ATTACHMSG._serialized_end=1990 - _AUDIOMSG._serialized_start=1992 - _AUDIOMSG._serialized_end=2027 + _REQUEST._serialized_end=468 + _RESPONSE._serialized_start=471 + _RESPONSE._serialized_end=770 + _EMPTY._serialized_start=772 + _EMPTY._serialized_end=779 + _WXMSG._serialized_start=782 + _WXMSG._serialized_end=968 + _TEXTMSG._serialized_start=970 + _TEXTMSG._serialized_end=1025 + _PATHMSG._serialized_start=1027 + _PATHMSG._serialized_end=1068 + _XMLMSG._serialized_start=1070 + _XMLMSG._serialized_end=1141 + _MSGTYPES._serialized_start=1143 + _MSGTYPES._serialized_end=1240 + _MSGTYPES_TYPESENTRY._serialized_start=1196 + _MSGTYPES_TYPESENTRY._serialized_end=1240 + _RPCCONTACT._serialized_start=1243 + _RPCCONTACT._serialized_end=1378 + _RPCCONTACTS._serialized_start=1380 + _RPCCONTACTS._serialized_end=1428 + _DBNAMES._serialized_start=1430 + _DBNAMES._serialized_end=1454 + _DBTABLE._serialized_start=1456 + _DBTABLE._serialized_end=1492 + _DBTABLES._serialized_start=1494 + _DBTABLES._serialized_end=1534 + _DBQUERY._serialized_start=1536 + _DBQUERY._serialized_end=1570 + _DBFIELD._serialized_start=1572 + _DBFIELD._serialized_end=1628 + _DBROW._serialized_start=1630 + _DBROW._serialized_end=1667 + _DBROWS._serialized_start=1669 + _DBROWS._serialized_end=1703 + _VERIFICATION._serialized_start=1705 + _VERIFICATION._serialized_end=1758 + _ADDMEMBERS._serialized_start=1760 + _ADDMEMBERS._serialized_end=1803 + _USERINFO._serialized_start=1805 + _USERINFO._serialized_end=1873 + _DECPATH._serialized_start=1875 + _DECPATH._serialized_end=1910 + _TRANSFER._serialized_start=1912 + _TRANSFER._serialized_end=1964 + _ATTACHMSG._serialized_start=1966 + _ATTACHMSG._serialized_end=2019 + _AUDIOMSG._serialized_start=2021 + _AUDIOMSG._serialized_end=2056 + _RICHTEXT._serialized_start=2058 + _RICHTEXT._serialized_end=2179 # @@protoc_insertion_point(module_scope)