Merge pull request #400 from PathfinderAx/master
feat: [wcf-bmc]-版本更改为v39.5.2
This commit is contained in:
commit
a064255149
@ -18,6 +18,125 @@ ___
|
||||
|
||||
<br/><br/>
|
||||
|
||||
## v39.5.2
|
||||
|
||||
### 版本列表
|
||||
|
||||
下载地址:[v39.5.2](https://github.com/lich0821/WeChatFerry/releases/tag/v39.5.2)
|
||||
|
||||
| 名称 | 版本 | 文件名 |
|
||||
|-----------------|-----------|---------------------------|
|
||||
| 微信客户端 | 3.9.12.51 | WeChatSetup-3.9.12.51.exe |
|
||||
| WeChatFerry-SDK | 39.5.2 | v39.5.2.zip |
|
||||
| wcf-bmc | 39.5.2.1 | wcf-bmc-39.5.2.1.jar |
|
||||
|
||||
### 功能列表
|
||||
|
||||
| 接口名 | 地址 |
|
||||
|----------------|------------------------|
|
||||
| 查询登录状态 | /loginStatus |
|
||||
| 获取登录微信内部识别号UID | /loginWeChatUid |
|
||||
| 获取登录微信信息 | /loginWeChatInfo |
|
||||
| 获取消息类型列表 | /list/msgType |
|
||||
| 获取联系人列表 | /list/contacts |
|
||||
| 获取数据库表名称列表 | /list/dbTableName |
|
||||
| 获取指定数据库中的表列表 | /list/dbTable |
|
||||
| 执行数据库查询SQL | /exec/dbQuerySql |
|
||||
| 发送消息汇总入口 | /send/msgMaster |
|
||||
| 发送文本消息 | /send/textMsg |
|
||||
| 发送富文本消息 | /send/richTextMsg |
|
||||
| 发送XML消息 | /send/xmlMsg |
|
||||
| 发送图片消息 | /send/imageMsg |
|
||||
| 发送表情消息 | /send/emojiMsg |
|
||||
| 发送文件消息 | /send/fileMsg |
|
||||
| 拍一拍群友 | /patOnePat |
|
||||
| 撤回消息 | /revokeMsg |
|
||||
| 通过好友申请 | /passFriendApply |
|
||||
| 添加群成员为微信好友 | /addFriend/groupMember |
|
||||
| 查询群成员 | /groupMember/list |
|
||||
| 邀请群成员 | /groupMember/invite |
|
||||
| 删除群成员 | /groupMember/delete |
|
||||
| 查询朋友圈 | /friendCircle |
|
||||
| 接收转账 | /receiveTransfer |
|
||||
|
||||
### 已知bug
|
||||
|
||||
v39.5.2版本目前会出现注入失败的情况,待排查修复,可先使用v39.5.1,只须替换dll版本即可
|
||||
|
||||
### 2025-05-03
|
||||
|
||||
- 1.更新dll为v39.5.2
|
||||
|
||||
<br/>
|
||||
|
||||
___
|
||||
|
||||
<br/><br/>
|
||||
|
||||
## v39.5.1 - 推荐✨
|
||||
|
||||
### 版本列表
|
||||
|
||||
下载地址:[v39.5.1](https://github.com/lich0821/WeChatFerry/releases/tag/v39.5.1)
|
||||
|
||||
| 名称 | 版本 | 文件名 |
|
||||
|-----------------|-----------|---------------------------|
|
||||
| 微信客户端 | 3.9.12.51 | WeChatSetup-3.9.12.51.exe |
|
||||
| WeChatFerry-SDK | 39.5.1 | v39.5.1.zip |
|
||||
| wcf-bmc | 39.5.1.1 | wcf-bmc-39.5.1.1.jar |
|
||||
|
||||
### 功能列表
|
||||
|
||||
| 接口名 | 地址 | 是否支持 | 备注 |
|
||||
|----------------|------------------------|------|--------|
|
||||
| 查询登录状态 | /loginStatus | ✔️ | 已测试 |
|
||||
| 获取登录微信内部识别号UID | /loginWeChatUid | ✔️ | 已测试 |
|
||||
| 获取登录微信信息 | /loginWeChatInfo | ✔️ | 已测试 |
|
||||
| 获取消息类型列表 | /list/msgType | ✔️ | 已测试 |
|
||||
| 获取联系人列表 | /list/contacts | ✔️ | 已测试 |
|
||||
| 获取数据库表名称列表 | /list/dbTableName | ✔️ | 已测试 |
|
||||
| 获取指定数据库中的表列表 | /list/dbTable | ✔️ | 已测试 |
|
||||
| 执行数据库查询SQL | /exec/dbQuerySql | ✔️ | 已测试 |
|
||||
| 发送消息汇总入口 | /send/msgMaster | ❌ | 预留 |
|
||||
| 发送文本消息 | /send/textMsg | ✔️ | 已测试 |
|
||||
| 发送富文本消息 | /send/richTextMsg | ❌ | 已知BUG |
|
||||
| 发送XML消息 | /send/xmlMsg | ❌ | 该版本不支持 |
|
||||
| 发送图片消息 | /send/imageMsg | ✔️ | 已测试 |
|
||||
| 发送表情消息 | /send/emojiMsg | ✔️ | 已测试 |
|
||||
| 发送文件消息 | /send/fileMsg | ✔️ | 已测试 |
|
||||
| 拍一拍群友 | /patOnePat | ✔️ | 已测试 |
|
||||
| 撤回消息 | /revokeMsg | ❌ | 该版本不支持 |
|
||||
| 通过好友申请 | /passFriendApply | ❌ | 该版本不支持 |
|
||||
| 添加群成员为微信好友 | /addFriend/groupMember | ❔ | 待测试 |
|
||||
| 查询群成员 | /groupMember/list | ✔️ | 已测试 |
|
||||
| 邀请群成员 | /groupMember/invite | ❔ | 待测试 |
|
||||
| 删除群成员 | /groupMember/delete | ❔ | 待测试 |
|
||||
| 查询朋友圈 | /friendCircle | ❔ | 待测试 |
|
||||
| 接收转账 | /receiveTransfer | ❌ | 该版本不支持 |
|
||||
|
||||
### 提示
|
||||
|
||||
v39.5.2版本目前会出现注入失败的情况,暂时推迟更新至该版本,故本次采用v39.5.1进行过渡
|
||||
|
||||
### 2025-05-03
|
||||
|
||||
- 1.修复不同群定制不同功能号的配置文件参数取值错误问题,修改写法
|
||||
|
||||
### 2025-05-01
|
||||
|
||||
- 1.更新DLL版本迭代
|
||||
- 2.更新说明文件
|
||||
- 3.修改群消息策略功能,支持指定对应的群开启对应的功能
|
||||
- 4.SDK调试模式新增配置文件参数,默认不开启
|
||||
- 5.proto文件同步更新
|
||||
- 6.目录名称变更为wcf-bmc
|
||||
|
||||
<br/>
|
||||
|
||||
___
|
||||
|
||||
<br/><br/>
|
||||
|
||||
## v39.4.2
|
||||
|
||||
### 版本列表
|
||||
@ -227,7 +346,7 @@ ___
|
||||
|
||||
<br/><br/>
|
||||
|
||||
## v39.2.4 - 推荐✨
|
||||
## v39.2.4
|
||||
|
||||
### 版本列表
|
||||
|
||||
@ -269,4 +388,4 @@ ___
|
||||
|
||||
<br/>
|
||||
|
||||
___
|
||||
___
|
@ -1,4 +1,4 @@
|
||||
# WeChatFerry Java 客户端 maven版
|
||||
# WCF-BMC 【WeChatFerry中的Springboot+Maven版的客户端】
|
||||
|
||||
⚠️ **只支持 Windows** ⚠️
|
||||
|
||||
@ -13,8 +13,8 @@
|
||||
|-----------------|-----------|----|
|
||||
| JDK | 1.8+ | √ |
|
||||
| Maven | 3.8+ | √ |
|
||||
| 微信客户端 | 3.9.12.17 | √ |
|
||||
| WeChatFerry-SDK | 39.4.2 | √ |
|
||||
| 微信客户端 | 3.9.12.51 | √ |
|
||||
| WeChatFerry-SDK | 39.5.2 | √ |
|
||||
| MySQL | 8.0+ | 备用 |
|
||||
|
||||
### 下载文件
|
||||
@ -25,17 +25,17 @@
|
||||
|
||||
可以直接以WeChatFerry为根目录打开
|
||||
|
||||
或者以WeChatFerry/clients/java/wechat-ferry-mvn为根目录打开
|
||||
或者以WeChatFerry/clients/java/wcf-bmc为根目录打开
|
||||
|
||||
### 添加Maven
|
||||
|
||||
找到 WeChatFerry/clients/java/wechat-ferry-mvn/pom.xml 文件,右键添加到Maven中,会自动下载依赖
|
||||
找到 WeChatFerry/clients/java/wcf-bmc/pom.xml 文件,右键添加到Maven中,会自动下载依赖
|
||||
|
||||
### 替换对应版本的dll
|
||||
|
||||
把刚下载的最新发布文件解压到本项目中的 dll 文件目录下,直接替换原因文件即可
|
||||
|
||||
替换 `clients/java/wechat-ferry-mvn/dll` 目录下(也可以在配置文件中改为自定义的目录)
|
||||
替换 `clients/java/wcf-bmc/dll` 目录下(也可以在配置文件中改为自定义的目录)
|
||||
|
||||
- sdk.dll
|
||||
- spy.dll
|
||||
@ -54,11 +54,11 @@
|
||||
```yaml
|
||||
# 本服务参数
|
||||
wechat:
|
||||
ferry:
|
||||
# DLL文件位置
|
||||
dll-path: E:\WeChatFerry\clients\java\wechat-ferry-mvn\dll\sdk.dll
|
||||
# socket端口
|
||||
socket-port: 10086
|
||||
ferry:
|
||||
# DLL文件位置
|
||||
dll-path: E:\WeChatFerry\clients\java\wcf-bmc\dll\sdk.dll
|
||||
# socket端口
|
||||
socket-port: 10086
|
||||
```
|
||||
|
||||
### 数据库修改-目前未使用
|
||||
@ -77,6 +77,74 @@ wechat:
|
||||
|
||||
swagger地址:http://localhost:9201/swagger-ui/index.html
|
||||
|
||||
### 项目打包
|
||||
|
||||
使用maven插件打包
|
||||
|
||||
- 先 clean
|
||||
- 在 install
|
||||
|
||||
或者进入到项目根目录使用命令打包
|
||||
|
||||
``` shell
|
||||
cd wcf-bmc
|
||||
|
||||
mvn clean
|
||||
|
||||
mvn install
|
||||
```
|
||||
|
||||
打包后的文件在target/wcf-bmc-xx.x.x.x-SNAPSHOT.jar
|
||||
|
||||
## 安装部署
|
||||
|
||||
### 服务器环境
|
||||
|
||||
| 名称 | 版本 | 备注 |
|
||||
|-------|--------|----|
|
||||
| JDK | 1.8+ | √ |
|
||||
| 微信客户端 | 安装对应版本 | √ |
|
||||
|
||||
### 整合安装包
|
||||
|
||||
自己在项目中找到对应的文件,手动复制过去
|
||||
|
||||
```
|
||||
wcf-bmc
|
||||
├─dll 核心dll目录
|
||||
│ ├─sdk.dll sdk文件
|
||||
│ ├─spy.dll spy文件
|
||||
│ ├─spy_debug.dll spy文件
|
||||
│ └─DISCLAIMER.md DISCLAIMER文件
|
||||
│
|
||||
├─bin 命令目录
|
||||
│ └─run.bat 启动命令
|
||||
│
|
||||
├─config 配置文件目录
|
||||
│ ├─application.yml 配置文件
|
||||
│ └─logback-spring.xml 日志配置文件
|
||||
│
|
||||
├─wcf-bmc-xx.x.x.x.jar 打包后的源码包
|
||||
│
|
||||
|
||||
```
|
||||
|
||||
### 启动
|
||||
|
||||
1.退出微信客户端后台
|
||||
|
||||
2.进入命令黑窗口(CMD),并进入到项目目录下
|
||||
|
||||
``` shell
|
||||
cd wcf
|
||||
```
|
||||
|
||||
3.执行启动命令,jar名称换成自己的
|
||||
|
||||
``` shell
|
||||
java -Dconfig.dir=./config -jar wcf-bmc-xx.x.x.x.jar
|
||||
```
|
||||
|
||||
## 参与开发
|
||||
|
||||
### 核心依赖
|
||||
@ -96,11 +164,14 @@ swagger地址:http://localhost:9201/swagger-ui/index.html
|
||||
### 模块结构
|
||||
|
||||
```
|
||||
wechat-ferry-mvn
|
||||
wcf-bmc
|
||||
├─dll 核心dll
|
||||
│ ├─sdk.dll sdk文件
|
||||
│ └─readme.txt 本目录说明文件
|
||||
│
|
||||
│
|
||||
├─images 图片
|
||||
│ └─md MD文档图片
|
||||
│
|
||||
├─src 源
|
||||
│ ├─main 重启命令
|
||||
│ │ ├─java(com.wechat.ferry) java代码目录
|
||||
@ -129,10 +200,11 @@ wechat-ferry-mvn
|
||||
│ │ │ ├─win32-x86-64 依赖程序
|
||||
│ │ │ ├─application.yml 本程序主配置文件
|
||||
│ │ │ └─logback-spring.xml 日志配置文件
|
||||
│
|
||||
│
|
||||
├─CHANGELOG.md 更新日志文件
|
||||
├─pom.xml POM文件
|
||||
├─README.MD 说明文件
|
||||
│
|
||||
│
|
||||
|
||||
```
|
||||
|
||||
@ -198,7 +270,7 @@ message RoomData
|
||||
如:
|
||||
|
||||
```cmd
|
||||
feat(0): [java]-[wechat-ferry-mvn]-基础类目录划分迁移及代码格式
|
||||
feat(0): [wcf-bmc]-基础类目录划分迁移及代码格式
|
||||
```
|
||||
|
||||
| 名称 | 版本 |
|
||||
@ -211,6 +283,13 @@ feat(0): [java]-[wechat-ferry-mvn]-基础类目录划分迁移及代码格式
|
||||
|
||||
下面主要是针对一些合作开发者的咨询做统一回复,可以直接忽略。
|
||||
|
||||
#### 项目名称的由来
|
||||
|
||||
WCF-BCM <br/>
|
||||
WCF是WeChatFerry <br/>
|
||||
第一层:BMC是Business Management Center的缩写 <br/>
|
||||
第二层:BMC是SpringBoot Maven Client <br/>
|
||||
|
||||
#### 目录层级拆分太细
|
||||
|
||||
其实这个服务是底层服务,目录分细确实会增加开发量,但是针对于后面的拓展和维护上来说,个人感觉利大于弊,
|
BIN
clients/java/wcf-bmc/dll/sdk.dll
vendored
Normal file
BIN
clients/java/wcf-bmc/dll/sdk.dll
vendored
Normal file
Binary file not shown.
BIN
clients/java/wcf-bmc/dll/spy.dll
vendored
Normal file
BIN
clients/java/wcf-bmc/dll/spy.dll
vendored
Normal file
Binary file not shown.
BIN
clients/java/wcf-bmc/dll/spy_debug.dll
vendored
Normal file
BIN
clients/java/wcf-bmc/dll/spy_debug.dll
vendored
Normal file
Binary file not shown.
@ -11,15 +11,19 @@
|
||||
<version>2.7.18</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>wechat-ferry-mvn</artifactId>
|
||||
<artifactId>wcf-bmc</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>wechat-ferry-mvn</name>
|
||||
<version>39.2.4</version>
|
||||
<description>WeChatFerry客户端Java-Maven版</description>
|
||||
<name>wcf-bmc</name>
|
||||
<version>39.5.2.1</version>
|
||||
<description>WeChatFerry Springboot Maven Client (WCF-Springboot的Maven版客户端)</description>
|
||||
|
||||
<scm>
|
||||
<url>https://github.com/PathfinderAx/WeChatFerry</url>
|
||||
</scm>
|
||||
|
||||
<properties>
|
||||
<application.main.class>com.wechat.ferry.WeChatFerryApplication</application.main.class>
|
||||
<app.name>wechat-ferry-mvn</app.name>
|
||||
<app.name>wcf-bmc</app.name>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@ -36,6 +40,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- 参数校验依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
<!--thymeleaf-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
@ -53,12 +62,6 @@
|
||||
<version>1.18.30</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- 参数校验 -->
|
||||
<dependency>
|
||||
<groupId>javax.validation</groupId>
|
||||
<artifactId>validation-api</artifactId>
|
||||
<version>2.0.1.Final</version>
|
||||
</dependency>
|
||||
<!-- swagger3包-->
|
||||
<dependency>
|
||||
<groupId>io.springfox</groupId>
|
||||
@ -82,12 +85,19 @@
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>4.5.13</version>
|
||||
</dependency>
|
||||
|
||||
<!-- okhttp3依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.10.0</version>
|
||||
</dependency>
|
||||
<!-- protobuf依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
<version>3.22.2</version>
|
||||
</dependency>
|
||||
<!-- JNA主要用于在 Java 程序中方便地调用本地(Native)代码,如 C/C++ 的动态链接库(DLL)或共享库(SO) -->
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
@ -162,8 +172,8 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<finalName>${app.name}-${project.version}</finalName>
|
||||
<includeSystemScope>true</includeSystemScope>
|
||||
<!-- 主类入口 -->
|
||||
<mainClass>${application.main.class}</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
@ -33,7 +33,8 @@ public class WeChatConfiguration {
|
||||
// Client client = new Client("127.0.0.1", 10086);
|
||||
|
||||
// 本地启动 RPC
|
||||
WeChatSocketClient wechatSocketClient = new WeChatSocketClient(properties.getSocketPort(), properties.getDllPath());
|
||||
WeChatSocketClient wechatSocketClient =
|
||||
new WeChatSocketClient(properties.getSocketPort(), properties.getSdkDebugSwitch(), properties.getDllPath());
|
||||
|
||||
// 是否已登录
|
||||
// log.info("isLogin: {}", client.isLogin());
|
@ -29,6 +29,11 @@ public class WeChatFerryProperties {
|
||||
*/
|
||||
private Integer socketPort;
|
||||
|
||||
/**
|
||||
* SDK是否调试模式
|
||||
*/
|
||||
private Boolean sdkDebugSwitch = false;
|
||||
|
||||
/**
|
||||
* 联系人类型-官方杂号,禁止与其他分类重复(格式:代码|名称)
|
||||
* 使用时记得需要提取代码或者名称匹配
|
||||
@ -42,9 +47,16 @@ public class WeChatFerryProperties {
|
||||
private List<String> contactsTypeOfficial;
|
||||
|
||||
/**
|
||||
* 需要开启消息处理的群
|
||||
* 消息处理的群开关
|
||||
*/
|
||||
private List<String> openMsgGroups;
|
||||
private Boolean openMsgGroupSwitch = false;
|
||||
|
||||
/**
|
||||
* 需要开启消息处理的群
|
||||
* 格式:key:群编号 val:开启的功能号,对应ReceiveMsgChannelEnum枚举中的code
|
||||
* 53257911728@chatroom: 1,2
|
||||
*/
|
||||
private Map<String, String> openMsgGroups;
|
||||
|
||||
/**
|
||||
* 接收消息回调开关
|
@ -147,6 +147,10 @@ public final class Wcf {
|
||||
* <code>FUNC_INV_ROOM_MEMBERS = 114;</code>
|
||||
*/
|
||||
FUNC_INV_ROOM_MEMBERS(114),
|
||||
/**
|
||||
* <code>FUNC_SHUTDOWN = 255;</code>
|
||||
*/
|
||||
FUNC_SHUTDOWN(255),
|
||||
UNRECOGNIZED(-1),
|
||||
;
|
||||
|
||||
@ -278,6 +282,10 @@ public final class Wcf {
|
||||
* <code>FUNC_INV_ROOM_MEMBERS = 114;</code>
|
||||
*/
|
||||
public static final int FUNC_INV_ROOM_MEMBERS_VALUE = 114;
|
||||
/**
|
||||
* <code>FUNC_SHUTDOWN = 255;</code>
|
||||
*/
|
||||
public static final int FUNC_SHUTDOWN_VALUE = 255;
|
||||
|
||||
|
||||
public final int getNumber() {
|
||||
@ -336,6 +344,7 @@ public final class Wcf {
|
||||
case 112: return FUNC_ADD_ROOM_MEMBERS;
|
||||
case 113: return FUNC_DEL_ROOM_MEMBERS;
|
||||
case 114: return FUNC_INV_ROOM_MEMBERS;
|
||||
case 255: return FUNC_SHUTDOWN;
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
@ -9101,7 +9110,7 @@ public final class Wcf {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -9110,7 +9119,7 @@ public final class Wcf {
|
||||
java.lang.String getThumb();
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -9121,7 +9130,7 @@ public final class Wcf {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -9130,7 +9139,7 @@ public final class Wcf {
|
||||
java.lang.String getExtra();
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -9141,7 +9150,7 @@ public final class Wcf {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -9150,7 +9159,7 @@ public final class Wcf {
|
||||
java.lang.String getXml();
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -9469,7 +9478,7 @@ public final class Wcf {
|
||||
private volatile java.lang.Object thumb_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -9490,7 +9499,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -9516,7 +9525,7 @@ public final class Wcf {
|
||||
private volatile java.lang.Object extra_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -9537,7 +9546,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -9563,7 +9572,7 @@ public final class Wcf {
|
||||
private volatile java.lang.Object xml_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -9584,7 +9593,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -10750,7 +10759,7 @@ public final class Wcf {
|
||||
private java.lang.Object thumb_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -10770,7 +10779,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -10791,7 +10800,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -10808,7 +10817,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -10822,7 +10831,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 缩略图
|
||||
* 视频或图片消息的缩略图路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string thumb = 10;</code>
|
||||
@ -10842,7 +10851,7 @@ public final class Wcf {
|
||||
private java.lang.Object extra_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -10862,7 +10871,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -10883,7 +10892,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -10900,7 +10909,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -10914,7 +10923,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 附加内容
|
||||
* 附加内容,视频或图片消息的路径
|
||||
* </pre>
|
||||
*
|
||||
* <code>string extra = 11;</code>
|
||||
@ -10934,7 +10943,7 @@ public final class Wcf {
|
||||
private java.lang.Object xml_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -10954,7 +10963,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -10975,7 +10984,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -10992,7 +11001,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -11006,7 +11015,7 @@ public final class Wcf {
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 消息 xml
|
||||
* 消息 xml 部分
|
||||
* </pre>
|
||||
*
|
||||
* <code>string xml = 12;</code>
|
||||
@ -23636,6 +23645,26 @@ java.lang.String defaultValue) {
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getHomeBytes();
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The alias.
|
||||
*/
|
||||
java.lang.String getAlias();
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The bytes for alias.
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getAliasBytes();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code wcf.UserInfo}
|
||||
@ -23654,6 +23683,7 @@ java.lang.String defaultValue) {
|
||||
name_ = "";
|
||||
mobile_ = "";
|
||||
home_ = "";
|
||||
alias_ = "";
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
@ -23864,6 +23894,53 @@ java.lang.String defaultValue) {
|
||||
}
|
||||
}
|
||||
|
||||
public static final int ALIAS_FIELD_NUMBER = 5;
|
||||
@SuppressWarnings("serial")
|
||||
private volatile java.lang.Object alias_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The alias.
|
||||
*/
|
||||
@java.lang.Override
|
||||
public java.lang.String getAlias() {
|
||||
java.lang.Object ref = alias_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
return (java.lang.String) ref;
|
||||
} else {
|
||||
com.google.protobuf.ByteString bs =
|
||||
(com.google.protobuf.ByteString) ref;
|
||||
java.lang.String s = bs.toStringUtf8();
|
||||
alias_ = s;
|
||||
return s;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The bytes for alias.
|
||||
*/
|
||||
@java.lang.Override
|
||||
public com.google.protobuf.ByteString
|
||||
getAliasBytes() {
|
||||
java.lang.Object ref = alias_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
alias_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
|
||||
private byte memoizedIsInitialized = -1;
|
||||
@java.lang.Override
|
||||
public final boolean isInitialized() {
|
||||
@ -23890,6 +23967,9 @@ java.lang.String defaultValue) {
|
||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(home_)) {
|
||||
com.google.protobuf.GeneratedMessageV3.writeString(output, 4, home_);
|
||||
}
|
||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alias_)) {
|
||||
com.google.protobuf.GeneratedMessageV3.writeString(output, 5, alias_);
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
@ -23911,6 +23991,9 @@ java.lang.String defaultValue) {
|
||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(home_)) {
|
||||
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, home_);
|
||||
}
|
||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alias_)) {
|
||||
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, alias_);
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSize = size;
|
||||
return size;
|
||||
@ -23934,6 +24017,8 @@ java.lang.String defaultValue) {
|
||||
.equals(other.getMobile())) return false;
|
||||
if (!getHome()
|
||||
.equals(other.getHome())) return false;
|
||||
if (!getAlias()
|
||||
.equals(other.getAlias())) return false;
|
||||
if (!getUnknownFields().equals(other.getUnknownFields())) return false;
|
||||
return true;
|
||||
}
|
||||
@ -23953,6 +24038,8 @@ java.lang.String defaultValue) {
|
||||
hash = (53 * hash) + getMobile().hashCode();
|
||||
hash = (37 * hash) + HOME_FIELD_NUMBER;
|
||||
hash = (53 * hash) + getHome().hashCode();
|
||||
hash = (37 * hash) + ALIAS_FIELD_NUMBER;
|
||||
hash = (53 * hash) + getAlias().hashCode();
|
||||
hash = (29 * hash) + getUnknownFields().hashCode();
|
||||
memoizedHashCode = hash;
|
||||
return hash;
|
||||
@ -24086,6 +24173,7 @@ java.lang.String defaultValue) {
|
||||
name_ = "";
|
||||
mobile_ = "";
|
||||
home_ = "";
|
||||
alias_ = "";
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -24131,6 +24219,9 @@ java.lang.String defaultValue) {
|
||||
if (((from_bitField0_ & 0x00000008) != 0)) {
|
||||
result.home_ = home_;
|
||||
}
|
||||
if (((from_bitField0_ & 0x00000010) != 0)) {
|
||||
result.alias_ = alias_;
|
||||
}
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
@ -24165,6 +24256,11 @@ java.lang.String defaultValue) {
|
||||
bitField0_ |= 0x00000008;
|
||||
onChanged();
|
||||
}
|
||||
if (!other.getAlias().isEmpty()) {
|
||||
alias_ = other.alias_;
|
||||
bitField0_ |= 0x00000010;
|
||||
onChanged();
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
onChanged();
|
||||
return this;
|
||||
@ -24211,6 +24307,11 @@ java.lang.String defaultValue) {
|
||||
bitField0_ |= 0x00000008;
|
||||
break;
|
||||
} // case 34
|
||||
case 42: {
|
||||
alias_ = input.readStringRequireUtf8();
|
||||
bitField0_ |= 0x00000010;
|
||||
break;
|
||||
} // case 42
|
||||
default: {
|
||||
if (!super.parseUnknownField(input, extensionRegistry, tag)) {
|
||||
done = true; // was an endgroup tag
|
||||
@ -24595,6 +24696,98 @@ java.lang.String defaultValue) {
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
private java.lang.Object alias_ = "";
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The alias.
|
||||
*/
|
||||
public java.lang.String getAlias() {
|
||||
java.lang.Object ref = alias_;
|
||||
if (!(ref instanceof java.lang.String)) {
|
||||
com.google.protobuf.ByteString bs =
|
||||
(com.google.protobuf.ByteString) ref;
|
||||
java.lang.String s = bs.toStringUtf8();
|
||||
alias_ = s;
|
||||
return s;
|
||||
} else {
|
||||
return (java.lang.String) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return The bytes for alias.
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getAliasBytes() {
|
||||
java.lang.Object ref = alias_;
|
||||
if (ref instanceof String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
alias_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @param value The alias to set.
|
||||
* @return This builder for chaining.
|
||||
*/
|
||||
public Builder setAlias(
|
||||
java.lang.String value) {
|
||||
if (value == null) { throw new NullPointerException(); }
|
||||
alias_ = value;
|
||||
bitField0_ |= 0x00000010;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @return This builder for chaining.
|
||||
*/
|
||||
public Builder clearAlias() {
|
||||
alias_ = getDefaultInstance().getAlias();
|
||||
bitField0_ = (bitField0_ & ~0x00000010);
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 修改后的wxid
|
||||
* </pre>
|
||||
*
|
||||
* <code>string alias = 5;</code>
|
||||
* @param value The bytes for alias to set.
|
||||
* @return This builder for chaining.
|
||||
*/
|
||||
public Builder setAliasBytes(
|
||||
com.google.protobuf.ByteString value) {
|
||||
if (value == null) { throw new NullPointerException(); }
|
||||
checkByteStringIsUtf8(value);
|
||||
alias_ = value;
|
||||
bitField0_ |= 0x00000010;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
@java.lang.Override
|
||||
public final Builder setUnknownFields(
|
||||
final com.google.protobuf.UnknownFieldSet unknownFields) {
|
||||
@ -34213,48 +34406,48 @@ java.lang.String defaultValue) {
|
||||
"d\"\"\n\006DbRows\022\030\n\004rows\030\001 \003(\0132\n.wcf.DbRow\"5\n" +
|
||||
"\014Verification\022\n\n\002v3\030\001 \001(\t\022\n\n\002v4\030\002 \001(\t\022\r\n" +
|
||||
"\005scene\030\003 \001(\005\"+\n\nMemberMgmt\022\016\n\006roomid\030\001 \001" +
|
||||
"(\t\022\r\n\005wxids\030\002 \001(\t\"D\n\010UserInfo\022\014\n\004wxid\030\001 " +
|
||||
"(\t\022\r\n\005wxids\030\002 \001(\t\"S\n\010UserInfo\022\014\n\004wxid\030\001 " +
|
||||
"\001(\t\022\014\n\004name\030\002 \001(\t\022\016\n\006mobile\030\003 \001(\t\022\014\n\004hom" +
|
||||
"e\030\004 \001(\t\"#\n\007DecPath\022\013\n\003src\030\001 \001(\t\022\013\n\003dst\030\002" +
|
||||
" \001(\t\"4\n\010Transfer\022\014\n\004wxid\030\001 \001(\t\022\014\n\004tfid\030\002" +
|
||||
" \001(\t\022\014\n\004taid\030\003 \001(\t\"9\n\tAttachMsg\022\016\n\002id\030\001 " +
|
||||
"\001(\004B\0020\001\022\r\n\005thumb\030\002 \001(\t\022\r\n\005extra\030\003 \001(\t\"\'\n" +
|
||||
"\010AudioMsg\022\016\n\002id\030\001 \001(\004B\0020\001\022\013\n\003dir\030\002 \001(\t\"y" +
|
||||
"\n\010RichText\022\014\n\004name\030\001 \001(\t\022\017\n\007account\030\002 \001(" +
|
||||
"\t\022\r\n\005title\030\003 \001(\t\022\016\n\006digest\030\004 \001(\t\022\013\n\003url\030" +
|
||||
"\005 \001(\t\022\020\n\010thumburl\030\006 \001(\t\022\020\n\010receiver\030\007 \001(" +
|
||||
"\t\"&\n\006PatMsg\022\016\n\006roomid\030\001 \001(\t\022\014\n\004wxid\030\002 \001(" +
|
||||
"\t\"(\n\006OcrMsg\022\016\n\006status\030\001 \001(\005\022\016\n\006result\030\002 " +
|
||||
"\001(\t\".\n\nForwardMsg\022\016\n\002id\030\001 \001(\004B\0020\001\022\020\n\010rec" +
|
||||
"eiver\030\002 \001(\t\"\267\002\n\010RoomData\022)\n\007members\030\001 \003(" +
|
||||
"\0132\030.wcf.RoomData.RoomMember\022\024\n\007field_2\030\002" +
|
||||
" \001(\005H\000\210\001\001\022\017\n\007field_3\030\003 \001(\005\022\024\n\007field_4\030\004 " +
|
||||
"\001(\005H\001\210\001\001\022\020\n\010capacity\030\005 \001(\005\022\024\n\007field_6\030\006 " +
|
||||
"\001(\tH\002\210\001\001\022\017\n\007field_7\030\007 \001(\005\022\017\n\007field_8\030\010 \001" +
|
||||
"(\005\022\016\n\006admins\030\t \003(\t\032E\n\nRoomMember\022\014\n\004wxid" +
|
||||
"\030\001 \001(\t\022\021\n\004name\030\002 \001(\tH\000\210\001\001\022\r\n\005state\030\003 \001(\005" +
|
||||
"B\007\n\005_nameB\n\n\010_field_2B\n\n\010_field_4B\n\n\010_fi" +
|
||||
"eld_6*\362\005\n\tFunctions\022\021\n\rFUNC_RESERVED\020\000\022\021" +
|
||||
"\n\rFUNC_IS_LOGIN\020\001\022\026\n\022FUNC_GET_SELF_WXID\020" +
|
||||
"\020\022\026\n\022FUNC_GET_MSG_TYPES\020\021\022\025\n\021FUNC_GET_CO" +
|
||||
"NTACTS\020\022\022\025\n\021FUNC_GET_DB_NAMES\020\023\022\026\n\022FUNC_" +
|
||||
"GET_DB_TABLES\020\024\022\026\n\022FUNC_GET_USER_INFO\020\025\022" +
|
||||
"\026\n\022FUNC_GET_AUDIO_MSG\020\026\022\021\n\rFUNC_SEND_TXT" +
|
||||
"\020 \022\021\n\rFUNC_SEND_IMG\020!\022\022\n\016FUNC_SEND_FILE\020" +
|
||||
"\"\022\021\n\rFUNC_SEND_XML\020#\022\025\n\021FUNC_SEND_EMOTIO" +
|
||||
"N\020$\022\026\n\022FUNC_SEND_RICH_TXT\020%\022\025\n\021FUNC_SEND" +
|
||||
"_PAT_MSG\020&\022\024\n\020FUNC_FORWARD_MSG\020\'\022\030\n\024FUNC" +
|
||||
"_ENABLE_RECV_TXT\0200\022\031\n\025FUNC_DISABLE_RECV_" +
|
||||
"TXT\020@\022\026\n\022FUNC_EXEC_DB_QUERY\020P\022\026\n\022FUNC_AC" +
|
||||
"CEPT_FRIEND\020Q\022\026\n\022FUNC_RECV_TRANSFER\020R\022\024\n" +
|
||||
"\020FUNC_REFRESH_PYQ\020S\022\030\n\024FUNC_DOWNLOAD_ATT" +
|
||||
"ACH\020T\022\031\n\025FUNC_GET_CONTACT_INFO\020U\022\023\n\017FUNC" +
|
||||
"_REVOKE_MSG\020V\022\027\n\023FUNC_REFRESH_QRCODE\020W\022\026" +
|
||||
"\n\022FUNC_DECRYPT_IMAGE\020`\022\021\n\rFUNC_EXEC_OCR\020" +
|
||||
"a\022\031\n\025FUNC_ADD_ROOM_MEMBERS\020p\022\031\n\025FUNC_DEL" +
|
||||
"_ROOM_MEMBERS\020q\022\031\n\025FUNC_INV_ROOM_MEMBERS" +
|
||||
"\020rB\037\n\035com.wechat.ferry.entity.protob\006pro" +
|
||||
"to3"
|
||||
"e\030\004 \001(\t\022\r\n\005alias\030\005 \001(\t\"#\n\007DecPath\022\013\n\003src" +
|
||||
"\030\001 \001(\t\022\013\n\003dst\030\002 \001(\t\"4\n\010Transfer\022\014\n\004wxid\030" +
|
||||
"\001 \001(\t\022\014\n\004tfid\030\002 \001(\t\022\014\n\004taid\030\003 \001(\t\"9\n\tAtt" +
|
||||
"achMsg\022\016\n\002id\030\001 \001(\004B\0020\001\022\r\n\005thumb\030\002 \001(\t\022\r\n" +
|
||||
"\005extra\030\003 \001(\t\"\'\n\010AudioMsg\022\016\n\002id\030\001 \001(\004B\0020\001" +
|
||||
"\022\013\n\003dir\030\002 \001(\t\"y\n\010RichText\022\014\n\004name\030\001 \001(\t\022" +
|
||||
"\017\n\007account\030\002 \001(\t\022\r\n\005title\030\003 \001(\t\022\016\n\006diges" +
|
||||
"t\030\004 \001(\t\022\013\n\003url\030\005 \001(\t\022\020\n\010thumburl\030\006 \001(\t\022\020" +
|
||||
"\n\010receiver\030\007 \001(\t\"&\n\006PatMsg\022\016\n\006roomid\030\001 \001" +
|
||||
"(\t\022\014\n\004wxid\030\002 \001(\t\"(\n\006OcrMsg\022\016\n\006status\030\001 \001" +
|
||||
"(\005\022\016\n\006result\030\002 \001(\t\".\n\nForwardMsg\022\016\n\002id\030\001" +
|
||||
" \001(\004B\0020\001\022\020\n\010receiver\030\002 \001(\t\"\267\002\n\010RoomData\022" +
|
||||
")\n\007members\030\001 \003(\0132\030.wcf.RoomData.RoomMemb" +
|
||||
"er\022\024\n\007field_2\030\002 \001(\005H\000\210\001\001\022\017\n\007field_3\030\003 \001(" +
|
||||
"\005\022\024\n\007field_4\030\004 \001(\005H\001\210\001\001\022\020\n\010capacity\030\005 \001(" +
|
||||
"\005\022\024\n\007field_6\030\006 \001(\tH\002\210\001\001\022\017\n\007field_7\030\007 \001(\005" +
|
||||
"\022\017\n\007field_8\030\010 \001(\005\022\016\n\006admins\030\t \003(\t\032E\n\nRoo" +
|
||||
"mMember\022\014\n\004wxid\030\001 \001(\t\022\021\n\004name\030\002 \001(\tH\000\210\001\001" +
|
||||
"\022\r\n\005state\030\003 \001(\005B\007\n\005_nameB\n\n\010_field_2B\n\n\010" +
|
||||
"_field_4B\n\n\010_field_6*\206\006\n\tFunctions\022\021\n\rFU" +
|
||||
"NC_RESERVED\020\000\022\021\n\rFUNC_IS_LOGIN\020\001\022\026\n\022FUNC" +
|
||||
"_GET_SELF_WXID\020\020\022\026\n\022FUNC_GET_MSG_TYPES\020\021" +
|
||||
"\022\025\n\021FUNC_GET_CONTACTS\020\022\022\025\n\021FUNC_GET_DB_N" +
|
||||
"AMES\020\023\022\026\n\022FUNC_GET_DB_TABLES\020\024\022\026\n\022FUNC_G" +
|
||||
"ET_USER_INFO\020\025\022\026\n\022FUNC_GET_AUDIO_MSG\020\026\022\021" +
|
||||
"\n\rFUNC_SEND_TXT\020 \022\021\n\rFUNC_SEND_IMG\020!\022\022\n\016" +
|
||||
"FUNC_SEND_FILE\020\"\022\021\n\rFUNC_SEND_XML\020#\022\025\n\021F" +
|
||||
"UNC_SEND_EMOTION\020$\022\026\n\022FUNC_SEND_RICH_TXT" +
|
||||
"\020%\022\025\n\021FUNC_SEND_PAT_MSG\020&\022\024\n\020FUNC_FORWAR" +
|
||||
"D_MSG\020\'\022\030\n\024FUNC_ENABLE_RECV_TXT\0200\022\031\n\025FUN" +
|
||||
"C_DISABLE_RECV_TXT\020@\022\026\n\022FUNC_EXEC_DB_QUE" +
|
||||
"RY\020P\022\026\n\022FUNC_ACCEPT_FRIEND\020Q\022\026\n\022FUNC_REC" +
|
||||
"V_TRANSFER\020R\022\024\n\020FUNC_REFRESH_PYQ\020S\022\030\n\024FU" +
|
||||
"NC_DOWNLOAD_ATTACH\020T\022\031\n\025FUNC_GET_CONTACT" +
|
||||
"_INFO\020U\022\023\n\017FUNC_REVOKE_MSG\020V\022\027\n\023FUNC_REF" +
|
||||
"RESH_QRCODE\020W\022\026\n\022FUNC_DECRYPT_IMAGE\020`\022\021\n" +
|
||||
"\rFUNC_EXEC_OCR\020a\022\031\n\025FUNC_ADD_ROOM_MEMBER" +
|
||||
"S\020p\022\031\n\025FUNC_DEL_ROOM_MEMBERS\020q\022\031\n\025FUNC_I" +
|
||||
"NV_ROOM_MEMBERS\020r\022\022\n\rFUNC_SHUTDOWN\020\377\001B\037\n" +
|
||||
"\035com.wechat.ferry.entity.protob\006proto3"
|
||||
};
|
||||
descriptor = com.google.protobuf.Descriptors.FileDescriptor
|
||||
.internalBuildGeneratedFileFrom(descriptorData,
|
||||
@ -34385,7 +34578,7 @@ java.lang.String defaultValue) {
|
||||
internal_static_wcf_UserInfo_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
|
||||
internal_static_wcf_UserInfo_descriptor,
|
||||
new java.lang.String[] { "Wxid", "Name", "Mobile", "Home", });
|
||||
new java.lang.String[] { "Wxid", "Name", "Mobile", "Home", "Alias", });
|
||||
internal_static_wcf_DecPath_descriptor =
|
||||
getDescriptor().getMessageTypes().get(20);
|
||||
internal_static_wcf_DecPath_fieldAccessorTable = new
|
@ -9,7 +9,7 @@ import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 枚举-接收消息处理渠道
|
||||
*
|
||||
*
|
||||
* @author chandler
|
||||
* @date 2024/12/25 14:15
|
||||
*/
|
||||
@ -27,7 +27,7 @@ public enum ReceiveMsgChannelEnum {
|
||||
*/
|
||||
UN_MATCH("", null),
|
||||
|
||||
// 结束
|
||||
// END
|
||||
;
|
||||
|
||||
private final String code;
|
@ -75,12 +75,17 @@ public class WeChatSocketClient {
|
||||
private BlockingQueue<WxMsg> msgQ;
|
||||
|
||||
private final String host;
|
||||
|
||||
private final Integer port;
|
||||
|
||||
public WeChatSocketClient(Integer port, String dllPath) {
|
||||
this(DEFAULT_HOST, port, false, dllPath);
|
||||
}
|
||||
|
||||
public WeChatSocketClient(Integer port, boolean debug, String dllPath) {
|
||||
this(DEFAULT_HOST, port, debug, dllPath);
|
||||
}
|
||||
|
||||
public WeChatSocketClient(String host, Integer port, boolean debug, String dllPath) {
|
||||
this.host = host;
|
||||
this.port = port;
|
||||
@ -120,7 +125,7 @@ public class WeChatSocketClient {
|
||||
|
||||
public Response sendCmd(Request req) {
|
||||
try {
|
||||
// 设置超时时间 20s
|
||||
// 设置发送 20 秒超时
|
||||
cmdSocket.setSendTimeout(20000);
|
||||
ByteBuffer bb = ByteBuffer.wrap(req.toByteArray());
|
||||
cmdSocket.send(bb);
|
||||
@ -138,6 +143,33 @@ public class WeChatSocketClient {
|
||||
}
|
||||
}
|
||||
|
||||
private void listenMsg(String url) {
|
||||
try {
|
||||
msgSocket = new Pair1Socket();
|
||||
msgSocket.dial(url);
|
||||
// 设置接收 5 秒超时
|
||||
msgSocket.setReceiveTimeout(5000);
|
||||
} catch (Exception e) {
|
||||
log.error("创建消息 RPC 失败", e);
|
||||
return;
|
||||
}
|
||||
ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE);
|
||||
while (isReceivingMsg) {
|
||||
try {
|
||||
long size = msgSocket.receive(bb, true);
|
||||
WxMsg wxMsg = Response.parseFrom(Arrays.copyOfRange(bb.array(), 0, (int)size)).getWxmsg();
|
||||
msgQ.put(wxMsg);
|
||||
} catch (Exception e) {
|
||||
// 多半是超时,忽略吧
|
||||
}
|
||||
}
|
||||
try {
|
||||
msgSocket.close();
|
||||
} catch (Exception e) {
|
||||
log.error("关闭连接失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前微信客户端是否登录微信号
|
||||
*
|
||||
@ -217,33 +249,6 @@ public class WeChatSocketClient {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void listenMsg(String url) {
|
||||
try {
|
||||
msgSocket = new Pair1Socket();
|
||||
msgSocket.dial(url);
|
||||
// 设置 2 秒超时
|
||||
msgSocket.setReceiveTimeout(2000);
|
||||
} catch (Exception e) {
|
||||
log.error("创建消息 RPC 失败", e);
|
||||
return;
|
||||
}
|
||||
ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE);
|
||||
while (isReceivingMsg) {
|
||||
try {
|
||||
long size = msgSocket.receive(bb, true);
|
||||
WxMsg wxMsg = Response.parseFrom(Arrays.copyOfRange(bb.array(), 0, (int)size)).getWxmsg();
|
||||
msgQ.put(wxMsg);
|
||||
} catch (Exception e) {
|
||||
// 多半是超时,忽略吧
|
||||
}
|
||||
}
|
||||
try {
|
||||
msgSocket.close();
|
||||
} catch (Exception e) {
|
||||
log.error("关闭连接失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void enableRecvMsg(int qSize) {
|
||||
if (isReceivingMsg) {
|
||||
return;
|
@ -1,6 +1,11 @@
|
||||
package com.wechat.ferry.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@ -39,21 +44,59 @@ public class WeChatMsgServiceImpl implements WeChatMsgService {
|
||||
// 转为JSON对象
|
||||
WxPpMsgDTO dto = JSON.parseObject(jsonString, WxPpMsgDTO.class);
|
||||
// 有开启的群聊配置
|
||||
if (!CollectionUtils.isEmpty(weChatFerryProperties.getOpenMsgGroups())) {
|
||||
// 指定处理的群聊
|
||||
if (weChatFerryProperties.getOpenMsgGroups().contains(dto.getRoomId()) || weChatFerryProperties.getOpenMsgGroups().contains("ALL")) {
|
||||
// TODO 模式有多种 1-根据消息类型单独调用某一个 2-全部调用,各业务类中自己决定是否继续
|
||||
if (true) {
|
||||
// 因为一种消息允许进行多种处理,这里采用执行所有策略,请自行在各策略中判断是否需要执行
|
||||
for (ReceiveMsgStrategy value : ReceiveMsgFactory.getAllStrategyContainers().values()) {
|
||||
value.doHandle(dto);
|
||||
if (weChatFerryProperties.getOpenMsgGroupSwitch() && !weChatFerryProperties.getOpenMsgGroups().isEmpty()) {
|
||||
Map<String, List<String>> openMsgGroupMap = new LinkedHashMap<>();
|
||||
String allFnNoStr = "";
|
||||
List<String> allFnNoList = new ArrayList<>();
|
||||
if (weChatFerryProperties.getOpenMsgGroups().containsKey("ALL")) {
|
||||
allFnNoStr = weChatFerryProperties.getOpenMsgGroups().get("ALL");
|
||||
// 分割字符串并去除空格及空元素
|
||||
allFnNoList = Arrays.stream(allFnNoStr.split(","))
|
||||
// 去掉前后空格
|
||||
.map(String::trim)
|
||||
// 过滤掉空字符串
|
||||
.filter(s -> !s.isEmpty())
|
||||
// 去重
|
||||
.distinct().collect(Collectors.toList());
|
||||
openMsgGroupMap.put("ALL", allFnNoList);
|
||||
}
|
||||
|
||||
// 遍历
|
||||
for (String key : weChatFerryProperties.getOpenMsgGroups().keySet()) {
|
||||
List<String> valList = new ArrayList<>();
|
||||
if (!"ALL".equals(key)) {
|
||||
String str = weChatFerryProperties.getOpenMsgGroups().get(key);
|
||||
String[] arr = str.split(",");
|
||||
for (String s : arr) {
|
||||
// 去重,且ALL中不包含
|
||||
if (!valList.contains(s) && !allFnNoList.contains(s)) {
|
||||
valList.add(s);
|
||||
}
|
||||
}
|
||||
openMsgGroupMap.put(key, valList);
|
||||
}
|
||||
}
|
||||
|
||||
// 指定处理的群聊
|
||||
if (!openMsgGroupMap.isEmpty()) {
|
||||
log.debug("[收到消息后处理]-[汇总后的所有功能]-openMsgGroupMap:{}", openMsgGroupMap);
|
||||
List<String> fnNoList = new ArrayList<>();
|
||||
// 先执行所有群都需要执行的
|
||||
if (openMsgGroupMap.containsKey("ALL")) {
|
||||
fnNoList = openMsgGroupMap.get("ALL");
|
||||
}
|
||||
// 加入个性化的
|
||||
if (openMsgGroupMap.containsKey(dto.getRoomId())) {
|
||||
fnNoList.addAll(openMsgGroupMap.get(dto.getRoomId()));
|
||||
}
|
||||
// 需要执行的策略
|
||||
if (!CollectionUtils.isEmpty(fnNoList)) {
|
||||
log.debug("[收到消息后处理]-[汇总后的单群功能]-fnNoList:{},群号:{}", fnNoList, dto.getRoomId());
|
||||
for (String no : fnNoList) {
|
||||
// 根据功能号获取对应的策略
|
||||
ReceiveMsgStrategy receiveMsgStrategy = ReceiveMsgFactory.getStrategy(no);
|
||||
receiveMsgStrategy.doHandle(dto);
|
||||
}
|
||||
} else {
|
||||
// 单独调用某一种
|
||||
// 这里自己把消息类型转为自己的枚举类型
|
||||
String handleType = "1";
|
||||
ReceiveMsgStrategy receiveMsgStrategy = ReceiveMsgFactory.getStrategy(handleType);
|
||||
receiveMsgStrategy.doHandle(dto);
|
||||
}
|
||||
}
|
||||
}
|
@ -63,6 +63,10 @@ public class ContactGroupMonitorTask {
|
||||
*/
|
||||
private Boolean initStatus = false;
|
||||
|
||||
/**
|
||||
* 定时任务-联系人群组监控
|
||||
* TODO-存在BUG 仅当做案例进行展示
|
||||
*/
|
||||
@Scheduled(cron = "0 0 0 * * ?")
|
||||
public void scheduled() {
|
||||
if (true) {
|
@ -9,7 +9,7 @@ spring:
|
||||
# 配置应用信息
|
||||
application:
|
||||
# 应用名
|
||||
name: wechat-ferry
|
||||
name: wcf-bmc
|
||||
# swagger适配
|
||||
mvc:
|
||||
pathmatch:
|
||||
@ -23,18 +23,25 @@ logging:
|
||||
wechat:
|
||||
ferry:
|
||||
# DLL文件位置
|
||||
dll-path: E:\WeChatFerry\clients\java\wechat-ferry-mvn\dll\sdk.dll
|
||||
dll-path: E:\WeChatFerry\clients\java\wcf-bmc\dll\sdk.dll
|
||||
# socket端口
|
||||
socket-port: 10086
|
||||
# SDK是否调试模式
|
||||
sdk-debug-switch: false
|
||||
# 联系人类型-官方杂号,禁止与其他分类重复(格式:代码|名称)
|
||||
contacts-type-mixed:
|
||||
- filehelper|文件传输助手
|
||||
# 联系人类型-公众号,禁止与其他分类重复(格式:代码|名称)
|
||||
contacts-type-official:
|
||||
- weixinguanhaozhushou|微信公众平台
|
||||
# 接收消息回调开关
|
||||
open-msg-group-switch: false
|
||||
# 需要开启消息处理的群
|
||||
open-msg-groups:
|
||||
- 53257911728@chatroom
|
||||
# key:"[群编号]" val:开启的功能号,对应ReceiveMsgChannelEnum枚举中的code
|
||||
"[ALL]": ''
|
||||
"[53257911730@chatroom]": '1,2,3'
|
||||
"[50501762866@chatroom]": '1,3'
|
||||
# 接收消息回调开关
|
||||
receive-msg-callback-switch: false
|
||||
# 接收消息回调地址
|
119
clients/java/wcf-bmc/src/main/resources/logback-spring.xml
vendored
Normal file
119
clients/java/wcf-bmc/src/main/resources/logback-spring.xml
vendored
Normal file
@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<configuration debug="false" scan="false">
|
||||
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
|
||||
<property name="log.path" value="logs/${spring.application.name}"/>
|
||||
<property name="log.name" value="${spring.application.name}"/>
|
||||
|
||||
<!-- 彩色日志格式 -->
|
||||
<property name="CONSOLE_LOG_PATTERN"
|
||||
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
|
||||
<!-- 彩色日志依赖的渲染类 -->
|
||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
|
||||
<conversionRule conversionWord="wex"
|
||||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
|
||||
<conversionRule conversionWord="wEx"
|
||||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
|
||||
<!-- Console log output -->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- Log file debug output -->
|
||||
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/debug.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
|
||||
<maxFileSize>50MB</maxFileSize>
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 追加方式记录日志 -->
|
||||
<append>true</append>
|
||||
<!-- 日志文件的格式 -->
|
||||
<encoder>
|
||||
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- Log file error output -->
|
||||
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/error.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
|
||||
<maxFileSize>50MB</maxFileSize>
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 追加方式记录日志 -->
|
||||
<append>true</append>
|
||||
<!-- 日志文件的格式 -->
|
||||
<encoder>
|
||||
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
<!-- 此日志文件只记录error级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>ERROR</level>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- Log file file output -->
|
||||
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/${log.name}.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/${log.name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<maxFileSize>200MB</maxFileSize>
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 追加方式记录日志 -->
|
||||
<append>true</append>
|
||||
<!-- 日志文件的格式 -->
|
||||
<encoder>
|
||||
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
|
||||
<!--
|
||||
DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
|
||||
INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
|
||||
WARN: 输出警告信息;表明会出现潜在错误的情形。
|
||||
ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
|
||||
FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
|
||||
ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
|
||||
OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。
|
||||
日志级别(按照范围从小到大排序):OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
|
||||
范围大的会包含范围小的,例如日志设置为INFO级别的话则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。
|
||||
-->
|
||||
<!--
|
||||
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
|
||||
<logger>仅有一个name属性,
|
||||
一个可选的level和一个可选的addtivity属性。
|
||||
name:用来指定受此logger约束的某一个包或者具体的某一个类。
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
如果未设置此属性,那么当前logger将会继承上级的级别。
|
||||
-->
|
||||
|
||||
<!-- 日志监听器 屏蔽 -->
|
||||
<logger name="org.springframework.boot.autoconfigure.logging" level="INFO">
|
||||
<appender-ref ref="console"/>
|
||||
</logger>
|
||||
|
||||
<!-- spring相关 WARN -->
|
||||
<logger name="org.springframework.web" level="WARN"/>
|
||||
<logger name="org.springframework.controllers" level="WARN"/>
|
||||
|
||||
<!-- HttpClient 设置为 INFO -->
|
||||
<logger name="org.apache.http" level="INFO"/>
|
||||
|
||||
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
|
||||
<root level="DEBUG">
|
||||
<appender-ref ref="console"/>
|
||||
<!-- <appender-ref ref="debug"/> -->
|
||||
<!-- <appender-ref ref="error"/> -->
|
||||
<appender-ref ref="file"/>
|
||||
</root>
|
||||
</configuration>
|
@ -36,6 +36,7 @@ enum Functions {
|
||||
FUNC_ADD_ROOM_MEMBERS = 0x70;
|
||||
FUNC_DEL_ROOM_MEMBERS = 0x71;
|
||||
FUNC_INV_ROOM_MEMBERS = 0x72;
|
||||
FUNC_SHUTDOWN = 0xFF;
|
||||
}
|
||||
|
||||
message Request
|
||||
@ -94,9 +95,9 @@ message WxMsg
|
||||
string content = 7; // 消息内容
|
||||
string sender = 8; // 消息发送者
|
||||
string sign = 9; // Sign
|
||||
string thumb = 10; // 缩略图
|
||||
string extra = 11; // 附加内容
|
||||
string xml = 12; // 消息 xml
|
||||
string thumb = 10; // 视频或图片消息的缩略图路径
|
||||
string extra = 11; // 附加内容,视频或图片消息的路径
|
||||
string xml = 12; // 消息 xml 部分
|
||||
}
|
||||
|
||||
message TextMsg
|
||||
@ -178,6 +179,7 @@ message UserInfo
|
||||
string name = 2; // 昵称
|
||||
string mobile = 3; // 手机号
|
||||
string home = 4; // 文件/图片等父路径
|
||||
string alias = 5; // 修改后的wxid
|
||||
}
|
||||
|
||||
message DecPath
|
||||
@ -254,4 +256,4 @@ message RoomData
|
||||
int32 field_7 = 7;
|
||||
int32 field_8 = 8;
|
||||
repeated string admins = 9; // 管理员
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user