钉钉自定义机器人.net版

using System;
using System.Collections.Generic;
using System.Linq;
using UtilsCore.Result;

namespace UtilsCore
{
    /// <summary>
    /// 钉钉自定义机器人
    /// </summary>
    public class DingTalkRobot
    {
        /// <summary>
        ///  调用自定义机器人发Text类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="content">消息内容</param>
        /// <param name="atMobiles">被@人的手机号</param>
        /// <param name="isAtAll">@所有人时:true,否则为:false</param>
        /// <returns></returns>
        public static BaseResult<object> SendTextMessage(string webhook, string content, List<string> atMobiles, bool isAtAll)
        {
            var result=new BaseResult<object>();
            try
            {
                //@手机号
                var mobiles = "";
                if (!isAtAll)
                {
                    mobiles = GetAtMobiles(atMobiles);
                }
                //消息内容
                object message = new
                {
                    msgtype = "text",
                    text = new
                    {
                        content = (content+ mobiles).Trim(),
                    },
                    at = new
                    {
                        atMobiles = atMobiles,
                        isAtAll = isAtAll
                    }
                };
                return SendMessage(webhook, message);
                 
            }
            catch (Exception ex)
            {
               result.SetError(ex.Message);
               return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发Link类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="title">消息标题</param>
        /// <param name="text">消息内容(注:如果太长只会部分展示)</param>
        /// <param name="picUrl">图片url</param>
        /// <param name="messageUrl">点击消息跳转的url</param>
        /// <returns></returns>
        public static BaseResult<object> SendLinkMessage(string webhook, string title, string text,string picUrl, string messageUrl)
        {
            var result=new BaseResult<object>();
            try
            {
                object message = new
                {
                    msgtype = "link",
                    link = new
                    {
                        title = title,
                        text = text,
                        picUrl = picUrl,
                        messageUrl = messageUrl
                    },
                };
                return SendMessage(webhook, message);
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发Markdown类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="title">消息标题</param>
        /// <param name="titleType">标题类型等级</param>
        /// <param name="markdownMessages">消息内容</param>
        /// <param name="atMobiles">被@手机号</param>
        /// <param name="isAtAll">@所有人时:true,否则为:false</param>
        /// <returns></returns>
        public static BaseResult<object> SendMarkdownMessage(string webhook, string title, TitleType titleType, List<MarkdownMessage> markdownMessages, List<string> atMobiles, bool isAtAll)
        {
            var result = new BaseResult<object>();
            try
            {
                //@手机号
                var mobiles = "";
                if (!isAtAll)
                {
                    mobiles = GetAtMobiles(atMobiles);
                }
                //消息内容头部(标题+被@的人;注:自动换行)
                var textTop = GetContentGrade(titleType, title) + "\n >" + mobiles + "\n >";
                //消息内容
                var text = textTop + RestructureMessage(markdownMessages);
                object message = new
                {
                    msgtype = "markdown",
                    markdown = new
                    {
                        title = title,
                        text = text,
                    },
                    at = new
                    {
                        atMobiles = atMobiles,
                        isAtAll = isAtAll,
                    }
                };
                return SendMessage(webhook, message);
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发整体跳转ActionCard类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="title">消息标题</param>
        /// <param name="markdownMessages">消息内容</param>
        /// <param name="hideAvatar">0-正常发消息者头像,1-隐藏发消息者头像</param>
        /// <param name="btnOrientation">0-按钮竖直排列,1-按钮横向排列</param>
        /// <param name="singleTitle">单个按钮的方案。(设置此项和singleUrl后btns无效。)</param>
        /// <param name="singleUrl">点击singleTitle按钮触发的URL</param>
        /// <returns></returns>
        public static BaseResult<object> SendActionCardMessage(string webhook, string title, List<MarkdownMessage> markdownMessages, int hideAvatar, int btnOrientation, string singleTitle, string singleUrl)
        {
            var result = new BaseResult<object>();
            try
            {
                object message = new
                {
                    msgtype = "actionCard",
                    actionCard = new
                    {
                        title = title,
                        text = RestructureMessage(markdownMessages),
                        hideAvatar = hideAvatar,
                        btnOrientation = btnOrientation,
                        singleTitle = singleTitle,
                        singleURL = singleUrl
                    },
                };
                return SendMessage(webhook, message);
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发独立跳转ActionCard类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="title">消息标题</param>
        /// <param name="markdownMessages">消息内容</param>
        /// <param name="hideAvatar">0-正常发消息者头像,1-隐藏发消息者头像</param>
        /// <param name="btnOrientation">0-按钮竖直排列,1-按钮横向排列</param>
        /// <param name="btns">按钮集合</param>
        /// <returns></returns>
        public static BaseResult<object> SendSingleActionCardMessage(string webhook, string title, List<MarkdownMessage> markdownMessages, int hideAvatar, int btnOrientation, List<Btn> btns)
        {
            var result = new BaseResult<object>();
            try
            {
                var btnObjs = new List<object>();
                if (btns != null && btns.Count > 0)
                {
                    foreach (var item in btns)
                    {
                        object obj = new { title = item.Title, actionURL =item.ActionUrl };
                        btnObjs.Add(obj);
                    }
                }
                object message = new
                {
                    actionCard = new
                    {
                        title= title,
                        text = RestructureMessage(markdownMessages),
                        hideAvatar = hideAvatar,
                        btnOrientation = btnOrientation,
                        btns = btnObjs
                    },
                    msgtype = "actionCard",
                };
                return SendMessage(webhook, message);
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发FeedCard类型消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="links">图片按钮集合</param>
        /// <returns></returns>
        public static BaseResult<object> SendFeedCardMessage(string webhook, List<Link> links)
        {
            var result = new BaseResult<object>();
            try
            {
                var linkObjs = new List<object>();
                if (links != null && links.Count > 0)
                {
                    foreach (var item in links)
                    {
                        object obj = new {title = item.Title, messageURL = item.MessageUrl, picURL = item.PicUrl};
                        linkObjs.Add(obj);
                    }
                }
                object message = new
                {
                    feedCard = new
                    {
                        links = linkObjs,
                    },
                    msgtype = "feedCard"
                };
                return SendMessage(webhook, message);
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }

        /// <summary>
        /// 调用自定义机器人发消息
        /// </summary>
        /// <param name="webhook">webHook地址</param>
        /// <param name="message">消息信息</param>
        /// <returns></returns>

        private static BaseResult<object> SendMessage(string webhook, object message)
        {
            var result=new BaseResult<object>();
            try
            {
                var webHelper=new WebHelper();
                result.Result=webHelper.DoPost<object>(webhook, message, out var tips);
                result.Msg = tips;
                if (tips == "请求成功") return result;
                result.SetError(tips);
                return result;
            }
            catch (Exception ex)
            {
                result.SetError(ex.Message);
                return result;
            }
        }
        
        /// <summary>
        /// 重构消息内容
        /// </summary>
        /// <param name="markdownMessages">消息内容</param>
        /// <returns></returns>
        private static string RestructureMessage(List<MarkdownMessage> markdownMessages)
        {
            var text = "";
            foreach (var item in markdownMessages.OrderBy(x => x.Index))
            {
                switch (item.MarkdownType)
                {
                    case MarkdownType.文本:
                    {
                        switch (item.Text.ContentType)
                        {
                            case ContentType.默认:
                                item.Text.Content = item.Text.Content;
                                break;
                            case ContentType.加粗:
                                item.Text.Content = "**" + item.Text.Content + "**";
                                break;
                            case ContentType.斜体:
                                item.Text.Content = "*" + item.Text.Content + "*";
                                break;
                            default:
                                item.Text.Content = item.Text.Content;
                                break;
                        }
                        //文本等级赋值
                        item.Text.Content = GetContentGrade(item.Text.ContentGrade, item.Text.Content);
                        //判断是否换行
                        text += (item.IsLineFeed) ? item.Text.Content + "\n >" : item.Text.Content;
                        break;
                    }
                    case MarkdownType.图片:
                        text += (item.IsLineFeed) ? "![screenshot](" + item.Text.ImgUrl + ")\n >" : "![screenshot](" + item.Text.ImgUrl + ")";
                        break;
                    case MarkdownType.链接:
                        text += (item.IsLineFeed) ? "[" + item.Text.Content + "](" + item.Text.Url + ")\n >" : "[" + item.Text.Content + "](" + item.Text.Url + ")";
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
            return text;
        }

        /// <summary>
        /// 获取被@人的手机号
        /// </summary>
        /// <param name="atMobiles">被@人的手机号</param>
        /// <returns></returns>
        private static string GetAtMobiles(List<string> atMobiles)
        {
            var mobiles = "";
            if (atMobiles == null || atMobiles.Count <= 0) return mobiles;
            foreach (var item in atMobiles)
            {
                mobiles += "@" + item;
            }
            return mobiles;
        }

        /// <summary>
        /// 获取等级文本
        /// </summary>
        /// <param name="titleType">文本类型</param>
        /// <param name="title">文本</param>
        /// <returns></returns>
        private static string GetContentGrade(TitleType titleType, string title)
        {
            switch (titleType)
            {
                case TitleType.默认:
                    break;
                case TitleType.一级:
                    title = "# " + title;
                    break;
                case TitleType.二级:
                    title = "## " + title;
                    break;
                case TitleType.三级:
                    title = "### " + title;
                    break;
                case TitleType.四级:
                    title = "#### " + title;
                    break;
                case TitleType.五级:
                    title = "##### " + title;
                    break;
                case TitleType.六级:
                    title = "###### " + title;
                    break;
                default:
                    break;
            }
            return title;
        }
    }

    #region 公共模型

    /// <summary>
    /// Markdown消息内容类
    /// </summary>
    public class MarkdownMessage
    {
        /// <summary>
        /// 内容坐标索引
        /// </summary>
        public int Index { get; set; }

        /// <summary>
        /// 内容类型(文字、图片、链接)
        /// </summary>
        public MarkdownType MarkdownType { get; set; }

        /// <summary>
        /// 内容(注:文字类型的内容中禁止字符["#"、"*"、"["、"]"、"!"];
        /// 图片类型和链接类型的内容传可访问的http地址即可)
        /// </summary>
        public Text Text { get; set; }

        /// <summary>
        /// 是否换行
        /// </summary>
        public bool IsLineFeed { get; set; }
    }

    /// <summary>
    /// 内容
    /// </summary>
    public class Text
    {
        /// <summary>
        /// 文本或链接显示文字
        /// </summary>
        public string Content { get; set; }

        /// <summary>
        /// 图片链接
        /// </summary>
        public string ImgUrl { get; set; }

        /// <summary>
        /// 超链接地址
        /// </summary>
        public string Url { get; set; }

        /// <summary>
        /// 文本类型
        /// </summary>
        public ContentType ContentType { get; set; }

        /// <summary>
        /// 文本等级
        /// </summary>
        public TitleType ContentGrade { get; set; }
    }

    /// <summary>
    /// 超链接按钮
    /// </summary>
    public class Btn
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 标题对应的超链接
        /// </summary>
        public string ActionUrl { get; set; }
    }

    /// <summary>
    /// 超链接按钮带图片
    /// </summary>
    public class Link
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 超链接
        /// </summary>
        public string MessageUrl { get; set; }

        /// <summary>
        /// 图片超链接
        /// </summary>
        public string PicUrl { get; set; }
    }

    #endregion

    #region 枚举

    /// <summary>
    /// 文本类型
    /// </summary>
    public enum ContentType
    {
        /// <summary>
        /// 默认
        /// </summary>
        默认=0,
        /// <summary>
        /// 加粗
        /// </summary>
        加粗 = 1,
        /// <summary>
        /// 斜体
        /// </summary>
        斜体 = 2
    }

    /// <summary>
    /// Markdown消息内容类型
    /// </summary>
    public enum MarkdownType
    {
        /// <summary>
        /// 文本
        /// </summary>
        文本 = 1,
        /// <summary>
        /// 图片
        /// </summary>
        图片 = 2,
        /// <summary>
        /// 链接
        /// </summary>
        链接 = 3,
    }

    /// <summary>
    /// 标题(文本)类型等级
    /// </summary>
    public enum TitleType
    {
        /// <summary>
        /// 默认
        /// </summary>
        默认 = 0,
        /// <summary>
        /// 一级
        /// </summary>
        一级 = 1,
        /// <summary>
        /// 二级
        /// </summary>
        二级 = 2,
        /// <summary>
        /// 三级
        /// </summary>
        三级 = 3,
        /// <summary>
        /// 四级
        /// </summary>
        四级 = 4,
        /// <summary>
        /// 五级
        /// </summary>
        五级 = 5,
        /// <summary>
        /// 六级
        /// </summary>
        六级 = 6,
    }

    #endregion
}

github源码:https://github.com/agoling/UtilsSharp.Standard

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值