logo
0
0
WeChat Login
Restore READMEs to SDK-only content, removing demo section

English version click here

WeWorkFinanceSdk.Net

企业微信会话内容存档 SDK 的非官方 .NET 10 封装。此库封装了腾讯提供的 C 语言 SDK,为获取、解密和解析聊天记录提供了方便、强类型的 C# 接口。

功能特性

  • 跨平台支持: 支持 Windows (x64) 和 Linux (x64)。
  • 托管封装: WeWorkChatClient 类处理 P/Invoke 复杂性和资源管理 (实现 IDisposable),直接集成了 RSA 和 AES 解密以提供便利,并支持带密码的加密 PEM 私钥
  • 强类型模型: 自动将 JSON 消息反序列化为 C# 对象(例如 WeWorkChatMessage 以及 TextMessageImageMessage 等特定类型)。
  • 简化数据获取: GetChatMessages 方法将获取数据、RSA 密钥解密和消息 AES 解密组合成一个简单易用的调用。
  • 媒体处理: 提供下载和保存媒体文件(图片、视频、文件)的辅助方法。

先决条件

  • .NET 10 SDK
  • Windows: Visual C++ 可再发行组件(通常已安装,但原生 DLL 需要)。
  • Linux: 标准 C 库。

安装

  1. 克隆或下载此代码库。
  2. 在您的解决方案中引用 WeWorkFinanceSdk.csproj 项目。
  3. 确保 libs/ 文件夹中的原生库正确复制到输出目录。.csproj 文件已配置为自动处理 libs/win-x64libs/linux-x64 的文件复制。

使用方法

1. 初始化

使用您的企业 ID (CorpId) 和 Secret 初始化客户端。

using WeWorkFinanceSdk; using WeWorkFinanceSdk.Models; // 替换为您的实际 CorpId 和 Secret string corpId = "wwd08c8exxxx5ab44d"; string secret = "您的应用Secret"; using var client = new WeWorkChatClient(corpId, secret);

2. 获取加密的会话数据

使用序列号 (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);

3. 解密和解析消息 (简化)

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); // ... 处理消息

4. 下载媒体文件

使用 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; }

API 参考 (WeWorkChatClient)

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 是加密的,提供私钥的密码。

方法

GetChatMessages

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 列表和最后处理的序列号。

GetChatData

public string GetChatData(ulong seq, uint limit, string proxy = "", string passwd = "", int timeout = 10)

获取加密的聊天记录。

  • seq: 游标序列号。从 0 开始。
  • limit: 获取的消息条数(最大 1000)。
  • proxy & passwd: 可选的代理设置。
  • timeout: 请求超时时间(秒)。
  • 返回: 包含消息列表和下一个游标的 JSON 字符串。

DecryptChatMessage

public WeWorkChatMessage? DecryptChatMessage(string encryptKey, string encryptMsg)

解密加密的消息负载并将其反序列化为 WeWorkChatMessage 对象。

  • encryptKey: AES 密钥(使用您的 RSA 私钥解密 encrypt_random_key 得到)。
  • encryptMsg: 聊天数据中的 encrypt_chat_msg 负载。
  • 返回: WeWorkChatMessage 对象,如果解密失败则为 null

DecryptData

public string DecryptData(string encryptKey, string encryptMsg)

底层解密方法。

  • 返回: 解密后消息的原始 JSON 字符串。

GetMediaData

public MediaDataChunk GetMediaData(string indexBuf, string sdkFileId, string proxy = "", string passwd = "", int timeout = 10)

下载媒体文件的数据块。

  • indexBuf: 当前下载块的游标。第一个块传空字符串 ""
  • sdkFileId: 要下载的文件的 ID。
  • 返回: 包含数据字节、下一个索引缓冲区和完成状态的 MediaDataChunk

Dispose

释放原生 SDK 资源。

项目结构

  • WeWorkFinanceSdk/: 主 C# 项目。
    • FinanceSdk.cs: 原生 P/Invoke 定义。
    • WeWorkChatClient.cs: 高级封装类。
    • Models/: 强类型消息类(例如 WeWorkChatMessage.cs 等)。
  • libs/: 原生库(运行时需要)。
    • win-x64/: WeWorkFinanceSdk.dlllibcrypto-3-x64.dll 等。
    • linux-x64/: libWeWorkFinanceSdk.so
    • include/: C 语言头文件(仅供参考)。

参考资料