我发了个朋友圈,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尝鲜记)的更多相关文章

  1. 微信小程序【消息推送服务器认证C# WebAPI】

    参考微信开发文档: https://developers.weixin.qq.com/miniprogram/dev/api/custommsg/callback_help.html 代码可用 /// ...

  2. nodejs通过钉钉群机器人推送消息

    nodejs 通过钉钉群机器人推送消息 Intro 最近在用 nodejs 写爬虫,之前的 nodejs 爬虫代码用 js 写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescri ...

  3. Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送

    实现Gitlab事件自动触发Jenkins构建及钉钉消息推送 实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1. ...

  4. Jenkins构建项目后发送钉钉消息推送

    前言 钉钉是我们日常工作的沟通工具,在Jenkins构建持续集成项目配合钉钉机器人的功能,可以让我们在持续集成测试环节快速接收到测试结果的消息推送. 一:新建一个钉钉群,选择自定义机器人 二:添加机器 ...

  5. HMS Core地理围栏能力助你实现指定范围人群的精准消息推送

    精准推送是移动端产品留存阶段的主要运营手段,精准推送常常会与用户画像紧密结合,针对用户的喜好.画像,采用不同策略,但基于用户所属区域推送消息却很难实现.目前市面上大多数第三方消息推送服务商,在系统未深 ...

  6. dotnet core使用IO合并技巧轻松实现千万级消息推送

    之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的 ...

  7. RabbitMQ消息队列(七)-通过fanout模式将消息推送到多个Queue中(.Net Core版)

    前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多个队列. 有时我们会遇到这样的情况,多个功能模块都希望得到完整的消息数据.例如一个log ...

  8. Android P正式版即将到来:后台应用保活、消息推送的真正噩梦

    1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了.   下图上谷歌官方公布的Android P ...

  9. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

随机推荐

  1. Grafana的Docker部署方式

    docker run -d -p : --name=grafana544 -v D:/grafana/grafana-/data:/var/lib/grafana -v D:/grafana/graf ...

  2. 你不知道的Go unsafe.Pointer uintptr原理和玩法

    unsafe.Pointer 这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime大量使用它.官方文档对该类型有四个重要描述: (1)任何类型的指针都可以被转化为Pointer (2 ...

  3. Python collectioins

    collections是一个python的内建模块,提供了一些除了dict.list.tuble.等常见的数据类型之外的一些集合类 参考链接:https://www.liaoxuefeng.com/w ...

  4. flask-script、flask-admin组件

    目录 flask-script 安装 使用 自定制命令 flask-admin 安装 简单使用 将表模型注册到admin中 如果有个字段是图片字段 flask-script 用于实现类似于django ...

  5. 记录vue用 html5+做移动APP 用barcode做扫一扫功能时安卓 的bug(黑屏、错位等等)和解决方法

    最近做项目时,要用到扫一扫二维码的功能,在html5+里面有提供barcode功能,于是照过来用了, 写的代码如下 : 扫码页面: <style lang="less" sc ...

  6. wpf 打开win8系统软件盘

    三个函数 一) /// <summary> /// 判断进程是否正在运行 /// </summary> /// <param name="process&quo ...

  7. 用for循环数组去重

    <script> var arr=["a","e","w","f","a"," ...

  8. RDD源码分析

    RDD源码解析 一. RDD.scala - Resilient Distributed Dataset (RDD) 弹性分布式数据集 弹性: 体现在计算上面 - the basic abstract ...

  9. Tomcat 配置介绍

    参数说明: maxThreads: 最大可以创建请求的线程数 minSpareThreads: 服务启动时创建的处理请求的进程数 Connector中的port: 创建服务器端的端口号,此端口监听用户 ...

  10. day09 作业

    简述定义函数的三种方式 空函数.无参函数.有参函数 简述函数的返回值 函数内部代码经过一系列的逻辑处理返回的结果 函数没有返回值,默认返回None 函数可以通过return返回出返回值 return可 ...