DingTalk钉钉消息推送(.net core 3 WebApi尝鲜记)
我发了个朋友圈,Swagger真他妈的牛B,解放了开发API的码农,麻麻再也不用担心我们写API文档耽误回家吃饭了。

/// <summary>
/// 发送钉钉消息
/// </summary>
/// <param name="toUser">Employee的userid,多个使用|分隔</param>
/// <param name="title">标题</param>
/// <param name="content">发送内容</param>
/// <param name="sourceUrl">消息向导地址</param>
/// <returns></returns>
private ApiResult SendCardMessageToEmployee(string toUser, string title, string content, string sourceUrl)
{
var result = new ApiResult
{
Success = false,
ResponseDatetime = DateTime.Now.ToString(),
ResultMessage = "操作失败!",
ResultObject = null
};
try
{
toUser = toUser.Trim('|');
string JSONData = "{\"touser\":\"" + toUser +
"\",\"toparty\":\"\",\"agentid\":\"" + _settings.Value.sendmessage_agentid + "\",\"msgtype\":\"action_card\",\"action_card\":{\"title\":\"" + title + "\",\"markdown\":\"<font size=7 face=\'黑体\'>DingTalk中间件提醒: </font> \n \n " +
content + "\r \n " + "\r \n " + "\r \n " + DateTime.Now.ToString() +
"\",\"single_title\": \"查看详情\",\"single_url\": \"" + sourceUrl + "\"}}";
var access_token = GetAccessToke();
var tokenObj = access_token.ResultObject as AccessToken;
string url = "https://oapi.dingtalk.com/message/send?access_token=" + tokenObj.access_token;
string response = GetResponseData(JSONData, url);
result.ResultObject = response;
result.Success = string.IsNullOrEmpty(response);
result.ResultMessage = "API调用成功!Requst Url:[" + url + "],Content:[" + JSONData + "]";
}
catch (Exception ex)
{
result.ResultObject = ex;
_logger.LogError(ex, ex.Message, new object[] { });
}
return result;
} /// <summary>
/// 发送钉钉消息
/// </summary>
/// <param name="toUser">Employee的userid,多个使用|分隔</param>
/// <param name="content">发送内容</param>
/// <param name="sourceUrl">发送内容</param>
/// <returns></returns>
private ApiResult SendMediaMessageToEmployee(string toUser, string content, string sourceUrl)
{
var result = new ApiResult
{
Success = false,
ResponseDatetime = DateTime.Now.ToString(),
ResultMessage = "操作失败!",
ResultObject = null
};
try
{
toUser = toUser.Trim('|');
string JSONData = "{\"touser\":\"" + toUser + "\",\"toparty\":\"\",\"agentid\":\"" + _settings.Value.sendmessage_agentid + "\",\"" + content + ",\"single_title\": \"查看详情\",\"single_url\": \"" + sourceUrl + "\"}}";
var access_token = GetAccessToke();
var tokenObj = access_token.ResultObject as AccessToken;
string url = "https://oapi.dingtalk.com/message/send?access_token=" + tokenObj.access_token;
string response = GetResponseData(JSONData, url);
result.ResultObject = response;
result.Success = string.IsNullOrEmpty(response);
result.ResultMessage = "API调用成功!Requst Url:[" + url + "],Content:[" + JSONData + "]";
}
catch (Exception ex)
{
result.ResultObject = ex;
_logger.LogError(ex, ex.Message, new object[] { });
}
return result;
}
/// <summary>
/// 给指定员工发送钉钉消息1
/// </summary>
/// <param name="userid">指定员工的职员ID</param>
/// <param name="title">标题</param>
/// <param name="content">发送内容</param>
/// <param name="sourceUrl">消息向导地址</param>
/// <returns></returns>
[HttpGet]
[HttpPost]
public ApiResult SendDingTalkMessage(string userid, string title, string content, string sourceUrl = "http://www.cquni.com")
{
if (string.IsNullOrEmpty(title))
title = "通知";
var result = new ApiResult
{
Success = false,
ResponseDatetime = DateTime.Now.ToString(),
ResultMessage = "操作失败!",
ResultObject = null
};
try
{
var rs = SendCardMessageToEmployee(userid, title, content, sourceUrl);
result.Success = rs.Success;
result.ResultMessage = rs.ResultMessage;
result.ResultObject = rs.ResultObject;
}
catch (Exception ex)
{
result.ResultObject = ex;
}
return result;
}
/// <summary>
/// 给指定员工发送钉钉消息2
/// </summary>
/// <param name="departmentName">部门名称</param>
/// <param name="employeeName">人员姓名</param>
/// <param name="title">消息标题</param>
/// <param name="content">消息内容</param>
/// <param name="sourceUrl">url</param>
/// <returns></returns>
[HttpGet]
[HttpPost]
public ApiResult SendDingTalkMessageExt(string departmentName, string employeeName, string title, string content, string sourceUrl = "http://www.cquni.com")
{
var result = new ApiResult
{
Success = false,
ResponseDatetime = DateTime.Now.ToString(),
ResultMessage = "操作失败!",
ResultObject = null
};
if (string.IsNullOrEmpty(title))
title = "通知";
var deptment = GetDepartmentInfo().department;
if (deptment != null && deptment.Count > )
{
var currDept = deptment.Where(d => d.name.Contains(departmentName)).FirstOrDefault();
if (currDept == null)
{
result.ResultMessage = "获取人员的部门信息出错,输入部门名称:" + departmentName;
}
else
{
var employeeList = GetDepartmentEmployeeList(currDept).userlist;
if (employeeList != null && employeeList.Count > )
{
var currentEmp = employeeList.Where(e => e.name.Contains(employeeName)).FirstOrDefault();
try
{
var rs = SendCardMessageToEmployee(currentEmp.userid, title, content, sourceUrl);
return rs;
}
catch (Exception ex)
{
_logger.LogError(ex.Message, new object[]
{
ex,
ex.InnerException
});
}
}
else
{
result.ResultMessage = string.Format("很奇怪,这个部门'{0}'一个人也没有!", departmentName);
}
}
}
else
{
result.ResultMessage = "获取公司部门信息出错!";
}
return result;
} /// <summary>
/// 给指定员工发送钉钉消息(支持图文,文件,图片等格式)
/// </summary>
/// <param name="departmentName">部门名称</param>
/// <param name="employeeName">人员姓名</param>
/// <param name="mediaContent">消息内容 eg: "msgtype": "voice","voice": {"media_id": "MEDIA_ID","duration": "10" }
/// 格式说明请看钉钉官网文档 https://ding-doc.dingtalk.com/doc#/serverapi2/ye8tup </param>
/// <param name="sourceUrl"></param>
/// <returns></returns>
[HttpGet]
[HttpPost]
public ApiResult SendDingTalkMediaMessage(string departmentName, string employeeName, string mediaContent, string sourceUrl = "http://www.cquni.com")
{
var result = new ApiResult
{
Success = false,
ResponseDatetime = DateTime.Now.ToString(),
ResultMessage = "操作失败!",
ResultObject = null
};
var deptment = GetDepartmentInfo().department;
if (deptment != null && deptment.Count > )
{
var currDept = deptment.Where(d => d.name.Contains(departmentName)).FirstOrDefault();
if (currDept == null)
{
result.ResultMessage = "获取人员的部门信息出错,输入部门名称:" + departmentName;
}
else
{
var employeeList = GetDepartmentEmployeeList(currDept).userlist;
if (employeeList != null && employeeList.Count > )
{
var currentEmp = employeeList.Where(e => e.name.Contains(employeeName)).FirstOrDefault();
try
{
var rs = SendMediaMessageToEmployee(currentEmp.userid, mediaContent, sourceUrl);
return rs;
}
catch (Exception ex)
{
_logger.LogError(ex.Message, new object[]
{
ex,
ex.InnerException
});
}
}
else
{
result.ResultMessage = string.Format("很奇怪,这个部门'{0}'一个人也没有!", departmentName);
}
}
}
else
{
result.ResultMessage = "获取公司部门信息出错!";
}
return result;
}
DingTalk钉钉消息推送(.net core 3 WebApi尝鲜记)的更多相关文章
- 微信小程序【消息推送服务器认证C# WebAPI】
参考微信开发文档: https://developers.weixin.qq.com/miniprogram/dev/api/custommsg/callback_help.html 代码可用 /// ...
- nodejs通过钉钉群机器人推送消息
nodejs 通过钉钉群机器人推送消息 Intro 最近在用 nodejs 写爬虫,之前的 nodejs 爬虫代码用 js 写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescri ...
- Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
实现Gitlab事件自动触发Jenkins构建及钉钉消息推送 实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1. ...
- Jenkins构建项目后发送钉钉消息推送
前言 钉钉是我们日常工作的沟通工具,在Jenkins构建持续集成项目配合钉钉机器人的功能,可以让我们在持续集成测试环节快速接收到测试结果的消息推送. 一:新建一个钉钉群,选择自定义机器人 二:添加机器 ...
- HMS Core地理围栏能力助你实现指定范围人群的精准消息推送
精准推送是移动端产品留存阶段的主要运营手段,精准推送常常会与用户画像紧密结合,针对用户的喜好.画像,采用不同策略,但基于用户所属区域推送消息却很难实现.目前市面上大多数第三方消息推送服务商,在系统未深 ...
- dotnet core使用IO合并技巧轻松实现千万级消息推送
之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的 ...
- RabbitMQ消息队列(七)-通过fanout模式将消息推送到多个Queue中(.Net Core版)
前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多个队列. 有时我们会遇到这样的情况,多个功能模块都希望得到完整的消息数据.例如一个log ...
- Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了. 下图上谷歌官方公布的Android P ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
随机推荐
- Autoware 培训笔记 No. 3——录制航迹点
1.前言 航迹点用于知道汽车运行,autoware的每个航迹点包含x, y, z, yaw, velocity信息. 航迹点录制有两种方式,可以开车录制航迹点,也可以采集数据包,线下录制航迹点,我分开 ...
- Java生鲜电商平台-系统报表设计与架构
Java生鲜电商平台-系统报表设计与架构 说明:任何一个运行的平台都需要一个很清楚的报表来显示,那么作为Java开源生鲜电商平台而言,我们应该如何设计报表呢?或者说我们希望报表来看到什么数据呢? ...
- 使用Composer安装阿里云短信失败
安装步骤 请参考以下步骤,使用Composer安装依赖. 如果在您的系统上全局安装Composer,您可以在项目目录中运行以下内容,将 Alibaba Cloud Client for PHP 添加为 ...
- 常用邮箱SMTP服务器地址大全
常用邮箱SMTP服务器地址大全 阿里云邮箱(mail.aliyun.com) POP3服务器地址:pop3.aliyun.com(SSL加密端口:995:非加密端口:110) SMTP服务器地址:sm ...
- Git学习笔记4-分支
参考链接廖雪峰git教程:https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136 1.分支创建 创建本地分支: $ git b ...
- 百度云人脸识别API人脸对比
from urllib import request import base64 import requests import re import json import urllib import ...
- 07.进程管理+作业控制+文件查找与压缩+文件压缩与打包+tar打包解包+NFS
进程管理 程序放在磁盘上叫文件,把它复制到内存,并在cpu运行,就叫进程, 进程多少也反映当前运行程序的多少 进程在系统中会为每个进程生成一个进程号,在所有的进程中有一个特殊进程即init进程, 它是 ...
- visual studio之X64调试问题
这个问题没有解决. 只能X86啦!
- selenium 2定位方式实例
#########百度输入框的定位方式########## #通过id方式定位 browser.find_element_by_id("kw").send_keys("s ...
- LG2045 方格取数加强版 费用流
问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...