.Net通用釘釘自定義機器人
本文提供全流程,中文翻譯
Chinar的初衷是将一種簡單的生活方式帶給世人
使有限時間 具備無限可能
Chinar 教程效果:

全文高清圖檔,點選即可放大觀看 (很多人竟然不知道)
1
Presentation —— 介紹
疫情原因,居家辦公,移動辦公或将成為未來世界的主流。
一、實作釘釘自己定義消息通知?
項目需求:需要直接通知消息或相關資料分享到釘釘裡。
看了下釘釘官方文檔,搜尋了下發現網絡上教程接入這塊不夠詳細,初學者入門較難。各種失敗案例!
官方文檔詳細,但實作方式上沒有過多的說明。
二、釘釘消息通知,本質
本質上就是一個 POST 消息請求
是以我們隻要, 完成正常發送POST 使得釘釘方從中可擷取對應格式的資料 即可!
ps:最近有人吐槽我說:粉絲文章真惡心,不開放閱讀不如不看。
我想說:辛苦總結的資料,基本都是經過多次測試,拿來即用。
您不點贊也就算了,關注一下都不願意,也是醉了。
我的時間和經驗也不是大風刮來的。
2
Utility Class —— 工具類
Chinar 為您節約寶貴時間,所有函數都已封裝完畢。
無任何資料類,無需序列化。
隻此一個工具腳本!.Net通用!
您隻需
1. Webhook位址和關鍵字改用自己機器人
2. 調用對應方法即可發送消息。
工具類代碼
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
public class ChinarDing
{
/// <summary>
/// Webhook 位址
/// </summary>
public static string WebHookUrl = "https://oapi.dingtalk.com/robot/send?access_token=b6592dff2c2d2f";
/// <summary>
/// 關鍵字 1
/// 機器人設定的關鍵字
/// </summary>
private const string keyWord = "【提示】";
/// <summary>
/// 緩存 Json
/// </summary>
private static readonly StringBuilder jsonStringBuilder = new StringBuilder(512);
/// <summary>
/// 發送 Post 資料
/// </summary>
/// <param name="data">資料</param>
/// <returns>Json</returns>
public static String Post(string data)
{
var httpWebRequest = (HttpWebRequest) WebRequest.Create(WebHookUrl);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = WebRequestMethods.Http.Post;
if (data != null)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
httpWebRequest.ContentLength = dataBytes.Length;
using (var reqStream = httpWebRequest.GetRequestStream())
{
reqStream.Write(dataBytes, 0, dataBytes.Length);
httpWebRequest.GetRequestStream().Write(dataBytes, 0, dataBytes.Length);
}
}
using (var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse())
{
var responseStream = httpWebResponse.GetResponseStream();
return responseStream == null ? null : new StreamReader(responseStream, Encoding.UTF8).ReadToEnd();
}
}
/// <summary>
/// 發送 text 類型
/// </summary>
/// <param name="content">内容</param>
/// <param name="phoneNumbers">@誰?支援多人</param>
/// <param name="isAtAll">@所有人</param>
public static void SendText(string content, List<string> phoneNumbers, bool isAtAll)
{
//var addColon = mobileList.Select(_ => $"\"{_}\""); //有時特殊需要,對電話号碼每一項加上 “132XXX43210”
jsonStringBuilder.Clear();
var listToString = string.Join(",", phoneNumbers);
jsonStringBuilder.Append($"{{\"msgtype\":\"text\",\"text\":{{\"content\":\"{keyWord + content}\"}},\"at\":{{\"atMobiles\":[{listToString}],\"isAtAll\":{isAtAll.ToString().ToLower()}}}}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
Console.Write(ReturnJson);
}
/// <summary>
/// 發送 Link 類型
/// </summary>
/// <param name="title">标題</param>
/// <param name="text">内容</param>
/// <param name="imageUrl">圖檔連結</param>
/// <param name="contentUrl">消息跳轉連結</param>
public static void SendLink(string title, string text, string imageUrl, string contentUrl)
{
jsonStringBuilder.Clear();
jsonStringBuilder.Append("{\"msgtype\":\"link\",\"link\":{" +
$"\"title\":\"{keyWord + title}\"," +
$"\"text\":\"{text}\"," +
$"\"picUrl\":\"{imageUrl}\"," +
$"\"messageUrl\":\"{contentUrl}\"}}}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
Console.Write(ReturnJson);
}
/// <summary>
/// 發送markdown類消息
/// </summary>
/// <param name="title">标題</param>
/// <param name="text">消息主體</param>
/// <param name="atMobiles">@人員電話</param>
/// <param name="isAtAll">是否@群所有成員</param>
public static void SendMarkdown(string title, string text, string imageUrl, List<string> phoneNumbers, bool isAtAll)
{
var listToString = string.Join(",", phoneNumbers);
jsonStringBuilder.Clear();
jsonStringBuilder.Append($"{{\"msgtype\":\"markdown\",\"" +
$"markdown\":{{\"title\":\"{keyWord + title}\"," +
$"\"text\":\"{text} " +
$"\\n> [Chinar](https://www.chinar.com) \\n\"}}," +
$"\"at\":{{\"atMobiles\":[\"{listToString}\"]," +
$"\"isAtAll\":{isAtAll.ToString().ToLower()}}}}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
Console.Write(ReturnJson);
}
/// <summary>
/// 整體發送ActionCard類型消息
/// </summary>
/// <param name="title">标題</param>
/// <param name="imageUrl">圖檔Url</param>
/// <param name="texttitle">文本标題</param>
/// <param name="text">文本</param>
/// <param name="btnTitle">按鈕标題</param>
/// <param name="buttonUrl">按鈕Url</param>
/// <param name="btnOrientation">按鈕排列 0-按鈕豎直排列,1-按鈕橫向排列</param>
public static void SendActionCard(string title, string imageUrl, string texttitle, string text, string btnTitle, string buttonUrl, string btnOrientation)
{
jsonStringBuilder.Clear();
jsonStringBuilder.Append($"{{\"actionCard\":{{\"title\":\"{keyWord + title}\"," +
$"\"text\":\" \\r\\n ### {texttitle} \\r\\n {text}\"," +
$"\"btnOrientation\":\"{btnOrientation}\"," +
$"\"singleTitle\":\"{btnTitle}\"," +
$"\"singleURL\":\"{buttonUrl}\"}}," +
$"\"msgtype\":\"actionCard\"}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
//Console.Write(ReturnJson);
}
/// <summary>
/// 獨立發送 ActionCard類型消息
/// </summary>
/// <param name="title">标題</param>
/// <param name="imageUrl">圖檔Url</param>
/// <param name="texttitle">文本标題</param>
/// <param name="text">文本</param>
/// <param name="buttonUrl1">按鈕1Url</param>
/// <param name="buttonUrl2">按鈕2Url</param>
/// <param name="singleURL1">按鈕1通路Url</param>
/// <param name="singleURL2">按鈕2通路Url</param>
/// <param name="btnOrientation"></param>
public static void SendActionCard(string title, string imageUrl, string texttitle, string text, string buttonUrl1, string buttonUrl2, string singleURL1, string singleURL2, string btnOrientation)
{
jsonStringBuilder.Clear();
jsonStringBuilder.Append($"{{\"actionCard\":{{\"title\":\"{keyWord + title}\"," +
$"\"text\":\" \\r\\n ### {texttitle} \\r\\n {text}\"," +
$"\"btnOrientation\":\"{btnOrientation}\"," +
$"\"btns\":[{{\"title\":\"{buttonUrl1}\"," +
$"\"actionURL\":\"{singleURL1}\"}}," +
$"{{\"title\":\"{buttonUrl2}\"," +
$"\"actionURL\":\"{singleURL2}\"}}]}}," +
$"\"msgtype\":\"actionCard\"}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
//Console.Write(ReturnJson);
}
/// <summary>
/// 發送 FeedCard類型消息
/// </summary>
/// <param name="title1">标題 單條資訊文本</param>
/// <param name="messageUrl1">點選單條資訊到跳轉連結</param>
/// <param name="imageUrl1">單條資訊後面圖檔的URL</param>
/// <param name="title2"></param>
/// <param name="messageUrl2"></param>
/// <param name="imageUrl2"></param>
public static void SendFeedCard(string title1, string messageUrl1, string imageUrl1, string title2, string messageUrl2, string imageUrl2)
{
jsonStringBuilder.Clear();
jsonStringBuilder.Append($"{{\"feedCard\":{{\"links\":[{{\"title\":\"{keyWord + title1}\"," +
$"\"messageURL\":\"{messageUrl1}\"," +
$"\"picURL\":\"{imageUrl1}\"}}," +
$"{{\"title\":\"{title2}\"," +
$"\"messageURL\":\"{messageUrl2}\"," +
$"\"picURL\":\"{imageUrl2}\"}}]}}," +
$"\"msgtype\":\"feedCard\"}}");
string ReturnJson = Post(jsonStringBuilder.ToString());
}
}
3
Use —— 使用方法
疫情原因,居家辦公,移動辦公或将成為未來世界的主流。
靜态函數,直接調用即可
// 1- Text 類型
ChinarDing.SendText("Hello World!", new List<string>(), false);
//2- Link 類型
ChinarDing.SendLink("Link", "測試 Post Link 請求", "http://qiniu.chinar.xin/DingChinar-3.png", "http://www.chinar.xin");
// 3- Markdown 類型
ChinarDing.SendMarkdown("Markdown", "測試 MD 請求", "http://qiniu.chinar.xin/DingChinar-3.png", new List<string> {"135XXX53210"}, false);
// 4- Markdown 類型
ChinarDing.SendActionCard("Card", "http://qiniu.chinar.xin/DingChinar-3.png", "Text 标題", "測試 MD 請求", "内容不錯", "不感興趣", "https://www.dingtalk.com/", "https://www.dingtalk.com/", "0");
ChinarDing.SendActionCard("喬布斯 20 年前想打", "https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png", "喬布斯 20 年前想打造的蘋果咖啡廳", "Apple Store 的設計正從原來滿滿的科技感走向生活化,", "内容不錯", "不感興趣", "https://www.dingtalk.com/", "https://www.dingtalk.com/", "0");
ChinarDing.SendFeedCard("時代的火車向前開", "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI", "https://gw.alicdn.com/tfs/TB1ayl9mpYqK1RjSZLeXXbXppXa-170-62.png", "時代的火車向前開", "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI", "https://gw.alicdn.com/tfs/TB1ayl9mpYqK1RjSZLeXXbXppXa-170-62.png");
ChinarDing.SendActionCard("喬布斯 20 年前想打", "https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png", "喬布斯 20 年前想打造的蘋果咖啡廳", "Apple Store 的設計正從原來滿滿的科技感走向生活化,", "内容不錯", "https://www.dingtalk.com/", "0");
Console.ReadKey();
支援
May Be —— 開發者,總有一天要做的事!
擁有自己的伺服器,無需再找攻略 Chinar 提供一站式《零》基礎教程 使有限時間 具備無限可能! |
END
本部落格為非營利性個人原創,除部分有明确署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究
對于需要複制、轉載、連結和傳播部落格文章或内容的,請及時和本部落客進行聯系,留言,Email: [email protected]
對于經本部落客明确授權和許可使用文章及内容的,使用時請注明文章或内容出處并注明網址