基于ASP.NET CORE MVC 3.1的钉钉企业H5微应用开发(3)--定时工作消息发送

前言 在过去的几天时间中,我相继介绍了基于ASP.NET CORE MVC 3.1的环境准备,必要知识补充,以及免登流程。本文将结合基于IHostedService的托管服务,进行钉钉的定时工作消息发送功能介绍。
定时工作消息发送应该是一种十分常见的业务场景,在钉钉中也不例外。我们可以利用IHostedService的托管服务以及钉钉服务端API构建定时消息发送服务。
流程 工作消息的发送主要通以下几步:
(1)获取access_token
(2)获取UserId
(3)调用服务端工作消息发送接口
(4)构建后台任务服务
前面两步参见:https://blog.csdn.net/weixin_41372626/article/details/106750789,不清楚的自行补充,这里不再叙述。
这里重点介绍后面两步。
服务端API解析 请求方式:POST(HTTPS)
请求地址:https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=ACCESS_TOKEN
参数说明:

参数
类型
必须
示例值
说明
agent_id
Number

1234
应用agentId
userid_list
String
否(userid_list,dept_id_list, to_all_user必须有一个不能为空)
zhangsan,lisi
接收者的企业内部用户的userid列表,最大用户列表长度:100
dept_id_list
String
否(可不传,若传不能为空)
123,456
接收者的部门id列表,最大列表长度:20,接收者是部门id下(包括子部门下)的所有用户
to_all_user
Boolean

false
是否发送给企业全部用户
msg
json对象

{"msgtype":"text","text":{"content":"消息内容"}}
消息内容,消息类型和样例参考“消息类型与数据格式”。最长不超过2048个字节
返回结果:
{ "errcode":0, "errmsg":"ok", "task_id":123 }

参数
说明
errcode
返回码
errmsg
对返回码的文本描述内容
task_id
创建的发送任务id
注意事项 发送工作通知消息需要注意以下事项:
  • 同一个应用相同消息的内容同一个用户一天只能接收一次。
  • 同一个应用给同一个用户发送消息,企业内部开发方式一天不得超过500次。
  • 通过设置to_all_user参数全员推送消息,一天最多3次。
  • 超出以上限制次数后,接口返回成功,但用户无法接收到。详细的限制说明,请参考“工作通知消息的限制”。
  • 该接口是异步发送消息,接口返回成功并不表示用户一定会收到消息,需要通过“查询工作通知消息的发送结果”接口查询是否给用户发送成功。
详细消息类型参见:https://ding-doc.dingtalk.com/doc#/serverapi2/ye8tup,这里以文本消息为例说明。
.Net Core 请求示例
public IActionResult SendWrokMsg(string userid) { IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"); OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request(); //这是一个长整型,打开应用详情可以看到 req.AgentId = 781348xxx; req.UseridList = userid; //默认是false // req.ToAllUser = true; OapiMessageCorpconversationAsyncsendV2Request.MsgDomain obj1 = new OapiMessageCorpconversationAsyncsendV2Request.MsgDomain(); obj1.Msgtype = "text"; OapiMessageCorpconversationAsyncsendV2Request.TextDomain obj2 = new OapiMessageCorpconversationAsyncsendV2Request.TextDomain(); obj2.Content = "Hello! 下午好!下班奥里给666!"; obj1.Text = obj2; req.Msg_ = obj1; OapiMessageCorpconversationAsyncsendV2Response rsp = client.Execute(req, GetAuthToken()); return Json(rsp); }

构建后台任务服务 这里不太懂的话参考:
在ASP.NET CORE 运行后台任务:基于IHostedService的托管服务:https://blog.csdn.net/weixin_41372626/article/details/106758619
业务代码
public class AutoTaskService : BackgroundService {private DingTalkController _talkController; private readonly ILogger _logger; public AutoTaskService(ILogger logger, DingTalkController talkController) { _logger = logger; _talkController = talkController; }protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { await new TaskFactory().StartNew(() => { try { //每天16:00发送工作消息 var time = DateTime.Now.ToString("HH:mm:ss"); if ("16:00:00" == time) { _logger.LogInformation("发送工作消息"); DoWork(); } } catch (Exception e) { _logger.LogError("工作消息发送失败" + e.Message); }//定时任务休眠 Thread.Sleep(1 * 1000); }); } }private void DoWork() { _talkController.GetAuthToken(); _talkController.SendWrokMsg("userid"); } }

这里的DingTalkController是我写服务端API逻辑的控制器,包含工作消息发送,获取token等各种方法,使用时需要通过依赖注入进来。写完后台任务服务以后,还需要在StartUp将DingTalkController以单例模式注入,并注册AutoTaskService。
services.AddSingleton(); services.AddHostedService();

真机调试结果
基于ASP.NET CORE MVC 3.1的钉钉企业H5微应用开发(3)--定时工作消息发送
文章图片

总结 本文主要介绍了定时工作消息发送机制,下一次预计会讲部分的JSAPI鉴权啥的。。。


【基于ASP.NET CORE MVC 3.1的钉钉企业H5微应用开发(3)--定时工作消息发送】

    推荐阅读