.net C# 最全最实用钉钉群机器人封装

1 打开群设置 > 智能群助手 > 添加机器人 > 自定义

2 我选择的是加签的方法,其他的比较简单。

 

 3 只需要按照需求传入对应的参数即可,当然如果没有加签可以不传签名

public static class DingTalkRobot
    {
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="weebhook">webhook链接</param>
        /// <param name="msgType">消息类型</param>
        /// <param name="msg">消息内容</param>
        /// <param name="atuserlist">@用户的手机号组</param>
        /// <param name="atall">@所有人</param>
        public static void SendMessage(string weebhook, MsgTypeEnum msgType, IBaseMsg msg,string secret="", List<string> atuserlist = null, bool atall = false)
        {
            var _timespan = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds() * 1000;
            var url = weebhook;
            if (!string.IsNullOrEmpty(secret))
            {
                var _sign = addSign(_timespan, secret);
                url += $"&timestamp={_timespan}&sign={_sign}";
            }
            IDingTalkClient client = new DefaultDingTalkClient(url);
            OapiRobotSendRequest request = new OapiRobotSendRequest();
            var _this = typeof(DingTalkRobot);
            var action = _this.GetMethod(msgType.ToString(), BindingFlags.Static | BindingFlags.NonPublic);
            action.Invoke(null,new object[] { request , msg });
            request.AtUser(atuserlist, atall);
            OapiRobotSendResponse response = client.Execute(request);
        }
        /// <summary>
        /// 发送text消息
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="atuserlist"></param>
        /// <returns></returns>
        private static void TextMessage( OapiRobotSendRequest request, IBaseMsg msg)
        {
            request.Msgtype = "text";
            request.Text_ = msg.Adapt<OapiRobotSendRequest.TextDomain>();
        }
        /// <summary>
        /// 发送链接消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="MessageUrl">消息链接</param>
        /// <param name="PicUrl">图片链接</param>
        /// <param name="Title">标题</param>
        /// <param name="Text">说明</param>
        private static void LinkMessage( OapiRobotSendRequest request, IBaseMsg msg)
        {
            request.Msgtype = "link";
            request.Link_ = msg.Adapt<OapiRobotSendRequest.LinkDomain>();
        }
        /// <summary>
        /// 发送Markdown消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="Title"></param>
        /// <param name="Text"></param>
        private static void MarkdownMessage( OapiRobotSendRequest request, IBaseMsg msg)
        {
            request.Msgtype = "markdown";
            request.Markdown_ = msg.Adapt<OapiRobotSendRequest.MarkdownDomain>();
        }
        /// <summary>
        ///发送任务卡片消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="Title"></param>
        /// <param name="Text"></param>
        /// <param name="SingleTitle"></param>
        /// <param name="SingleURL"></param>
        private static void ActionCardMessage( OapiRobotSendRequest request, IBaseMsg msg)
        {
            request.Msgtype = "actionCard";
            request.ActionCard_ = msg.Adapt<OapiRobotSendRequest.ActioncardDomain>();
        }
        /// <summary>
        /// 发送卡片菜单消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="msglist"></param>
        private static void FeedCardMessage( OapiRobotSendRequest request, IBaseMsg msg)
        {
            request.Msgtype = "feedCard";
            request.FeedCard_ = msg.Adapt<OapiRobotSendRequest.FeedcardDomain>();
        }
        /// <summary>
        /// @用户
        /// </summary>
        /// <param name="request"></param>
        /// <param name="atuserlist"></param>
        private static void AtUser(this OapiRobotSendRequest request, List<string> atuserlist,bool IsAtAll=false)
        {
            OapiRobotSendRequest.AtDomain at = new OapiRobotSendRequest.AtDomain();
            if (!IsAtAll)
            {
                at.AtMobiles = atuserlist;
            }
            at.IsAtAll = IsAtAll;
            request.At_ = at;
        }
        /// <summary>
        /// 加签
        /// </summary>
        /// <param name="zTime">当前时间戳</param>
        /// <returns></returns>
        private static string addSign(long zTime,string secret)
        {
            string stringToSign = zTime + "\n" + secret;
            var encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(stringToSign);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                return HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8);
            }
        }
    }
public class TextDomainInput : IBaseMsg
    {
        public string Content { get; set; }   
    }
    public class LinkDomainInput : IBaseMsg
    {
        public string MessageUrl { get; set; }
        public string PicUrl { get; set; }
        public string Title { get; set; }
        public string Text { get; set; }
    }
    public class MarkdownDomainInput : IBaseMsg
    {
        public string Title { get; set; }
        public string Text { get; set; }
    }
    public class ActioncardDomainInput : IBaseMsg
    {
        public string Title { get; set; }
        public string Text { get; set; }
        public string SingleTitle { get; set; }
        public string SingleURL { get; set; }
        public string btnOrientation { get; set; }
        public List<ActioncardBtn> Btns { get; set; }
    }
    public class ActioncardBtn : IBaseMsg
    {
        public string Title { get; set; }
        public string ActionURL { get; set; }
    }
    public class FeedcardDomainInput: IBaseMsg
    {
        public List<LinkDomainInput> Links { get; set; }
    }
    public interface IBaseMsg
    { 
    }
    public enum MsgTypeEnum
    {
        /// <summary>
        /// 文本消息
        /// </summary>
        TextMessage,
        /// <summary>
        /// 链接消息
        /// </summary>
        LinkMessage,
        /// <summary>
        /// Markdown消息
        /// </summary>
        MarkdownMessage,
        /// <summary>
        /// 卡片消息
        /// </summary>
        ActionCardMessage,
        /// <summary>
        /// 菜单消息
        /// </summary>
        FeedCardMessage
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: EasyModbus.NET C# 是一个开源的 Modbus TCP/IP 通信库,使用C#语言编写,用于在 .NET 环境中实现Modbus通信协议。它提供了使用TcpClient或UdpClient进行通信的简单接口,同时支持多个Modbus设备的连接和管理。EasyModbus.NET C# 可以在Windows、Linux以及其他 .NET环境下运行,是一种非常实用的工具。 EasyModbus.NET C# 有丰富的API,可以通过它进行Modbus协议的读写操作,包括读写Modbus寄存器、读写多个寄存器、读取Coil、Input等等。同时,EasyModbus.NET C# 也提供了对于MODBUS TCP / IP、MODBUS UDP 、RTU和ASCII通信协议的支持,可以灵活选择并切换协议类型,以满足不同的需求。 EasyModbus.NET C# 还提供了详细的文档和示例,可以帮助用户快速上手,并且找到解决方案。此外,EasyModbus.NET C# 还支持多语言环境,包括中文、英文、德文等几十种语言,并且能够在多种操作系统(如Windows和Linux)上无缝运行,适用性非常广泛。 EasyModbus.NET C# 在工业控制、自动化设备等方面的应用非常广泛,它的优点包括简单易用、接口完善、高效稳定、代码开放等等。EasyModbus.NET C# 不仅可以实现Modbus协议通信的实际应用,也可以作为学习、研究Modbus协议的研究者使用,并且EasyModbus.NET C#源代码也是开放的,用户可以根据个人需求进行调整和定制。 ### 回答2: Easymodbus是一个免费的Modbus协议库,针对C#编程语言和.NET框架,可以轻松实现Modbus TCP、Modbus RTU和Modbus ASCII通信。它支持从站和主站的通信,并且具有简单易用、高性能、开源免费等特点。 Easymodbus .NET C#库提供了许多功能,如读取和写入单个和多个位、单个和多个寄存器,快速读取和写入连续位和寄存器,以及读取和写入文件寄存器和输入寄存器。使用Easymodbus库可以轻松实现设备之间的数据交换,具有简便、高效、准确的特点,适用于多种应用场景,如工业自动化、数据采集、物联网等领域。 Easymodbus库的代码容易理解和修改,可以扩展和调整实现Modbus传输协议。此外,它还为用户提供了详细的文档和示例程序,可以帮助用户掌握如何使用库的各种功能。总之,Easymodbus .NET C#库是一个非常有用的工具,可以帮助工程师轻松实现Modbus通信,提高生产效率和质量。 ### 回答3: Easymodbus .net c是一个开源的Modbus通讯库,使用C#语言编写。它支持TCP和RTU协议,可在Windows和Linux操作系统上运行。 Easymodbus .net c被广泛应用于工业自动化领域,用于与各种设备进行通信,如PLC(可编程逻辑控制器)、传感器和执行器等。该库提供了易于使用的API,使用户可以轻松地实现Modbus通信,同时也提供了丰富的文档和示例代码以便用户学习和使用。Easymodbus .net c也可以与其他编程语言集成,如Java和Python。该库具有稳定性和可靠性,因此它是一个高效的解决方案,帮助工程师们在工业自动化项目中更轻松地实现Modbus通信,提高设备控制的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值