开通会话内容存档获取聊天记录
前提
-
✅ 配置准备
- 确保管理员在后台开通了会话内容存档,并配置了存档范围(指定群聊或成员)。
- 保存好
RSA公钥
(企业微信提供)和私钥
(自行保管,用于解密)。
-
✅ 获取必要的凭证
corpid
(企业ID)、secret
(应用密钥)、access_token
(临时令牌)。
-
✅ 调用接口拉取消息
- 使用
GetChatData
接口分页获取加密消息(注意seq
和limit
参数)。
- 使用
-
✅ 解密消息
- 用私钥解密
encrypt_chat_msg
字段,处理不同消息类型(文本、图片、文件等)。
- 用私钥解密
-
✅ 存储与分析
- 将解密后的消息存入数据库或日志系统,按业务需求分析(如审计、质检等)。
常见问题处理
-
Q: 拉取的消息不全?
- 检查
seq
参数是否递增,确保覆盖所有消息范围。 - 确认存档范围是否包含目标群聊。
- 检查
-
Q: 解密失败?
- 检查私钥格式是否正确(需为PKCS#8格式,去除头尾标记如
-----BEGIN PRIVATE KEY-----
)。 - 确认加密字段是否完整(避免传输过程中截断)。
- 检查私钥格式是否正确(需为PKCS#8格式,去除头尾标记如
-
Q: 如何实时获取新消息?
- 企业微信不支持主动推送,需定时轮询(例如每分钟调用一次
GetChatData
,记录最后一条消息的seq
)。
- 企业微信不支持主动推送,需定时轮询(例如每分钟调用一次
示例代码片段补充
http版:
1. RSA解密工具类(Java)
import javax.crypto.Cipher;
import java.security.PrivateKey;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;public class RSAUtil {public static String decrypt(String encryptedMsg, String privateKeyStr) throws Exception {// 去除私钥字符串的头尾标记privateKeyStr = privateKeyStr.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s", "");// 解码Base64私钥byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);// 解密Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMsg));return new String(decryptedBytes);}
}
2. 分页拉取消息的循环逻辑
int seq = 0;
int limit = 100;
while (true) {String requestBody = String.format("{\"seq\":%d, \"limit\":%d, \"proxybuff\":1}", seq, limit);HttpResponse response = HttpClient.sendPost(chatDataUrl, requestBody);JSONObject data = JSON.parseObject(response.body());List<JSONObject> messages = data.getJSONArray("chatdata").toJavaList(JSONObject.class);if (messages.isEmpty()) break; // 无更多消息时退出for (JSONObject msg : messages) {// 解密并处理消息String decryptedMsg = RSAUtil.decrypt(msg.getString("encrypt_chat_msg"), privateKey);System.out.println(decryptedMsg);seq = msg.getInteger("seq"); // 更新seq为当前最后一条}
}
下一步建议
- 测试环境验证:先在小范围群聊中测试,确认解密和消息解析逻辑正确。
- 日志监控:记录接口调用异常(如token过期、解密失败),方便排查问题。
- 合规性检查:确保符合企业内部政策和法律法规(如告知员工)。
实现
要获取企业微信开通了会话内容存档功能的群聊记录,需通过企业微信提供的 会话内容存档接口 实现。以下是具体步骤和代码示例:
前提条件
- 企业已开通会话内容存档功能(需管理员在后台申请权限)。
- 获取以下权限:
- 企业微信管理员权限(配置存档范围和密钥)。
- API调用权限:获取
corpid
(企业ID)、secret
(应用密钥)等。
步骤 1:配置会话内容存档
- 登录企业微信管理后台:
- 进入 「管理工具」-「会话内容存档」,设置存档范围(指定成员或全员)。
- 获取加密密钥:
- 在存档配置页面下载 RSA公钥,并保存企业提供的 加密私钥(用于解密消息)。
步骤 2:调用企业微信API获取聊天记录
通过企业微信的 GetChatData
接口 拉取群聊记录,需注意:
- 消息是加密的,需使用私钥解密。
- 支持拉取文本、图片、文件、语音等消息类型(需处理不同消息格式)。
API 接口说明
- 接口地址:
https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_chatdata?access_token=ACCESS_TOKEN
- 请求方式:POST(JSON 格式)
- 请求参数示例:
{"seq": 0, // 起始消息序号(从0开始)"limit": 100, // 每次拉取条数(最大1000)"proxybuff": 1 // 代理缓冲标记(固定为1)}
步骤 3:代码实现(Java 示例)
1. 获取 access_token
String corpid = "YOUR_CORPID";
String secret = "YOUR_SECRET";
String tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + secret;// 发送HTTP请求获取token
HttpResponse response = HttpClient.sendGet(tokenUrl);
JSONObject json = JSON.parseObject(response.body());
String accessToken = json.getString("access_token");
2. 调用 GetChatData
接口拉取消息
String chatDataUrl = "https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_chatdata?access_token=" + accessToken;
String requestBody = "{\"seq\":0, \"limit\":100, \"proxybuff\":1}";// 发送POST请求
HttpResponse chatResponse = HttpClient.sendPost(chatDataUrl, requestBody);
JSONObject chatData = JSON.parseObject(chatResponse.body());// 解析返回的加密消息
List<JSONObject> msgList = chatData.getJSONArray("chatdata").toJavaList(JSONObject.class);
3. 解密消息内容
使用企业微信提供的 RSA私钥 解密消息:
String privateKey = "YOUR_PRIVATE_KEY"; // 配置中获取的私钥
for (JSONObject msg : msgList) {String encryptMsg = msg.getString("encrypt_chat_msg");String decryptedMsg = RSAUtil.decrypt(encryptMsg, privateKey); // 需自行实现RSA解密System.out.println("解密后的消息: " + decryptedMsg);
}
步骤 4:处理消息内容
解密后的消息是JSON格式,需根据 msgtype
区分类型(如文本、图片、文件等):
{"msgtype": "text","content": "Hello World","from": "User1","tolist": ["User2", "User3"],"roomid": "群聊ID","msgtime": 1630000000
}
常见消息类型处理:
- 文本消息:直接解析
content
字段。 - 图片/文件:通过
sdkfileid
调用GetMediaData
接口下载文件。 - 撤回消息:
msgtype
为revoke
。
注意事项
- 频率限制:单次调用最多拉取1000条,需分页(通过
seq
控制偏移量)。 - 消息延迟:存档消息可能有 5-10秒延迟。
- 权限控制:确保访问IP在白名单中(管理员后台配置)。
- 合规性:需提前告知员工会话可能被存档(法律要求)。
官方文档参考
- 会话内容存档接口文档
- 消息类型说明
通过以上步骤,即可合规获取企业微信的群聊记录。如有更复杂需求(如实时监听),可结合企业微信的 回调通知机制。
sdk版
在 Spring Boot 项目中集成企业微信会话内容存档 SDK(Java 版)的完整步骤如下,包含 SDK 引入、配置、消息拉取和解密 等关键环节:
1. 获取官方 SDK 和密钥
① 下载 Java SDK
- 从企业微信官方文档下载 会话内容存档 Java SDK(通常为
libWeWorkFinanceSdk_Java.so
或.dll
动态库 + Java 封装包)。 - 官方文档入口:会话内容存档 SDK 文档
② 准备密钥
- 企业微信管理后台 → 「管理工具」-「会话内容存档」:
- 获取
corpid
(企业ID)、secret
(应用密钥)。 - 下载 RSA 私钥文件(
private_key.pem
,用于解密消息)。
- 获取
2. 集成 SDK 到 Spring Boot
① 添加 SDK 依赖
- 将 SDK 动态库(如
libWeWorkFinanceSdk_Java.so
)放入项目资源目录(如src/main/resources/lib
)。 - 在
pom.xml
中确保可加载本地库:
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.10.0</version></dependency>
② 配置 SDK 参数
在 application.yml
中配置企业信息:
wechat:work:corp-id: YOUR_CORPIDarchive-secret: YOUR_SECRETprivate-key-path: classpath:lib/private_key.pemsdk-path: classpath:lib/libWeWorkFinanceSdk_Java.so # Linux动态库
3. 编写 SDK 工具类
① 加载 SDK 并初始化
② 拉取和解密消息
public List<String> getChatMessages(long seq, int limit) {// 调用SDK拉取加密数据Pointer chatDataPtr = new Memory(1024 * 1024); // 分配内存缓冲区int ret = sdk.GetChatData(sdkInstance, seq, limit, "", "", 10, chatDataPtr);if (ret != 0) {throw new RuntimeException("拉取消息失败,错误码: " + ret);}// 解析加密消息(SDK已自动解密)String chatDataJson = chatDataPtr.getString(0);return JSON.parseArray(chatDataJson, String.class);
}
4. 处理消息内容
解密后的消息为 JSON 格式,按消息类型处理:
示例:保存消息到数据库
@Service
public class MessageService {@Autowiredprivate WeChatArchiveService archiveService;@Scheduled(fixedDelay = 5000) // 每5秒拉取一次public void syncMessages() {List<String> messages = archiveService.getChatMessages(lastSeq, 100);messages.forEach(msg -> {JSONObject json = JSON.parseObject(msg);if ("text".equals(json.getString("msgtype"))) {String content = json.getJSONObject("text").getString("content");// 存入数据库messageRepository.save(new ChatMessage(json));}});}
}
5. 注意事项
-
动态库兼容性:
- Linux 服务器需安装
glibc
依赖。 - Windows 开发环境需用
.dll
版本,生产环境建议 Linux。
- Linux 服务器需安装
-
性能优化:
- 控制拉取频率(如每秒不超过 10 次)。
- 使用
seq
分页避免重复拉取。
-
错误处理:
- 捕获
Native
异常,监控ret
返回值(非 0 表示失败)。
- 捕获
-
密钥安全:
- 私钥文件 (
private_key.pem
) 禁止提交到代码仓库,建议通过配置中心下发。
- 私钥文件 (
官方SDK问题排查
-
错误码参考:
0
:成功-1
:参数错误-2
:网络错误-3
:解密失败(检查私钥是否匹配)
-
日志开启: 调用
SetLogLevel
方法开启 SDK 日志(需提前配置)。
通过以上步骤,您的 Spring Boot 项目即可通过企业微信官方 SDK 高效获取会话存档消息。如需进一步优化(如消息实时推送、文件下载),可结合企业微信回调接口实现。