IM客户端

ClownFish 对国内主流的IM提供了客户端支持可用于发送消息。
只需要一套代码即可支持3种IM


3种IM程序

  • 企业微信
  • 钉钉
  • 飞书

针对3种IM,又支持3大类的使用场景:

  • IM应用 给 单个用户 推送消息
  • IM应用 给 聊天群 推送消息
  • 以IM-Webhook 方式给 聊天群 推送消息



IM应用的连接认证配置

在发送消息前,请先在配置服务中注册IM所需的连接认证参数,可参考下图:

xx

参数类型定义

/// <summary>
/// 企业微信/钉钉/飞书 应用 登录参数
/// </summary>
public sealed class ImAppAuthConfig
{
	/// <summary>
	/// IM类别
	/// </summary>
	public ImType ImType { get; set; }

	/// <summary>
	/// 企业微信的 CorpId,飞书的 AppID,钉钉的 AppKey
	/// </summary>
	public string AppId { get; set; }

	/// <summary>
	/// 企业微信的 Secret,飞书的 AppSecret,钉钉的 AppSecret
	/// </summary>
	public string AppSecret { get; set; }

	/// <summary>
	/// 企业微信/钉钉的 AgentId,飞书不使用此参数
	/// </summary>
	public long AgentId { get; set; }
}

public enum ImType
{
	WxWork,
	DingDing,
	FeiShu
}

参数值配置示例

ImType=WxWork;AgentId=111111;AppId=xxxxxxxxxxxx;AppSecret=xxxxxxxxxxxxxxxx



IM应用给单个用户推送消息

示例代码

public static async Task Test1()
{
	string userId = "liqf01";
	ImAppMsgClient client = new ImAppMsgClient("WxWork.AppAuth.Config");
	
	await client.SendTextAsync(userId, TextMsg);
	await client.SendMarkdownAsync(userId, MarkdownMsg);
	await client.SendImageAsync(userId, @"e:\aaaaa.jpg");

	await client.SendFileAsync(userId, @"E:\bbbbb.pdf");
	await client.SendFileAsync(userId, @"E:\ccccc.txt");
	await client.SendFileAsync(userId, @"E:\ddddd.png");
	
	await client.SendCardAsync(userId, CardTitle, CardMsg, CardHref);
}





IM应用给聊天群推送消息

示例代码

public static async Task Test2()
{
    string chatId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";	
	ImGroupChatClient client = new ImGroupChatClient("WxWork.AppAuth.Config");	

	await client.SendTextAsync(chatId, TextMsg);
	await client.SendMarkdownAsync(chatId, MarkdownMsg);
	await client.SendImageAsync(chatId, @"e:\aaaaa.jpg");

	await client.SendFileAsync(chatId, @"E:\bbbbb.pdf");
	await client.SendFileAsync(chatId, @"E:\ccccc.txt");
	await client.SendFileAsync(chatId, @"E:\ddddd.png");
	
	await client.SendCardAsync(chatId, CardTitle, CardMsg, CardHref);
}

注意事项

  • A应用创建的“XX群”,B应用不能给“XX群”发消息
  • A应用要创建群,需要在企业微信后台的“可见范围”中设置必需的可见范围





以IM-Webhook方式给聊天群推送消息

示例代码

public static async Task Test1()
{
	ImWebhookClient client = new ImWebhookClient("WxWork.WebHookAuth.Config");
	
	await client.SendTextAsync(TextMsg);
	await client.SendMarkdownAsync(MarkdownMsg);
}

WebHook配置参数类型定义

/// <summary>
/// 企业微信/钉钉/飞书 WebHook 登录参数
/// </summary>
public sealed class ImWebHookConfig
{
	/// <summary>
	/// IM类别
	/// </summary>
	public ImType ImType { get; set; }

	/// <summary>
	/// WebHook URL
	/// </summary>
	public string WebHookUrl { get; set; }

	/// <summary>
	/// 签名密钥,可为空。
	/// </summary>
	public string SignKey { get; set; }
}





企业微信专用客户端

如果需要调用企业微信的服务端API,可以使用 WxworkClient 这个类型。

例如,获取用户信息:

WxworkClient client = new WxworkClient("WxWork.AppAuth.Config");

WxworkUserInfo userinfo = client.GetUserInfo("liqf01");

Console2.WriteLine(userinfo.ToJson(JsonStyle.Indented));

其它有用的方法

  • public T SendRequest(HttpOption httpOption) where T : IShitResult
  • public async Task SendRequestAsync(HttpOption httpOption) where T : IShitResult
  • public T SendData(object data) where T : IShitResult
  • public async Task SendDataAsync(object data) where T : IShitResult
  • public string UploadMedia(byte[] fileBody, string fileName, string mediaType)
  • public async Task UploadMediaAsync(byte[] fileBody, string fileName, string mediaType)

使用WxworkClient的好处:

  • 它会在内部自动处理企业微信所需的 access_token
  • 支持开发阶段查看完整的 请求/响应 过程,环境变量:Nebula_ImHttpClient_Debug_Enabled=1

例如:

xx