我发了个朋友圈,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. 【MySQL】MMM和MHA高可用架构

    用途 对MySQL主从复制集群的Master的健康监控. 当Master宕机后把写VIP迁移到新Master. 重新配置集群中的其他Slave从新Master同步 MMM架构 主服务器发生故障时, 1 ...

  2. Python platform 模块

    Python platform 模块 platform 模块用于查看当前操作系统的信息,来采集系统版本位数计算机类型名称内核等一系列信息. 使用方法: import platform # 获取操作系统 ...

  3. mysql的sql调优: slow_query_log_file

    mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数.如果在my.cnf里面修改,需增加如 ...

  4. yii2.0的学习之旅(二)

    前言:上一次我们简单认识了一下yii2.0安装,模型基本(增,删,改,查)操作 一.前后台数据交互 *如果你觉得默认的top样式太丑,可以这样关掉* *底部也可以这样关掉* (1)mvc合作操作数据 ...

  5. 禁止直接通过IP访问--->nginx

    在nginx.conf 中添加 server{ listen 80 default_server; return 501; } 注: nginx加载include是按顺序,如果是文件夹,就是文件顺序, ...

  6. C#,WPF,DataGrid,Excel,导出

    private void btnExport_Click(object sender, RoutedEventArgs e) { System.Diagnostics.Stopwatch sw = n ...

  7. 开发技术--浅谈Python函数

    开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

  8. CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  9. 倒计时3天!i春秋四周年盛典狂欢,钜惠不停

    六月注定是不平凡的 感恩父亲节 父爱如山亦如海 难忘毕业季 青春无悔不散场 嗨购618 优惠福利送不停 更值得期待的是 在这个不平凡的六月 迎来了i春秋四周年庆典 当周年庆遇到618 会擦出怎样的火花 ...

  10. Django forms 主要的标签介绍

    修改 forms.py from django import forms as DForms from django.forms import fields from django.forms imp ...