企业微信会话内容存档 SDK 的非官方 .NET 10 封装。此库封装了腾讯提供的 C 语言 SDK,为获取、解密和解析聊天记录提供了方便、强类型的 C# 接口。
WeWorkChatClient 类处理 P/Invoke 复杂性和资源管理 (实现 IDisposable),直接集成了 RSA 和 AES 解密以提供便利,并支持带密码的加密 PEM 私钥。WeWorkChatMessage 以及 TextMessage、ImageMessage 等特定类型)。GetChatMessages 方法将获取数据、RSA 密钥解密和消息 AES 解密组合成一个简单易用的调用。WeWorkFinanceSdk.csproj 项目。libs/ 文件夹中的原生库正确复制到输出目录。.csproj 文件已配置为自动处理 libs/win-x64 和 libs/linux-x64 的文件复制。使用您的企业 ID (CorpId) 和 Secret 初始化客户端。
using WeWorkFinanceSdk;
using WeWorkFinanceSdk.Models;
// 替换为您的实际 CorpId 和 Secret
string corpId = "wwd08c8exxxx5ab44d";
string secret = "您的应用Secret";
using var client = new WeWorkChatClient(corpId, secret);
使用序列号 (seq) 获取一批加密的会话消息。
ulong seq = 0; // 从 0 开始,然后用响应中最新的 seq 更新
uint limit = 100; // 最大值 1000
string proxy = ""; // 可选的代理
string passwd = ""; // 可选的代理密码
int timeout = 10; // 超时时间,单位秒
// 返回包含加密列表的 JSON 字符串
string chatDataJson = client.GetChatData(seq, limit, proxy, passwd, timeout);
Console.WriteLine(chatDataJson);
GetChatMessages 方法将获取数据、RSA 密钥解密和消息 AES 解密组合成一个调用。这要求在初始化 WeWorkChatClient 时提供您的 RSA 私钥(PEM 格式)。
// 1. 使用您的 RSA 私钥(PEM 格式)初始化客户端
string rsaPrivateKey = @"-----BEGIN RSA PRIVATE KEY-----
... 您的实际私钥内容 ...
-----END RSA PRIVATE KEY-----";
// 如果您的私钥是加密的(例如 PEM 头部包含 ENCRYPTED),请提供密码:
string? privateKeyPassword = "您的密钥密码"; // 如果没有加密,则为 null
using var client = new WeWorkChatClient(corpId, secret, rsaPrivateKey, privateKeyPassword); // 使用新的构造函数
// 2. 获取并自动解密消息
var response = client.GetChatMessages(seq: 0, limit: 100); // 使用新方法
if (response.ErrCode == 0)
{
Console.WriteLine($"成功获取并解密了 {response.Messages.Count} 条消息。最后序列号: {response.LastSeq}");
foreach (var message in response.Messages)
{
Console.WriteLine($"MsgId: {message.MsgId}, 类型: {message.MsgType}");
if (message.MsgType == "text" && message.Text != null)
{
Console.WriteLine($"内容: {message.Text.Content}");
}
// ... 处理其他消息类型
}
}
else
{
Console.WriteLine($"获取和解密消息失败: {response.ErrMsg} (错误码: {response.ErrCode})");
}
如果您需要手动执行 RSA 解密(例如在单独的服务中)或只需要原始解密的 JSON 字符串:
您仍然可以使用 DecryptChatMessage 方法:
string encryptRandomKey = "从 GetChatData 响应中获取的 encrypt_random_key";
string encryptChatMsg = "从 GetChatData 响应中获取的 encrypt_chat_msg";
// 手动解密 'encrypt_random_key' 以获取 AES 密钥
string decryptedAesKey = MyRSADecryptionMethod(encryptRandomKey, myPrivateKey, myPassword); // 您的 RSA 解密逻辑(如果密钥加密,请传入密码)
WeWorkChatMessage? message = client.DecryptChatMessage(decryptedAesKey, encryptChatMsg);
// ... 处理消息
使用 sdkfileid 下载图片、视频或文件。
string sdkFileId = "从图片/视频/文件消息中获取的 sdkfileid";
string indexBuf = ""; // 首次调用时为空字符串
string savePath = "downloaded_file.jpg"; // 保存文件的路径
using var fs = new FileStream(savePath, FileMode.Create, FileAccess.Write);
while (true)
{
// 获取数据块
var chunk = client.GetMediaData(indexBuf, sdkFileId);
if (chunk.Data.Length > 0)
{
fs.Write(chunk.Data, 0, chunk.Data.Length);
}
if (chunk.IsFinish)
{
break; // 所有数据块已下载
}
// 更新 indexBuf 用于获取下一个数据块
indexBuf = chunk.OutIndexBuf;
}
WeWorkChatClient 是与 SDK 交互的主要入口点。它实现了 IDisposable 接口。
public WeWorkChatClient(string corpId, string secret, string? privateKey = null, string? privateKeyPassword = null)
corpId: 您的企业微信 CorpId。secret: 您的会话内容存档 Secret。privateKey: (可选) 您的企业 RSA 私钥(PEM 格式)。GetChatMessages 方法需要此参数来自动解密 encrypt_random_key。privateKeyPassword: (可选) 如果 privateKey 是加密的,提供私钥的密码。public WeWorkChatBatchResponse GetChatMessages(ulong seq, uint limit = 1000, string proxy = "", string passwd = "", int timeout = 10)
获取加密的会话数据,解密 RSA 密钥,并将消息解密为强类型对象。需要构造函数中提供 privateKey。
seq: 游标序列号。从 0 开始。limit: 获取的消息条数(最大 1000)。proxy & passwd: 可选的代理设置。timeout: 请求超时时间(秒)。WeWorkChatBatchResponse 对象,包含 WeWorkChatMessage 列表和最后处理的序列号。public string GetChatData(ulong seq, uint limit, string proxy = "", string passwd = "", int timeout = 10)
获取加密的聊天记录。
seq: 游标序列号。从 0 开始。limit: 获取的消息条数(最大 1000)。proxy & passwd: 可选的代理设置。timeout: 请求超时时间(秒)。public WeWorkChatMessage? DecryptChatMessage(string encryptKey, string encryptMsg)
解密加密的消息负载并将其反序列化为 WeWorkChatMessage 对象。
encryptKey: AES 密钥(使用您的 RSA 私钥解密 encrypt_random_key 得到)。encryptMsg: 聊天数据中的 encrypt_chat_msg 负载。WeWorkChatMessage 对象,如果解密失败则为 null。public string DecryptData(string encryptKey, string encryptMsg)
底层解密方法。
public MediaDataChunk GetMediaData(string indexBuf, string sdkFileId, string proxy = "", string passwd = "", int timeout = 10)
下载媒体文件的数据块。
indexBuf: 当前下载块的游标。第一个块传空字符串 ""。sdkFileId: 要下载的文件的 ID。MediaDataChunk。释放原生 SDK 资源。
WeWorkFinanceSdk/: 主 C# 项目。
FinanceSdk.cs: 原生 P/Invoke 定义。WeWorkChatClient.cs: 高级封装类。Models/: 强类型消息类(例如 WeWorkChatMessage.cs 等)。libs/: 原生库(运行时需要)。
win-x64/: WeWorkFinanceSdk.dll、libcrypto-3-x64.dll 等。linux-x64/: libWeWorkFinanceSdk.so。include/: C 语言头文件(仅供参考)。