diff --git a/.github/workflows/Build-WeChatFerry.yml b/.github/workflows/Build-WeChatFerry.yml
index e238613..9502122 100644
--- a/.github/workflows/Build-WeChatFerry.yml
+++ b/.github/workflows/Build-WeChatFerry.yml
@@ -40,34 +40,47 @@ jobs:
pip install grpcio-tools==1.48.2
- name: 设置缓存
- id: cache-dependencies
+ id: cache-vcpkg
uses: actions/cache@v4
with:
path: |
C:/Tools/vcpkg
- key: ${{ runner.os }}-dependencies-${{ hashFiles('**/WeChatFerry/spy/spy.rc') }}
+ ${{ github.workspace }}/WeChatFerry/vcpkg_installed
+ key: ${{ runner.os }}-vcpkg-${{ hashFiles('WeChatFerry/vcpkg.json') }}
restore-keys: |
- ${{ runner.os }}-dependencies-
+ ${{ runner.os }}-vcpkg-
- - name: 安装 vcpkg 和依赖项
+ - name: 安装 vcpkg 并初始化依赖项
run: |
+ # 设置 vcpkg 目录
+ if (!(Test-Path -Path 'C:/Tools')) {
+ New-Item -ItemType Directory -Force -Path 'C:/Tools'
+ }
cd C:/Tools
- git clone https://github.com/microsoft/vcpkg
+
+ # 克隆并引导 vcpkg
+ if (!(Test-Path -Path 'C:/Tools/vcpkg')) {
+ git clone https://github.com/microsoft/vcpkg
+ }
.\vcpkg\bootstrap-vcpkg.bat
- .\vcpkg\vcpkg install protobuf[zlib]:x64-windows-static
- .\vcpkg\vcpkg install spdlog:x64-windows-static
- .\vcpkg\vcpkg install nng:x64-windows-static
- .\vcpkg\vcpkg install magic-enum:x64-windows-static
- .\vcpkg\vcpkg install minhook:x64-windows-static
- .\vcpkg\vcpkg integrate install
+
+ # 设置 VCPKG_ROOT 环境变量
echo "VCPKG_ROOT=C:/Tools/vcpkg" >> $GITHUB_ENV
+ $env:VCPKG_ROOT = 'C:/Tools/vcpkg'
+
+ # 将 vcpkg 与 Visual Studio 集成
+ C:/Tools/vcpkg/vcpkg integrate install
+
+ # 返回到项目目录并安装依赖
+ cd ${{ github.workspace }}/WeChatFerry
+ C:/Tools/vcpkg/vcpkg install --triplet x64-windows-static
- name: 解析并构建配置
run: |
$configurations = "Release,Debug".Split(',')
foreach ($config in $configurations) {
Write-Host "Building configuration: $config"
- msbuild WeChatFerry/WeChatFerry.sln /p:Configuration=$config /p:Platform="x64" /verbosity:detailed
+ msbuild WeChatFerry/WeChatFerry.sln /p:Configuration=$config /p:Platform="x64" /p:VcpkgTriplet="x64-windows-static" /p:VcpkgEnableManifest=true /verbosity:minimal
}
shell: pwsh
@@ -75,7 +88,6 @@ jobs:
run: |
New-Item -ItemType Directory -Force -Path "WeChatFerry/tmp"
Compress-Archive -Path "WeChatFerry/Out/sdk.dll", "WeChatFerry/Out/spy.dll", "WeChatFerry/Out/spy_debug.dll" -DestinationPath "WeChatFerry/tmp/v${{ env.version }}.zip"
- # Compress-Archive -Path "WeChatFerry/Out/*" -DestinationPath "WeChatFerry/tmp/v${{ env.version }}-debug.zip"
Invoke-WebRequest -Uri "https://github.com/tom-snow/wechat-windows-versions/releases/download/v${{ env.wechat_version }}/WeChatSetup-${{ env.wechat_version }}.exe" -OutFile "WeChatFerry/tmp/WeChatSetup-${{ env.wechat_version }}.exe"
shell: pwsh
diff --git a/.gitignore b/.gitignore
index 15901be..b9a6849 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,7 @@ Out/
build/
logs/
java/wcferry/bin/
+vcpkg_installed/
*_pb2_grpc.py
__pycache__
diff --git a/README.MD b/README.MD
index 55c5708..560993f 100644
--- a/README.MD
+++ b/README.MD
@@ -16,7 +16,7 @@
-|[📖 Python 文档](https://wechatferry.readthedocs.io/)|[📺 Python 视频教程](https://mp.weixin.qq.com/s/APdjGyZ2hllXxyG_sNCfXQ)|[🙋 FAQ](https://mp.weixin.qq.com/s/Y2Q37VYV730Iu9TrgiCmCw)|
+|[📖 Python 文档](https://wechatferry.readthedocs.io/)|[📺 Python 视频教程](https://mp.weixin.qq.com/s/APdjGyZ2hllXxyG_sNCfXQ)|[🙋 FAQ](https://mp.weixin.qq.com/s/YvgFFhF6D-79kXDzRqtg6w)|
|:-:|:-:|:-:|
👉 [WeChatRobot🤖](https://github.com/lich0821/WeChatRobot),一个基于 WeChatFerry 的 Python 机器人框架。
@@ -27,6 +27,7 @@
点击查看功能清单
+* 获取登录二维码
* 查询登录状态
* 获取登录账号信息
* 获取消息类型
@@ -38,6 +39,7 @@
* 发送图片消息
* 发送文件消息
* 发送卡片消息
+* 发送 XML 消息
* 发送 GIF 消息
* 拍一拍群友
* 转发消息
@@ -61,6 +63,10 @@
+## 感谢大佬们贡献代码
+
+
+
## 快速开始
### Python
[](https://pypi.python.org/pypi/wcferry) [](https://pypi.python.org/pypi/wcferry) [](https://wechatferry.readthedocs.io/zh/latest/?badge=latest)
@@ -75,6 +81,7 @@ pip install --upgrade wcferry
### HTTP
* [wcfrust](https://github.com/lich0821/wcf-client-rust)(基于 Rust)
* [go_wcf_http](clients/go_wcf_http/README.MD)(基于 Go)
+* [wcf-http](https://github.com/yuxiaoli/wcf-http)(基于 Python)
### Java
* [java](clients/java/wcferry/README.MD)
@@ -97,6 +104,7 @@ pip install --upgrade wcferry
## 一起开发
> 🚫 非开发用户不需要往下看。
+>
> **开发用户**:可以根据文档和错误提示,自行解决编译错误的人员。
### 安装开发环境
@@ -114,26 +122,27 @@ git clone https://github.com/microsoft/vcpkg
```
* 添加全局配置:
-环境变量增加 `vcpkg` 所在路径(本项目为:`C:\Tools\vcpkg`)。
+环境变量增加 `vcpkg` 所在路径(本文为:`C:\Tools\vcpkg`):
+```sh
+setx VCPKG_ROOT "C:/Tools/vcpkg" /M
+```
+
+* 与 Visual Studio 集成
+```sh
+vcpkg integrate install # 失败则说明未正确安装或者未正确配置环境变量
+```
#### 安装相关组件
-```sh
-vcpkg install protobuf[zlib]:x64-windows-static
-vcpkg install spdlog:x64-windows-static
-vcpkg install nng:x64-windows-static
-vcpkg install magic-enum:x64-windows-static
-vcpkg install minhook:x64-windows-static
-vcpkg integrate install
-```
+编译时会自动安装。但如果需要使用 `protoc.exe`,则需要配置一下 `protoc.exe` 环境变量:`\x64-windows-static\x64-windows-static\tools\protobuf`。
-安装完毕后,需要配置 protoc 的环境变量,并确保在命令行下可用,protoc 的路径在 `\installed\x86-windows-static\tools\protobuf`
+(本文为:`C:\Projs\WeChatFerry\WeChatFerry\vcpkg_installed\x64-windows-static\x64-windows-static\tools\protobuf`)
#### 安装 VS2019
#### 安装 Python3
-通过微软商店或者 python.org 自行下载均可,注意配置好环境变量,确保 `python3` 在命令行下可用。
+通过微软商店或者 python.org 自行下载均可(注意 `python` 版本不能太高,否则需要自行编译依赖,建议使用 python 3.10),然后配置好环境变量,确保 `python` 在命令行下可用。
安装依赖:
```sh
@@ -202,9 +211,9 @@ WeChatFerry
## 版本更新
-### v39.2.4
+### v39.3.4
-* 修复 wxid 问题
+* 实现获取登录二维码
点击查看更多
@@ -216,6 +225,22 @@ WeChatFerry
* `y` 是 `WeChatFerry` 的版本,从 0 开始
* `z` 是各客户端的版本,从 0 开始
+### v39.3.3
+
+* 修复发送文件 / 图片中文路径问题
+
+### v39.3.2
+
+* 修复接收消息问题
+
+### v39.3.0
+
+* 适配 `3.9.11.25`
+
+### v39.2.4
+
+* 修复 wxid 问题
+
### v39.2.3
* 实现发送 GIF
diff --git a/WeChatFerry/com/log.cpp b/WeChatFerry/com/log.cpp
index e06c0e9..6524dd0 100644
--- a/WeChatFerry/com/log.cpp
+++ b/WeChatFerry/com/log.cpp
@@ -14,7 +14,11 @@ void InitLogger(std::string path)
if (logger != nullptr) {
return;
}
-
+ // check and create logs folder
+ std::filesystem::path logDir = std::filesystem::path(path) / "logs";
+ if (!std::filesystem::exists(logDir)) {
+ std::filesystem::create_directory(logDir);
+ }
auto filename = std::filesystem::path(path + LOGGER_FILE_NAME).make_preferred().string();
try {
logger = spdlog::rotating_logger_mt(LOGGER_NAME, filename, LOGGER_MAX_SIZE, LOGGER_MAX_FILES);
diff --git a/WeChatFerry/rpc/proto/wcf.proto b/WeChatFerry/rpc/proto/wcf.proto
index 270e5e6..296fcf6 100644
--- a/WeChatFerry/rpc/proto/wcf.proto
+++ b/WeChatFerry/rpc/proto/wcf.proto
@@ -117,7 +117,7 @@ message XmlMsg
string receiver = 1; // 消息接收人
string content = 2; // xml 内容
string path = 3; // 图片路径
- int32 type = 4; // 消息类型
+ uint64 type = 4; // 消息类型
}
message MsgTypes { map types = 1; }
@@ -234,3 +234,24 @@ message ForwardMsg
uint64 id = 1 [ jstype = JS_STRING ]; // 待转发消息 ID
string receiver = 2; // 转发接收目标,群为 roomId,个人为 wxid
}
+
+message RoomData
+{
+ message RoomMember
+ {
+ string wxid = 1;
+ optional string name = 2; // 群昵称
+ int32 state = 3;
+ }
+
+ repeated RoomMember members = 1;
+
+ optional int32 field_2 = 2;
+ int32 field_3 = 3;
+ optional int32 field_4 = 4;
+ int32 capacity = 5;
+ optional string field_6 = 6;
+ int32 field_7 = 7;
+ int32 field_8 = 8;
+ repeated string admins = 9; // 管理员
+}
diff --git a/WeChatFerry/sdk/SDK.vcxproj b/WeChatFerry/sdk/SDK.vcxproj
index af47a4b..f71d944 100644
--- a/WeChatFerry/sdk/SDK.vcxproj
+++ b/WeChatFerry/sdk/SDK.vcxproj
@@ -69,6 +69,9 @@
true
x64-windows-static
+
+ true
+
Level3
@@ -77,6 +80,7 @@
true
Use
pch.h
+ /utf-8 %(AdditionalOptions)
Windows
@@ -93,6 +97,7 @@
true
Use
pch.h
+ /utf-8 %(AdditionalOptions)
Windows
@@ -117,6 +122,7 @@
true
MultiThreaded
+ /utf-8 %(AdditionalOptions)
Windows
diff --git a/WeChatFerry/spy/Spy.vcxproj b/WeChatFerry/spy/Spy.vcxproj
index 0c44f9a..bf90736 100644
--- a/WeChatFerry/spy/Spy.vcxproj
+++ b/WeChatFerry/spy/Spy.vcxproj
@@ -79,6 +79,9 @@
true
+
+ true
+
Level3
@@ -96,7 +99,7 @@
true
4251;4731;4819
- /EHa %(AdditionalOptions)
+ /EHa /utf-8 %(AdditionalOptions)
Windows
@@ -145,7 +148,7 @@ xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)..\clients\python\wcferry
4251;4731;4819
- /EHa %(AdditionalOptions)
+ /EHa /utf-8 %(AdditionalOptions)
Windows
@@ -192,7 +195,7 @@ xcopy /y $(OutDir)$(TargetFileName) $(SolutionDir)..\clients\python\wcferryfalse
4251;4731;4819
- /EHa %(AdditionalOptions)
+ /EHa /utf-8 %(AdditionalOptions)
MultiThreaded
diff --git a/WeChatFerry/spy/chatroom_mgmt.cpp b/WeChatFerry/spy/chatroom_mgmt.cpp
index f26e351..41d1da5 100644
--- a/WeChatFerry/spy/chatroom_mgmt.cpp
+++ b/WeChatFerry/spy/chatroom_mgmt.cpp
@@ -9,10 +9,10 @@
using namespace std;
extern QWORD g_WeChatWinDllAddr;
-#define OS_GET_CHATROOM_MGR 0x1C4E200
-#define OS_ADD_MEMBERS 0x221B8A0
-#define OS_DELETE_MEMBERS 0x221BEE0
-#define OS_INVITE_MEMBERS 0x221B280
+#define OS_GET_CHATROOM_MGR 0x1B83BD0
+#define OS_ADD_MEMBERS 0x2155100
+#define OS_DELETE_MEMBERS 0x2155740
+#define OS_INVITE_MEMBERS 0x2154AE0
typedef QWORD (*GetChatRoomMgr_t)();
typedef QWORD (*AddMemberToChatRoom_t)(QWORD, QWORD, QWORD, QWORD);
diff --git a/WeChatFerry/spy/contact_mgmt.cpp b/WeChatFerry/spy/contact_mgmt.cpp
index 3b7b559..f81d1c1 100644
--- a/WeChatFerry/spy/contact_mgmt.cpp
+++ b/WeChatFerry/spy/contact_mgmt.cpp
@@ -7,8 +7,8 @@
using namespace std;
extern QWORD g_WeChatWinDllAddr;
-#define OS_GET_CONTACT_MGR 0x1C0BDE0
-#define OS_GET_CONTACT_LIST 0x2265540
+#define OS_GET_CONTACT_MGR 0x1B417A0
+#define OS_GET_CONTACT_LIST 0x219ED10
#define OS_CONTACT_BIN 0x200
#define OS_CONTACT_BIN_LEN 0x208
#define OS_CONTACT_WXID 0x10
diff --git a/WeChatFerry/spy/exec_sql.cpp b/WeChatFerry/spy/exec_sql.cpp
index 5de9628..c3f114f 100644
--- a/WeChatFerry/spy/exec_sql.cpp
+++ b/WeChatFerry/spy/exec_sql.cpp
@@ -5,16 +5,16 @@
#include "sqlite3.h"
#include "util.h"
-#define OFFSET_DB_INSTANCE 0x5A40598
-#define OFFSET_DB_MICROMSG 0xb8
-#define OFFSET_DB_CHAT_MSG 0x2c8
-#define OFFSET_DB_MISC 0x5f0
-#define OFFSET_DB_EMOTION 0x15f0
+#define OFFSET_DB_INSTANCE 0x5902000
+#define OFFSET_DB_MICROMSG 0xB8
+#define OFFSET_DB_CHAT_MSG 0x2C8
+#define OFFSET_DB_MISC 0x5F0
+#define OFFSET_DB_EMOTION 0x15F0
#define OFFSET_DB_MEDIA 0xF48
#define OFFSET_DB_BIZCHAT_MSG 0x1A70
-#define OFFSET_DB_FUNCTION_MSG 0x1b98
+#define OFFSET_DB_FUNCTION_MSG 0x1B98
#define OFFSET_DB_NAME 0x28
-#define OFFSET_DB_MSG_MGR 0x5ABB5D8
+#define OFFSET_DB_MSG_MGR 0x595F900
extern UINT64 g_WeChatWinDllAddr;
diff --git a/WeChatFerry/spy/funcs.cpp b/WeChatFerry/spy/funcs.cpp
index 9ff3edc..bdd1d56 100644
--- a/WeChatFerry/spy/funcs.cpp
+++ b/WeChatFerry/spy/funcs.cpp
@@ -24,17 +24,18 @@ extern QWORD g_WeChatWinDllAddr;
#define HEADER_GIF1 0x47
#define HEADER_GIF2 0x49
-#define OS_LOGIN_STATUS 0x5AB86A8
-#define OS_GET_SNS_DATA_MGR 0x22A91C0
-#define OS_GET_SNS_FIRST_PAGE 0x2ED9080
-#define OS_GET_SNS_TIMELINE_MGR 0x2E6B110
-#define OS_GET_SNS_NEXT_PAGE 0x2EFEC00
-#define OS_NEW_CHAT_MSG 0x1C28800
-#define OS_FREE_CHAT_MSG 0x1C1FF10
-#define OS_GET_CHAT_MGR 0x1C51CF0
-#define OS_GET_MGR_BY_PREFIX_LOCAL_ID 0x2206280
-#define OS_GET_PRE_DOWNLOAD_MGR 0x1CD87E0
-#define OS_PUSH_ATTACH_TASK 0x1DA69C0
+#define OS_LOGIN_STATUS 0x595C9E8
+#define OS_GET_SNS_DATA_MGR 0x21E2200
+#define OS_GET_SNS_FIRST_PAGE 0x2E212D0
+#define OS_GET_SNS_TIMELINE_MGR 0x2DB3390
+#define OS_GET_SNS_NEXT_PAGE 0x2EC8970
+#define OS_NEW_CHAT_MSG 0x1B5E140
+#define OS_FREE_CHAT_MSG 0x1B55850
+#define OS_GET_CHAT_MGR 0x1B876C0
+#define OS_GET_MGR_BY_PREFIX_LOCAL_ID 0x213FB00
+#define OS_GET_PRE_DOWNLOAD_MGR 0x1C0EE70
+#define OS_PUSH_ATTACH_TASK 0x1CDF4E0
+#define OS_LOGIN_QR_CODE 0x59620D8
typedef QWORD (*GetSNSDataMgr_t)();
typedef QWORD (*GetSnsTimeLineMgr_t)();
@@ -348,8 +349,17 @@ int RevokeMsg(QWORD id)
string GetLoginUrl()
{
- char url[] = "方法还没实现";
- return "http://weixin.qq.com/x/" + string(url);
+ LPVOID targetAddress = reinterpret_cast(g_WeChatWinDllAddr) + OS_LOGIN_QR_CODE;
+
+ char *dataPtr = *reinterpret_cast(targetAddress); // 读取指针内容
+ if (!dataPtr) {
+ LOG_ERROR("Failed to get login url");
+ return "error";
+ }
+
+ // 读取字符串内容
+ std::string data(dataPtr, 22);
+ return "http://weixin.qq.com/x/" + data;
}
int ReceiveTransfer(string wxid, string transferid, string transactionid)
diff --git a/WeChatFerry/spy/receive_msg.cpp b/WeChatFerry/spy/receive_msg.cpp
index 8d385db..997102a 100644
--- a/WeChatFerry/spy/receive_msg.cpp
+++ b/WeChatFerry/spy/receive_msg.cpp
@@ -31,15 +31,15 @@ extern QWORD g_WeChatWinDllAddr;
#define OS_RECV_MSG_THUMB 0x280
#define OS_RECV_MSG_EXTRA 0x2A0
#define OS_RECV_MSG_XML 0x308
-#define OS_RECV_MSG_CALL 0x2205510
+#define OS_RECV_MSG_CALL 0x213ED90
#define OS_PYQ_MSG_START 0x30
#define OS_PYQ_MSG_END 0x38
#define OS_PYQ_MSG_TS 0x38
#define OS_PYQ_MSG_XML 0x9B8
#define OS_PYQ_MSG_SENDER 0x18
#define OS_PYQ_MSG_CONTENT 0x48
-#define OS_PYQ_MSG_CALL 0x2EFAA10
-#define OS_WXLOG 0x26DA2D0
+#define OS_PYQ_MSG_CALL 0x2E42C90
+#define OS_WXLOG 0x2613D20
typedef QWORD (*RecvMsg_t)(QWORD, QWORD);
typedef QWORD (*WxLog_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD);
diff --git a/WeChatFerry/spy/rpc_server.cpp b/WeChatFerry/spy/rpc_server.cpp
index 679d38f..70e899b 100644
--- a/WeChatFerry/spy/rpc_server.cpp
+++ b/WeChatFerry/spy/rpc_server.cpp
@@ -252,7 +252,7 @@ bool func_send_img(char *path, char *receiver, uint8_t *out, size_t *len)
if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1;
- } else if (!fs::exists(path)) {
+ } else if (!fs::exists(String2Wstring(path))) {
LOG_ERROR("Path does not exists: {}", path);
rsp.msg.status = -2;
} else {
@@ -279,11 +279,11 @@ bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len)
if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1;
- } else if (!fs::exists(path)) {
+ } else if (!fs::exists(String2Wstring(path))) {
LOG_ERROR("Path does not exists: {}", path);
rsp.msg.status = -2;
} else {
- SendImageMessage(receiver, path);
+ SendFileMessage(receiver, path);
rsp.msg.status = 0;
}
@@ -321,7 +321,6 @@ bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len)
return true;
}
-#if 0
bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
{
Response rsp = Response_init_default;
@@ -335,7 +334,7 @@ bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
string receiver(xml.receiver);
string content(xml.content);
string path(xml.path ? xml.path : "");
- uint32_t type = (uint32_t)xml.type;
+ uint64_t type = (uint64_t)xml.type;
SendXmlMessage(receiver, content, path, type);
rsp.msg.status = 0;
}
@@ -349,7 +348,6 @@ bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
return true;
}
-#endif
bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len)
{
diff --git a/WeChatFerry/spy/send_msg.cpp b/WeChatFerry/spy/send_msg.cpp
index 70b0900..2b9c6ba 100644
--- a/WeChatFerry/spy/send_msg.cpp
+++ b/WeChatFerry/spy/send_msg.cpp
@@ -1,4 +1,5 @@
-#include "framework.h"
+
+#include "framework.h"
#include
#include
@@ -14,20 +15,22 @@ extern string GetSelfWxid(); // Defined in spy.cpp
#define SRTM_SIZE 0x3F0
-#define OS_NEW 0x1C28800
-#define OS_FREE 0x1C1FF10
-#define OS_SEND_MSG_MGR 0x1C1E690
-#define OS_SEND_TEXT 0x238DDD0
-#define OS_SEND_IMAGE 0x2383560
-#define OS_GET_APP_MSG_MGR 0x1C23630
-#define OS_SEND_FILE 0x21969E0
-#define OS_RTM_NEW 0x1C27D50
-#define OS_RTM_FREE 0x1C27120
-#define OS_SEND_RICH_TEXT 0x21A09C0
-#define OS_SEND_PAT_MSG 0x2D669B0
-#define OS_FORWARD_MSG 0x238D350
-#define OS_GET_EMOTION_MGR 0x1C988D0
-#define OS_SEND_EMOTION 0x227B9E0
+#define OS_NEW 0x1B5E140
+#define OS_FREE 0x1B55850
+#define OS_SEND_MSG_MGR 0x1B53FD0
+#define OS_SEND_TEXT 0x22C6B60
+#define OS_SEND_IMAGE 0x22BC2F0
+#define OS_GET_APP_MSG_MGR 0x1B58F70
+#define OS_SEND_FILE 0x20D0230
+#define OS_RTM_NEW 0x1B5D690
+#define OS_RTM_FREE 0x1B5CA60
+#define OS_SEND_RICH_TEXT 0x20DA210
+#define OS_SEND_PAT_MSG 0x2CAEC00
+#define OS_FORWARD_MSG 0x22C60E0
+#define OS_GET_EMOTION_MGR 0x1BCEF10
+#define OS_SEND_EMOTION 0x21B52D5
+#define OS_XML_BUFSIGN 0x24F0D70
+#define OS_SEND_XML 0x20CF360
typedef QWORD (*New_t)(QWORD);
typedef QWORD (*Free_t)(QWORD);
@@ -43,6 +46,9 @@ typedef QWORD (*ForwardMsg_t)(QWORD, QWORD, QWORD, QWORD);
typedef QWORD (*GetEmotionMgr_t)();
typedef QWORD (*SendEmotion_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD);
+typedef QWORD (*XmlBufSign_t)(QWORD, QWORD, QWORD);
+typedef QWORD (*SendXmlMsg_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD);
+
void SendTextMessage(string wxid, string msg, string atWxids)
{
QWORD success = 0;
@@ -228,70 +234,40 @@ void SendEmotionMessage(string wxid, string path)
SendEmotion(mgr, (QWORD)pWxPath, (QWORD)buff, (QWORD)pWxWxid, 2, (QWORD)buff, 0, (QWORD)buff);
}
-#if 0
-void SendXmlMessage(string receiver, string xml, string path, int type)
+void SendXmlMessage(string receiver, string xml, string path, QWORD type)
{
if (g_WeChatWinDllAddr == 0) {
return;
}
- // 发送消息Call地址 = 微信基址 + 偏移
- DWORD sendXmlCall1 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call1;
- DWORD sendXmlCall2 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call2;
- DWORD sendXmlCall3 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call3;
- DWORD sendXmlCall4 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call4;
- DWORD sendXmlParam = g_WeChatWinDllAddr + g_WxCalls.sendXml.param;
+ New_t funcNew = (New_t)(g_WeChatWinDllAddr + OS_NEW);
+ Free_t funcFree = (Free_t)(g_WeChatWinDllAddr + OS_FREE);
- char buffer[0xFF0] = { 0 };
+ XmlBufSign_t xmlBufSign = (XmlBufSign_t)(g_WeChatWinDllAddr + OS_XML_BUFSIGN);
+ SendXmlMsg_t sendXmlMsg = (SendXmlMsg_t)(g_WeChatWinDllAddr + OS_SEND_XML);
+
+ char buff[0x500] = { 0 };
+ char buff2[0x500] = { 0 };
char nullBuf[0x1C] = { 0 };
- wstring wsSender = String2Wstring(GetSelfWxid());
- wstring wsReceiver = String2Wstring(receiver);
- wstring wsXml = String2Wstring(xml);
+ QWORD pBuf = (QWORD)(&buff);
+ QWORD pBuf2 = (QWORD)(&buff2);
- WxString wxPath;
- WxString wxNull;
- WxString wxXml(wsXml);
- WxString wxSender(wsSender);
- WxString wxReceiver(wsReceiver);
+ funcNew(pBuf);
+ funcNew(pBuf2);
- if (!path.empty()) {
- wstring wsPath = String2Wstring(path);
- wxPath = WxString(wsPath);
- }
+ QWORD sbuf[4] = { 0, 0, 0, 0 };
- DWORD sendtype = type;
- __asm {
- pushad;
- pushfd;
- lea ecx, buffer;
- call sendXmlCall1;
- mov eax, [sendtype];
- push eax;
- lea eax, nullBuf;
- lea edx, wxSender;
- push eax;
- lea eax, wxPath;
- push eax;
- lea eax, wxXml;
- push eax;
- lea edi, wxReceiver;
- push edi;
- lea ecx, buffer;
- call sendXmlCall2;
- add esp, 0x14;
- lea eax, wxNull;
- push eax;
- lea ecx, buffer;
- call sendXmlCall3;
- mov dl, 0x0;
- lea ecx, buffer;
- push sendXmlParam;
- push sendXmlParam;
- call sendXmlCall4;
- add esp, 0x8;
- popfd;
- popad;
- }
+ QWORD sign = xmlBufSign(pBuf2, (QWORD)(&sbuf), 0x1);
+
+ WxString *pReceiver = NewWxStringFromStr(receiver);
+ WxString *pXml = NewWxStringFromStr(xml);
+ WxString *pPath = NewWxStringFromStr(path);
+ WxString *pSender = NewWxStringFromStr(GetSelfWxid());
+
+ sendXmlMsg(pBuf, (QWORD)pSender, (QWORD)pReceiver, (QWORD)pXml, (QWORD)pPath, (QWORD)(&nullBuf), type, 0x4, sign,
+ pBuf2);
+
+ funcFree((QWORD)&buff);
+ funcFree((QWORD)&buff2);
}
-#endif
diff --git a/WeChatFerry/spy/send_msg.h b/WeChatFerry/spy/send_msg.h
index 1abd0fd..0218a5d 100644
--- a/WeChatFerry/spy/send_msg.h
+++ b/WeChatFerry/spy/send_msg.h
@@ -17,7 +17,7 @@ typedef struct {
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 SendXmlMessage(string receiver, string xml, string path, uint64_t type);
void SendEmotionMessage(string wxid, string path);
int SendRichTextMessage(RichText_t &rt);
int SendPatMessage(string roomid, string wxid);
diff --git a/WeChatFerry/spy/spy.aps b/WeChatFerry/spy/spy.aps
index 1c00a30..9a2d146 100644
Binary files a/WeChatFerry/spy/spy.aps and b/WeChatFerry/spy/spy.aps differ
diff --git a/WeChatFerry/spy/spy.h b/WeChatFerry/spy/spy.h
index f985134..525109a 100644
--- a/WeChatFerry/spy/spy.h
+++ b/WeChatFerry/spy/spy.h
@@ -2,7 +2,7 @@
#include "framework.h"
-#define SUPPORT_VERSION L"3.9.10.27"
+#define SUPPORT_VERSION L"3.9.11.25"
void InitSpy(int port);
void CleanupSpy();
diff --git a/WeChatFerry/spy/spy.rc b/WeChatFerry/spy/spy.rc
index 381b4eb..5f87428 100644
--- a/WeChatFerry/spy/spy.rc
+++ b/WeChatFerry/spy/spy.rc
@@ -13,7 +13,7 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
-// (壬й) resources
+// ����(���壬�й�) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
@@ -51,8 +51,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 39,2,4,0
- PRODUCTVERSION 3,9,10,27
+ FILEVERSION 39,3,4,0
+ PRODUCTVERSION 3,9,11,25
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -69,12 +69,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "WeChatFerry"
VALUE "FileDescription", "WeChatFerry"
- VALUE "FileVersion", "39.2.4.0"
+ VALUE "FileVersion", "39.3.4.0"
VALUE "InternalName", "spy.dll"
VALUE "LegalCopyright", "Copyright (C) 2023"
VALUE "OriginalFilename", "spy.dll"
VALUE "ProductName", "WeChatFerry"
- VALUE "ProductVersion", "3.9.10.27"
+ VALUE "ProductVersion", "3.9.11.25"
END
END
BLOCK "VarFileInfo"
@@ -83,7 +83,7 @@ BEGIN
END
END
-#endif // (壬й) resources
+#endif // ����(���壬�й�) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/WeChatFerry/spy/sqlite3.h b/WeChatFerry/spy/sqlite3.h
index 09bc15d..b50ec2a 100644
--- a/WeChatFerry/spy/sqlite3.h
+++ b/WeChatFerry/spy/sqlite3.h
@@ -138,43 +138,43 @@
#define SQLITE_NULL 5
#define SQLITE_TEXT 3
-#define SQLITE3_EXEC_OFFSET 0x3AFBCE0
-#define SQLITE3_BACKUP_INIT_OFFSET 0x1DEA900
-#define SQLITE3_PREPARE_OFFSET 0x3B03990
-#define SQLITE3_OPEN_OFFSET 0x1E598B0
-#define SQLITE3_BACKUP_STEP_OFFSET 0x1DEAD00
-#define SQLITE3_BACKUP_REMAINING_OFFSET 0x1DEB440
-#define SQLITE3_BACKUP_PAGECOUNT_OFFSET 0x1DEB450
-#define SQLITE3_BACKUP_FINISH_OFFSET 0x1DEB340
-#define SQLITE3_SLEEP_OFFSET 0x1E5A0F0
-#define SQLITE3_ERRCODE_OFFSET 0x1E58550
-#define SQLITE3_CLOSE_OFFSET 0x1E56CD0
-#define SQLITE3_STEP_OFFSET 0x3ABFCE0
-#define SQLITE3_COLUMN_COUNT_OFFSET 0x3AC0500
-#define SQLITE3_COLUMN_NAME_OFFSET 0x3AC0F00
-#define SQLITE3_COLUMN_TYPE_OFFSET 0x3AC0D50
-#define SQLITE3_COLUMN_BLOB_OFFSET 0x3AC0530
-#define SQLITE3_COLUMN_BYTES_OFFSET 0x3AC0620
-#define SQLITE3_FINALIZE_OFFSET 0x3ABED90
+#define SQLITE3_EXEC_OFFSET 0x3A5EDA0
+#define SQLITE3_BACKUP_INIT_OFFSET 0x3A18EA0
+#define SQLITE3_PREPARE_OFFSET 0x3A66A20
+#define SQLITE3_OPEN_OFFSET 0x3A9E210
+#define SQLITE3_BACKUP_STEP_OFFSET 0x3A193F0
+#define SQLITE3_BACKUP_REMAINING_OFFSET 0x1B26EB0
+#define SQLITE3_BACKUP_PAGECOUNT_OFFSET 0x1B26EE0
+#define SQLITE3_BACKUP_FINISH_OFFSET 0x3A19AF0
+#define SQLITE3_SLEEP_OFFSET 0x3A9EE70
+#define SQLITE3_ERRCODE_OFFSET 0x3A9CB10
+#define SQLITE3_CLOSE_OFFSET 0x3A9AC70
+#define SQLITE3_STEP_OFFSET 0x3A22DA0
+#define SQLITE3_COLUMN_COUNT_OFFSET 0x3A235C0
+#define SQLITE3_COLUMN_NAME_OFFSET 0x3A23FC0
+#define SQLITE3_COLUMN_TYPE_OFFSET 0x3A23E10
+#define SQLITE3_COLUMN_BLOB_OFFSET 0x3A235F0
+#define SQLITE3_COLUMN_BYTES_OFFSET 0x3A236E0
+#define SQLITE3_FINALIZE_OFFSET 0x3A21E50
typedef int (*Sqlite3_callback)(void *, int, char **, char **);
-typedef int(__cdecl *Sqlite3_exec)(QWORD, /* An open database */
- const char *sql, /* SQL to be evaluated */
- Sqlite3_callback, /* Callback function */
- void *, /* 1st argument to callback */
- char **errmsg /* Error msg written here */
+typedef int(__cdecl *Sqlite3_exec)(QWORD, /* An open database */
+ const char *sql, /* SQL to be evaluated */
+ Sqlite3_callback, /* Callback function */
+ void *, /* 1st argument to callback */
+ char **errmsg /* Error msg written here */
);
typedef QWORD(__cdecl *Sqlite3_backup_init)(QWORD *pDest, /* Destination database handle */
const char *zDestName, /* Destination database name */
QWORD *pSource, /* Source database handle */
const char *zSourceName /* Source database name */
);
-typedef int(__cdecl *Sqlite3_prepare)(QWORD db, /* Database handle */
- const char *zSql, /* SQL statement, UTF-8 encoded */
- int nByte, /* Maximum length of zSql in bytes. */
- QWORD **ppStmt, /* OUT: Statement handle */
- const char **pzTail /* OUT: Pointer to unused portion of zSql */
+typedef int(__cdecl *Sqlite3_prepare)(QWORD db, /* Database handle */
+ const char *zSql, /* SQL statement, UTF-8 encoded */
+ int nByte, /* Maximum length of zSql in bytes. */
+ QWORD **ppStmt, /* OUT: Statement handle */
+ const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
typedef int(__cdecl *Sqlite3_open)(const char *filename, QWORD **ppDb);
typedef int(__cdecl *Sqlite3_backup_step)(QWORD *p, int nPage);
diff --git a/WeChatFerry/spy/user_info.cpp b/WeChatFerry/spy/user_info.cpp
index 3c7152c..f7f2b53 100644
--- a/WeChatFerry/spy/user_info.cpp
+++ b/WeChatFerry/spy/user_info.cpp
@@ -4,10 +4,10 @@
extern UINT64 g_WeChatWinDllAddr;
-#define OS_USER_HOME 0x5A7E190
-#define OS_USER_WXID 0x5AB7F30
-#define OS_USER_NAME 0x5AB8098
-#define OS_USER_MOBILE 0x5AB7FD8
+#define OS_USER_HOME 0x5932770
+#define OS_USER_WXID 0x595C270
+#define OS_USER_NAME 0x595C3D8
+#define OS_USER_MOBILE 0x595C318
static char home[MAX_PATH] = { 0 };
diff --git a/WeChatFerry/vcpkg.json b/WeChatFerry/vcpkg.json
new file mode 100644
index 0000000..d831f6d
--- /dev/null
+++ b/WeChatFerry/vcpkg.json
@@ -0,0 +1,14 @@
+{
+ "name": "wcf",
+ "version-string": "1.0.0",
+ "dependencies": [
+ {
+ "name": "protobuf",
+ "features": [ "zlib" ]
+ },
+ "spdlog",
+ "nng",
+ "magic-enum",
+ "minhook"
+ ]
+}
diff --git a/clients/python/README.MD b/clients/python/README.MD
index 06e92c0..1f4c4b6 100644
--- a/clients/python/README.MD
+++ b/clients/python/README.MD
@@ -1,7 +1,7 @@
# WeChatFerry Python 客户端
[](https://pypi.python.org/pypi/wcferry) [](https://pypi.python.org/pypi/wcferry) [](https://wechatferry.readthedocs.io/zh/latest/?badge=latest)
-|[📖 Python 文档](https://wechatferry.readthedocs.io/)|[📺 Python 视频教程](https://mp.weixin.qq.com/s/APdjGyZ2hllXxyG_sNCfXQ)|[🙋 FAQ](https://mp.weixin.qq.com/s/I6n_6fuQa60CrROWSgq0TA)|
+|[📖 Python 文档](https://wechatferry.readthedocs.io/)|[📺 Python 视频教程](https://mp.weixin.qq.com/s/APdjGyZ2hllXxyG_sNCfXQ)|[🙋 FAQ](https://mp.weixin.qq.com/s/YvgFFhF6D-79kXDzRqtg6w)|
|:-:|:-:|:-:|
🤖示例机器人框架:[WeChatRobot](https://github.com/lich0821/WeChatRobot)。
@@ -44,8 +44,8 @@ python -m grpc_tools.protoc --python_out=. --proto_path=../../../WeChatFerry/rpc
## 版本更新
-### v39.2.4.0 (2024.07.08)
-* 修复 wxid 问题
+### v39.3.3.1
+* 修复 `send_xml`
点击查看更多
@@ -70,14 +70,15 @@ python -m grpc_tools.protoc --python_out=. --proto_path=../../../WeChatFerry/rpc
* 发送图片消息
* 发送文件消息
* 发送卡片消息
-* 发送 GIF
+* 发送 XML 消息
+* 发送 GIF 消息
* 拍一拍群友
* 转发消息
* 开启接收消息
* 关闭接收消息
* 查询数据库
* 获取朋友圈消息
-* 下载图片、视频、文件
+* 下载图片
* 解密图片
* 添加群成员
* 删除群成员
diff --git a/clients/python/roomdata.proto b/clients/python/roomdata.proto
deleted file mode 100644
index 0d61b86..0000000
--- a/clients/python/roomdata.proto
+++ /dev/null
@@ -1,21 +0,0 @@
-syntax = "proto3";
-package com.iamteer.wcf;
-
-message RoomData {
-
- message RoomMember {
- string wxid = 1;
- string name = 2;
- int32 state = 3;
- }
-
- repeated RoomMember members = 1;
-
- int32 field_2 = 2;
- int32 field_3 = 3;
- int32 field_4 = 4;
- int32 room_capacity = 5;
- int32 field_6 = 6;
- int64 field_7 = 7 [jstype = JS_STRING];
- int64 field_8 = 8 [jstype = JS_STRING];
-}
diff --git a/clients/python/wcferry/client.py b/clients/python/wcferry/client.py
index 592b530..6583014 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.2.4.0"
+__version__ = "39.3.3.3"
import atexit
import base64
@@ -20,7 +20,7 @@ import pynng
import requests
from google.protobuf import json_format
from wcferry import wcf_pb2
-from wcferry.roomdata_pb2 import RoomData
+from wcferry.wcf_pb2 import RoomData
from wcferry.wxmsg import WxMsg
@@ -398,7 +398,6 @@ class Wcf():
Returns:
int: 0 为成功,其他失败
"""
- raise Exception("Not implemented, yet")
req = wcf_pb2.Request()
req.func = wcf_pb2.FUNC_SEND_XML # FUNC_SEND_XML
req.xml.receiver = receiver
diff --git a/clients/python/wcferry/roomdata_pb2.py b/clients/python/wcferry/roomdata_pb2.py
deleted file mode 100644
index 23ab48a..0000000
--- a/clients/python/wcferry/roomdata_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler. DO NOT EDIT!
-# source: roomdata.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eroomdata.proto\x12\x0f\x63om.iamteer.wcf\"\xf7\x01\n\x08RoomData\x12\x35\n\x07members\x18\x01 \x03(\x0b\x32$.com.iamteer.wcf.RoomData.RoomMember\x12\x0f\n\x07\x66ield_2\x18\x02 \x01(\x05\x12\x0f\n\x07\x66ield_3\x18\x03 \x01(\x05\x12\x0f\n\x07\x66ield_4\x18\x04 \x01(\x05\x12\x15\n\rroom_capacity\x18\x05 \x01(\x05\x12\x0f\n\x07\x66ield_6\x18\x06 \x01(\x05\x12\x0f\n\x07\x66ield_7\x18\x07 \x01(\x03\x12\x0f\n\x07\x66ield_8\x18\x08 \x01(\x03\x1a\x37\n\nRoomMember\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x05\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'roomdata_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
- DESCRIPTOR._options = None
- _ROOMDATA._serialized_start=36
- _ROOMDATA._serialized_end=283
- _ROOMDATA_ROOMMEMBER._serialized_start=228
- _ROOMDATA_ROOMMEMBER._serialized_end=283
-# @@protoc_insertion_point(module_scope)
diff --git a/clients/python/wcferry/wcf_pb2.py b/clients/python/wcferry/wcf_pb2.py
index e818cfe..da7267e 100644
--- a/clients/python/wcferry/wcf_pb2.py
+++ b/clients/python/wcferry/wcf_pb2.py
@@ -2,9 +2,11 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: wcf.proto
"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
+from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
@@ -13,10 +15,294 @@ _sym_db = _symbol_database.Default()
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\twcf.proto\x12\x03wcf\"\xff\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.MemberMgmtH\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\x12\n\x04ui64\x18\x0c \x01(\x04\x42\x02\x30\x01H\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\x12\x19\n\x02pm\x18\x11 \x01(\x0b\x32\x0b.wcf.PatMsgH\x00\x12\x1d\n\x02\x66m\x18\x12 \x01(\x0b\x32\x0f.wcf.ForwardMsgH\x00\x42\x05\n\x03msg\"\xc7\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\x12\x1a\n\x03ocr\x18\x0b \x01(\x0b\x32\x0b.wcf.OcrMsgH\x00\x42\x05\n\x03msg\"\x07\n\x05\x45mpty\"\xbe\x01\n\x05WxMsg\x12\x0f\n\x07is_self\x18\x01 \x01(\x08\x12\x10\n\x08is_group\x18\x02 \x01(\x08\x12\x0e\n\x02id\x18\x03 \x01(\x04\x42\x02\x30\x01\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\nMemberMgmt\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\"9\n\tAttachMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05thumb\x18\x02 \x01(\t\x12\r\n\x05\x65xtra\x18\x03 \x01(\t\"\'\n\x08\x41udioMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\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\"&\n\x06PatMsg\x12\x0e\n\x06roomid\x18\x01 \x01(\t\x12\x0c\n\x04wxid\x18\x02 \x01(\t\"(\n\x06OcrMsg\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x0e\n\x06result\x18\x02 \x01(\t\".\n\nForwardMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x10\n\x08receiver\x18\x02 \x01(\t*\xf2\x05\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\x15\n\x11\x46UNC_SEND_PAT_MSG\x10&\x12\x14\n\x10\x46UNC_FORWARD_MSG\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\x17\n\x13\x46UNC_REFRESH_QRCODE\x10W\x12\x16\n\x12\x46UNC_DECRYPT_IMAGE\x10`\x12\x11\n\rFUNC_EXEC_OCR\x10\x61\x12\x19\n\x15\x46UNC_ADD_ROOM_MEMBERS\x10p\x12\x19\n\x15\x46UNC_DEL_ROOM_MEMBERS\x10q\x12\x19\n\x15\x46UNC_INV_ROOM_MEMBERS\x10rB\r\n\x0b\x63om.iamteerb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\twcf.proto\x12\x03wcf\"\xff\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.MemberMgmtH\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\x12\n\x04ui64\x18\x0c \x01(\x04\x42\x02\x30\x01H\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\x12\x19\n\x02pm\x18\x11 \x01(\x0b\x32\x0b.wcf.PatMsgH\x00\x12\x1d\n\x02\x66m\x18\x12 \x01(\x0b\x32\x0f.wcf.ForwardMsgH\x00\x42\x05\n\x03msg\"\xc7\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\x12\x1a\n\x03ocr\x18\x0b \x01(\x0b\x32\x0b.wcf.OcrMsgH\x00\x42\x05\n\x03msg\"\x07\n\x05\x45mpty\"\xbe\x01\n\x05WxMsg\x12\x0f\n\x07is_self\x18\x01 \x01(\x08\x12\x10\n\x08is_group\x18\x02 \x01(\x08\x12\x0e\n\x02id\x18\x03 \x01(\x04\x42\x02\x30\x01\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(\x04\"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\nMemberMgmt\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\"9\n\tAttachMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05thumb\x18\x02 \x01(\t\x12\r\n\x05\x65xtra\x18\x03 \x01(\t\"\'\n\x08\x41udioMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\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\"&\n\x06PatMsg\x12\x0e\n\x06roomid\x18\x01 \x01(\t\x12\x0c\n\x04wxid\x18\x02 \x01(\t\"(\n\x06OcrMsg\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x0e\n\x06result\x18\x02 \x01(\t\".\n\nForwardMsg\x12\x0e\n\x02id\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x10\n\x08receiver\x18\x02 \x01(\t\"\xb7\x02\n\x08RoomData\x12)\n\x07members\x18\x01 \x03(\x0b\x32\x18.wcf.RoomData.RoomMember\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x0f\n\x07\x66ield_3\x18\x03 \x01(\x05\x12\x14\n\x07\x66ield_4\x18\x04 \x01(\x05H\x01\x88\x01\x01\x12\x10\n\x08\x63\x61pacity\x18\x05 \x01(\x05\x12\x14\n\x07\x66ield_6\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x0f\n\x07\x66ield_7\x18\x07 \x01(\x05\x12\x0f\n\x07\x66ield_8\x18\x08 \x01(\x05\x12\x0e\n\x06\x61\x64mins\x18\t \x03(\t\x1a\x45\n\nRoomMember\x12\x0c\n\x04wxid\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\r\n\x05state\x18\x03 \x01(\x05\x42\x07\n\x05_nameB\n\n\x08_field_2B\n\n\x08_field_4B\n\n\x08_field_6*\xf2\x05\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\x15\n\x11\x46UNC_SEND_PAT_MSG\x10&\x12\x14\n\x10\x46UNC_FORWARD_MSG\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\x17\n\x13\x46UNC_REFRESH_QRCODE\x10W\x12\x16\n\x12\x46UNC_DECRYPT_IMAGE\x10`\x12\x11\n\rFUNC_EXEC_OCR\x10\x61\x12\x19\n\x15\x46UNC_ADD_ROOM_MEMBERS\x10p\x12\x19\n\x15\x46UNC_DEL_ROOM_MEMBERS\x10q\x12\x19\n\x15\x46UNC_INV_ROOM_MEMBERS\x10rB\r\n\x0b\x63om.iamteerb\x06proto3')
+
+_FUNCTIONS = DESCRIPTOR.enum_types_by_name['Functions']
+Functions = enum_type_wrapper.EnumTypeWrapper(_FUNCTIONS)
+FUNC_RESERVED = 0
+FUNC_IS_LOGIN = 1
+FUNC_GET_SELF_WXID = 16
+FUNC_GET_MSG_TYPES = 17
+FUNC_GET_CONTACTS = 18
+FUNC_GET_DB_NAMES = 19
+FUNC_GET_DB_TABLES = 20
+FUNC_GET_USER_INFO = 21
+FUNC_GET_AUDIO_MSG = 22
+FUNC_SEND_TXT = 32
+FUNC_SEND_IMG = 33
+FUNC_SEND_FILE = 34
+FUNC_SEND_XML = 35
+FUNC_SEND_EMOTION = 36
+FUNC_SEND_RICH_TXT = 37
+FUNC_SEND_PAT_MSG = 38
+FUNC_FORWARD_MSG = 39
+FUNC_ENABLE_RECV_TXT = 48
+FUNC_DISABLE_RECV_TXT = 64
+FUNC_EXEC_DB_QUERY = 80
+FUNC_ACCEPT_FRIEND = 81
+FUNC_RECV_TRANSFER = 82
+FUNC_REFRESH_PYQ = 83
+FUNC_DOWNLOAD_ATTACH = 84
+FUNC_GET_CONTACT_INFO = 85
+FUNC_REVOKE_MSG = 86
+FUNC_REFRESH_QRCODE = 87
+FUNC_DECRYPT_IMAGE = 96
+FUNC_EXEC_OCR = 97
+FUNC_ADD_ROOM_MEMBERS = 112
+FUNC_DEL_ROOM_MEMBERS = 113
+FUNC_INV_ROOM_MEMBERS = 114
+
+
+_REQUEST = DESCRIPTOR.message_types_by_name['Request']
+_RESPONSE = DESCRIPTOR.message_types_by_name['Response']
+_EMPTY = DESCRIPTOR.message_types_by_name['Empty']
+_WXMSG = DESCRIPTOR.message_types_by_name['WxMsg']
+_TEXTMSG = DESCRIPTOR.message_types_by_name['TextMsg']
+_PATHMSG = DESCRIPTOR.message_types_by_name['PathMsg']
+_XMLMSG = DESCRIPTOR.message_types_by_name['XmlMsg']
+_MSGTYPES = DESCRIPTOR.message_types_by_name['MsgTypes']
+_MSGTYPES_TYPESENTRY = _MSGTYPES.nested_types_by_name['TypesEntry']
+_RPCCONTACT = DESCRIPTOR.message_types_by_name['RpcContact']
+_RPCCONTACTS = DESCRIPTOR.message_types_by_name['RpcContacts']
+_DBNAMES = DESCRIPTOR.message_types_by_name['DbNames']
+_DBTABLE = DESCRIPTOR.message_types_by_name['DbTable']
+_DBTABLES = DESCRIPTOR.message_types_by_name['DbTables']
+_DBQUERY = DESCRIPTOR.message_types_by_name['DbQuery']
+_DBFIELD = DESCRIPTOR.message_types_by_name['DbField']
+_DBROW = DESCRIPTOR.message_types_by_name['DbRow']
+_DBROWS = DESCRIPTOR.message_types_by_name['DbRows']
+_VERIFICATION = DESCRIPTOR.message_types_by_name['Verification']
+_MEMBERMGMT = DESCRIPTOR.message_types_by_name['MemberMgmt']
+_USERINFO = DESCRIPTOR.message_types_by_name['UserInfo']
+_DECPATH = DESCRIPTOR.message_types_by_name['DecPath']
+_TRANSFER = DESCRIPTOR.message_types_by_name['Transfer']
+_ATTACHMSG = DESCRIPTOR.message_types_by_name['AttachMsg']
+_AUDIOMSG = DESCRIPTOR.message_types_by_name['AudioMsg']
+_RICHTEXT = DESCRIPTOR.message_types_by_name['RichText']
+_PATMSG = DESCRIPTOR.message_types_by_name['PatMsg']
+_OCRMSG = DESCRIPTOR.message_types_by_name['OcrMsg']
+_FORWARDMSG = DESCRIPTOR.message_types_by_name['ForwardMsg']
+_ROOMDATA = DESCRIPTOR.message_types_by_name['RoomData']
+_ROOMDATA_ROOMMEMBER = _ROOMDATA.nested_types_by_name['RoomMember']
+Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), {
+ 'DESCRIPTOR' : _REQUEST,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.Request)
+ })
+_sym_db.RegisterMessage(Request)
+
+Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+ 'DESCRIPTOR' : _RESPONSE,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.Response)
+ })
+_sym_db.RegisterMessage(Response)
+
+Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
+ 'DESCRIPTOR' : _EMPTY,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.Empty)
+ })
+_sym_db.RegisterMessage(Empty)
+
+WxMsg = _reflection.GeneratedProtocolMessageType('WxMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _WXMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.WxMsg)
+ })
+_sym_db.RegisterMessage(WxMsg)
+
+TextMsg = _reflection.GeneratedProtocolMessageType('TextMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _TEXTMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.TextMsg)
+ })
+_sym_db.RegisterMessage(TextMsg)
+
+PathMsg = _reflection.GeneratedProtocolMessageType('PathMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _PATHMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.PathMsg)
+ })
+_sym_db.RegisterMessage(PathMsg)
+
+XmlMsg = _reflection.GeneratedProtocolMessageType('XmlMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _XMLMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.XmlMsg)
+ })
+_sym_db.RegisterMessage(XmlMsg)
+
+MsgTypes = _reflection.GeneratedProtocolMessageType('MsgTypes', (_message.Message,), {
+
+ 'TypesEntry' : _reflection.GeneratedProtocolMessageType('TypesEntry', (_message.Message,), {
+ 'DESCRIPTOR' : _MSGTYPES_TYPESENTRY,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.MsgTypes.TypesEntry)
+ })
+ ,
+ 'DESCRIPTOR' : _MSGTYPES,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.MsgTypes)
+ })
+_sym_db.RegisterMessage(MsgTypes)
+_sym_db.RegisterMessage(MsgTypes.TypesEntry)
+
+RpcContact = _reflection.GeneratedProtocolMessageType('RpcContact', (_message.Message,), {
+ 'DESCRIPTOR' : _RPCCONTACT,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.RpcContact)
+ })
+_sym_db.RegisterMessage(RpcContact)
+
+RpcContacts = _reflection.GeneratedProtocolMessageType('RpcContacts', (_message.Message,), {
+ 'DESCRIPTOR' : _RPCCONTACTS,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.RpcContacts)
+ })
+_sym_db.RegisterMessage(RpcContacts)
+
+DbNames = _reflection.GeneratedProtocolMessageType('DbNames', (_message.Message,), {
+ 'DESCRIPTOR' : _DBNAMES,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbNames)
+ })
+_sym_db.RegisterMessage(DbNames)
+
+DbTable = _reflection.GeneratedProtocolMessageType('DbTable', (_message.Message,), {
+ 'DESCRIPTOR' : _DBTABLE,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbTable)
+ })
+_sym_db.RegisterMessage(DbTable)
+
+DbTables = _reflection.GeneratedProtocolMessageType('DbTables', (_message.Message,), {
+ 'DESCRIPTOR' : _DBTABLES,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbTables)
+ })
+_sym_db.RegisterMessage(DbTables)
+
+DbQuery = _reflection.GeneratedProtocolMessageType('DbQuery', (_message.Message,), {
+ 'DESCRIPTOR' : _DBQUERY,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbQuery)
+ })
+_sym_db.RegisterMessage(DbQuery)
+
+DbField = _reflection.GeneratedProtocolMessageType('DbField', (_message.Message,), {
+ 'DESCRIPTOR' : _DBFIELD,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbField)
+ })
+_sym_db.RegisterMessage(DbField)
+
+DbRow = _reflection.GeneratedProtocolMessageType('DbRow', (_message.Message,), {
+ 'DESCRIPTOR' : _DBROW,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbRow)
+ })
+_sym_db.RegisterMessage(DbRow)
+
+DbRows = _reflection.GeneratedProtocolMessageType('DbRows', (_message.Message,), {
+ 'DESCRIPTOR' : _DBROWS,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DbRows)
+ })
+_sym_db.RegisterMessage(DbRows)
+
+Verification = _reflection.GeneratedProtocolMessageType('Verification', (_message.Message,), {
+ 'DESCRIPTOR' : _VERIFICATION,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.Verification)
+ })
+_sym_db.RegisterMessage(Verification)
+
+MemberMgmt = _reflection.GeneratedProtocolMessageType('MemberMgmt', (_message.Message,), {
+ 'DESCRIPTOR' : _MEMBERMGMT,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.MemberMgmt)
+ })
+_sym_db.RegisterMessage(MemberMgmt)
+
+UserInfo = _reflection.GeneratedProtocolMessageType('UserInfo', (_message.Message,), {
+ 'DESCRIPTOR' : _USERINFO,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.UserInfo)
+ })
+_sym_db.RegisterMessage(UserInfo)
+
+DecPath = _reflection.GeneratedProtocolMessageType('DecPath', (_message.Message,), {
+ 'DESCRIPTOR' : _DECPATH,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.DecPath)
+ })
+_sym_db.RegisterMessage(DecPath)
+
+Transfer = _reflection.GeneratedProtocolMessageType('Transfer', (_message.Message,), {
+ 'DESCRIPTOR' : _TRANSFER,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.Transfer)
+ })
+_sym_db.RegisterMessage(Transfer)
+
+AttachMsg = _reflection.GeneratedProtocolMessageType('AttachMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _ATTACHMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.AttachMsg)
+ })
+_sym_db.RegisterMessage(AttachMsg)
+
+AudioMsg = _reflection.GeneratedProtocolMessageType('AudioMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _AUDIOMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.AudioMsg)
+ })
+_sym_db.RegisterMessage(AudioMsg)
+
+RichText = _reflection.GeneratedProtocolMessageType('RichText', (_message.Message,), {
+ 'DESCRIPTOR' : _RICHTEXT,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.RichText)
+ })
+_sym_db.RegisterMessage(RichText)
+
+PatMsg = _reflection.GeneratedProtocolMessageType('PatMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _PATMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.PatMsg)
+ })
+_sym_db.RegisterMessage(PatMsg)
+
+OcrMsg = _reflection.GeneratedProtocolMessageType('OcrMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _OCRMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.OcrMsg)
+ })
+_sym_db.RegisterMessage(OcrMsg)
+
+ForwardMsg = _reflection.GeneratedProtocolMessageType('ForwardMsg', (_message.Message,), {
+ 'DESCRIPTOR' : _FORWARDMSG,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.ForwardMsg)
+ })
+_sym_db.RegisterMessage(ForwardMsg)
+
+RoomData = _reflection.GeneratedProtocolMessageType('RoomData', (_message.Message,), {
+
+ 'RoomMember' : _reflection.GeneratedProtocolMessageType('RoomMember', (_message.Message,), {
+ 'DESCRIPTOR' : _ROOMDATA_ROOMMEMBER,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.RoomData.RoomMember)
+ })
+ ,
+ 'DESCRIPTOR' : _ROOMDATA,
+ '__module__' : 'wcf_pb2'
+ # @@protoc_insertion_point(class_scope:wcf.RoomData)
+ })
+_sym_db.RegisterMessage(RoomData)
+_sym_db.RegisterMessage(RoomData.RoomMember)
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'wcf_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
@@ -33,8 +319,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_AUDIOMSG.fields_by_name['id']._serialized_options = b'0\001'
_FORWARDMSG.fields_by_name['id']._options = None
_FORWARDMSG.fields_by_name['id']._serialized_options = b'0\001'
- _FUNCTIONS._serialized_start=2414
- _FUNCTIONS._serialized_end=3168
+ _FUNCTIONS._serialized_start=2728
+ _FUNCTIONS._serialized_end=3482
_REQUEST._serialized_start=19
_REQUEST._serialized_end=530
_RESPONSE._serialized_start=533
@@ -93,4 +379,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_OCRMSG._serialized_end=2363
_FORWARDMSG._serialized_start=2365
_FORWARDMSG._serialized_end=2411
+ _ROOMDATA._serialized_start=2414
+ _ROOMDATA._serialized_end=2725
+ _ROOMDATA_ROOMMEMBER._serialized_start=2620
+ _ROOMDATA_ROOMMEMBER._serialized_end=2689
# @@protoc_insertion_point(module_scope)