基于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<AutoTaskService> _logger;

        public AutoTaskService(ILogger<AutoTaskService> 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<DingTalkController>();
services.AddHostedService<AutoTaskService>();

真机调试结果

总结

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值