Merge pull request #400 from PathfinderAx/master

feat: [wcf-bmc]-版本更改为v39.5.2
This commit is contained in:
Changhua 2025-05-04 12:48:17 +08:00 committed by GitHub
commit a064255149
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
106 changed files with 748 additions and 254 deletions

View File

@ -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/>
___
___

View File

@ -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

Binary file not shown.

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

Binary file not shown.

View File

@ -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>

View File

@ -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());

View File

@ -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;
/**
* 接收消息回调开关

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -63,6 +63,10 @@ public class ContactGroupMonitorTask {
*/
private Boolean initStatus = false;
/**
* 定时任务-联系人群组监控
* TODO-存在BUG 仅当做案例进行展示
*/
@Scheduled(cron = "0 0 0 * * ?")
public void scheduled() {
if (true) {

View File

@ -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
# 接收消息回调地址

View 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>

View File

@ -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