文章目录
前言
本文章向大家介绍一下如何构建一个企业微信群机器人,如何去开发一个异步报警通知的程序。会详细描述其中暗含的坑,以及如何去解决。WinForms只是作为一个基础的承载服务,思路是通用的。
一、企业微信群机器人是什么?
企业微信群机器人本质上是企业微信团队对外提供的一个消息通知者,通过机器人向群发送消息,可@指定人员或@全员。
二、群机器人使用步骤
1.构建机器人
点击企业微信群聊详情,找到添加机器人,录入机器人名称

记录好Webhook地址,向这个地址发起HTTP POST 请求,即可实现给该群组发送消息。
Webhook一定要保密,切勿公开

至此群聊机器人已经添加完毕。在写具体推送功能的代码之前我们先要了解使用群机器人的流程,比如它接收什么样格式的数据,返回什么类型的结果。目前企业微信官方支持文本(text)、markdown(markdown)、图片(image)、图文(news)、文件(file)、语音(voice)、模板卡片(template_card)七种消息类型。下面由让机器人发送文本类型和markdown类型的通知来探讨如何使用群机器人。
2.如何使用群机器人
2.1请求接口构建(Postman示例)
在postman中创建post请求,Key参数填入key,Vulue参数填入机器人Webhook地址;请求头Content-Type为application/json类型;其中body里传入的参数决定了机器人以何种发送推送消息。

2.2文本类型消息通知

{
"msgtype": "text",
"text": {
"content": "任务提醒:\n 请及时处理工单。",
"mentioned_list": ["XX"],
"mentioned_mobile_list":["150xxxxxxxx","@all"]
}
}
当msgtype设置为text时,用text包括的对象content,便是群机器人发送内容。文本内容,最长不超过2048个字节,必须是utf8编码。mentioned_list和mentioned_mobile_list都可以用来实现@群成员对象。其中mentioned_list里需要放企业微信群成员的userid,mentioned_mobile_list需要放群成员手机号,这两者都可以用特殊值"@all"用于 @所有人。实际开发中只用构建mentioned_list或mentioned_mobile_list的一个用来标识提醒的成员。
2.3markdown类型消息通知

{
"msgtype": "markdown",
"markdown": {
"content": "实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n>类型:<font color=\"comment\">用 户反馈</font> \n普通用户反馈:<font color=\"comment\">117例</font> \nVIP用户反馈:<font color=\"comment\">15例</font> \n<@xxx>"
}
}
当msgtype设置为markdown时,用markdown包括的对象content,便是群机器人发送内容。markdown内容,最长不超过4096个字节,必须是utf8编码。
重点:markdown对象里设置mentioned_list和mentioned_mobile_list对象是无效的,想要实现@群成员对象的功能需要使用模板语法<@userid>。@多个用户就使用多个<@userid>。截至本文完结日为止,企业微信官方团队并没有为markdown格式提供@所有人的功能,拼接<@所有人> 并不会在企业微信群弹出被@的提醒。
2.4企业微信userid的一种获取方式——后台通讯录导出

进入企业微信后台,选中对应的企业,找到通讯录。导出的excel文本里的账户便是企业userid。
2022年企业微信官方收缩了获取用户信息的api权限。新创建的企业是无法直接获取用户信息,故也无法直接获取userid。目前企业微信提供了OAuth的授权登录方式,通过回调的方式获取用户信息,本文在此不展开该服务的搭建。

2.5补充
企业微信机器人接口的调用最大频次为每分钟最多20次。
三、企业微信群机器人异步通知实现
3.1窗体服务初始化

通过给开始结束按钮绑定事件,点击开始按钮开启一个后台线程,用于每半分钟轮询一次待推送的报警查询请求。异步执行WeComStart方法里的weComProcess.RunAsync()开启推送流程;
窗体服务源码
#region 企业微信推送利用Task实现异步推送
/// <summary>
/// 取消服务的令牌源
/// </summary>
private CancellationTokenSource _weComCts;
/// <summary>
/// 运行中的服务任务
/// </summary>
private Task _weComTask;
/// <summary>
/// 服务状态标志
/// </summary>
private bool _isWeComRunning = false;
/// <summary>
/// 执行间隔
/// </summary>
private readonly TimeSpan _weComInterval = TimeSpan.FromSeconds(60);
/// <summary>
/// 开启企业微信推送服务
/// </summary>
/// <returns></returns>
public bool ServerStart_WeCom()
{
try
{
if (_isWeComRunning)
{
Logger.Trace("企业微信推送服务已在运行中");
return false;
}
_weComCts = new CancellationTokenSource();
_weComTask = RunWeComServiceAsync(_weComCts.Token);
_isWeComRunning = true;
Logger.Trace("企业微信推送服务已启动");
return true;
}
catch (Exception ex)
{
Logger.Trace(ex);
return false;
}
}
/// <summary>
/// 关闭企业微信推送服务
/// </summary>
/// <returns></returns>
public async Task<bool> ServerEnd_WeCom()

最低0.47元/天 解锁文章
2464

被折叠的 条评论
为什么被折叠?



