釘釘消息機器人.Net通用C#Unity實現釘釘消息通知一個工具類(無需SDK,無其他引用)

Chinar blog www.chinar.xin

.Net通用釘釘自定義機器人


本文提供全流程,中文翻譯。

Chinar 的初衷是將一種簡單的生活方式帶給世人

使有限時間 具備無限可能

Chinar —— 心分享、心創新!

助力快速完成 .Net 通用的釘釘Post機器人消息通知

爲初學者節省寶貴的時間,避免採坑!

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} " +
                                 $"![screenshot]({imageUrl})\\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\":\"![screenshot]({imageUrl}) \\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\":\"![screenshot]({imageUrl}) \\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 提供一站式《零》基礎教程

使有限時間 具備無限可能!

先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)


Chinar 免費服務器、建站教程全攻略!( Chinar Blog )


Chinar

END

本博客爲非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均爲本人所擁有,本人保留所有法定權利。違者必究

對於需要複製、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯繫,留言,Email: [email protected]

對於經本博主明確授權和許可使用文章及內容的,使用時請註明文章或內容出處並註明網址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章