c# 通过企业微信接口获取聊天的信息

保护青蛙 / 2024-10-09 / 原文

有个需求,需要通过接口获取员工的聊天记录并保存下载,找了一圈,官方的都是c和java的Demo,因此在这里记录一下,方便大家使用。

前期准备

首先需要开通企业微信的会话保存功能,这个需要企业认证后,直接开通就行,审核需要等1-3个工作日。

后台配置

秘钥

秘钥分为公钥和私钥,公钥在后台配置,给企业微信使用,私钥自己拿着,待接口返回消息再解密使用。
秘钥生成建议使用这个网址,生成的秘钥自己保存下来就行。

https://www.bejson.com/enc/rsa/#google_vignette
配置如下:
image

拿到公钥私钥后,将公钥直接复制到企业微信后台
image

获取Secret

点击获取按钮即可。

代码实现

代码我直接使用的这位wsk198726大佬的,直接下载可用

文章: https://blog.csdn.net/wsk198726/article/details/137175703

代码讲解非常详细,拿到后直接调用即可。

遇到的问题

引用dll“找不到指定模块"

鼠标右键dll属性--复制到输入目录--始终复制

试图加载格式不正确的程序

代码版本问题,引用的是64位dll,点击“配置管理器”--添加一个X64的运行程序,如下,再编译使用
image

出现秘钥报错

在使用代码运行时发现,有一步需要将私钥转为xml的方法一直报错,方法名称为:PrivateKeyPemToXml,如下图
image
解决方法是换一个函数,用这个方法替换掉

点击查看代码
 public static string ConvertToXmlPrivateKey(string privateJavaKey)
 {
     RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey));
     return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
     Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
     Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
 }

同时在使用私钥时,去掉----BEGIN PRIVATE KEY-----
image
再运行即可

调用方法

点击查看代码
    string corpid = "XXXXXXXX"; //企业微信ID
    string secret = "XXXXXXXXXXXXXXXXX"; //会话内容存档 secret 
    string token = "XXXXXXXXXXX";
    int seq = 0;
  string  privateKey1 ="xxxxxx";
  string  privateKey2 ="xxxxxx";
  string  privateKey3 ="xxxxxx";
  Dictionary<int, string> verKey = new Dictionary<int, string>();
  verKey.Add(1, privateKey1);
  verKey.Add(2, privateKey2);
  verKey.Add(3, privateKey3);

  var client = new FinanceHelper(corpid, secret, verKey);

  //同步方法
 // var result = client.GetChatList(seq);
  //异步方法
  var result = await client.GetChatListAsync(seq);

  List<IMsgBase> msgList = result.Item1; //企业微信 会话内容 列表
  List<FileData> fileList = result.Item2; //媒体内容 列表