钉钉通用接口

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading;

namespace Dingding
{
    public  class DingApi
    {
        /// <summary>  
        /// 访问AccessToken  
        /// </summary>  
        public class HCAccessToken
        {
            /// <summary>  
            /// 票据的值  
            /// </summary>  
            public string Value { get; set; }

            /// <summary>  
            /// 票据的开始时间  
            /// </summary>  
            public DateTime Begin { get; set; } = DateTime.Parse("1970-01-01");
        }
        /// <summary>  
        /// 访问ticket  
        /// </summary>  
        public class HCAccessticket
        {
            /// <summary>  
            /// 票据的值  
            /// </summary>  
            public string Value { get; set; }

            /// <summary>  
            /// 票据的开始时间  
            /// </summary>  
            public DateTime Begin { get; set; } = DateTime.Parse("1970-01-01");
        }
        public static HCAccessToken HCToken = new HCAccessToken();
        public static HCAccessticket HCticket = new HCAccessticket();
        #region 更新AccessToken 
        /// <summary>  
        ///更新票据  
        /// </summary>  
        /// <param name="forced">true:强制更新.false:按缓存是否到期来更新</param>  
        public static void UpdateAccessToken(bool forced = false)
        {
            //ConstVars.CACHE_TIME是缓存时间(常量,也可放到配置文件中),这样在有效期内则直接从缓存中获取票据,不需要再向服务器中获取。  
            if (!forced && HCToken.Begin.AddMinutes(100) >= DateTime.Now)
            {//没有强制更新,并且没有超过缓存时间  
                return;
            }
            GetAccessToken();
        }
        #endregion
        #region 更新ticket  
        /// <summary>  
        ///更新票据  
        /// </summary>  
        /// <param name="forced">true:强制更新.false:按缓存是否到期来更新</param>  
        public static void Updateticket(bool forced = false)
        {
            //ConstVars.CACHE_TIME是缓存时间(常量,也可放到配置文件中),这样在有效期内则直接从缓存中获取票据,不需要再向服务器中获取。  
            if (!forced && HCticket.Begin.AddMinutes(100) >= DateTime.Now)
            {//没有强制更新,并且没有超过缓存时间  
                return;
            }
            Get_jsapi_ticket();
        }
        #endregion


        #region 自定义机器人
        // public static string webhook = "https://oapi.dingtalk.com/robot/send?access_token=6c82bc8ba63652cfa77f5e7d67d42a66327c5ce9a3fd8eb577bf382f9cd2f96e";
         public static string webhook = ConfigurationManager.AppSettings["webhook"];
       // public static string webhook = "https://oapi.dingtalk.com/robot/send?access_token=f781cb8870971aebd4497b9ab7a1f79fbbda110f745e24e1c102947c64b5e029";
        #region 机器人发送Text信息
        /// <summary>
        /// 机器人发送Text信息
        /// </summary>
        /// <param name="content">发送内容</param>
        /// <param name="Mobiles">手机号</param>
        /// <param name="isAtAll">是否@所有人</param>
        /// <returns></returns>
        public static string RobotSentText(string content, string[] Mobiles, bool isAtAll)
        {
            var json = new
            {
                msgtype = "text",
                text = new
                {
                    content = content
                },
                at = new
                {
                    atMobiles = Mobiles
                },
                isAtAll = isAtAll
            };
            var dataStr = JsonConvert.SerializeObject(json);
            string result = HttpPost(webhook, dataStr);
            return result;
        }
        #endregion

        #region 机器人发送Link信息
        /// <summary>
        /// 机器人发送Link信息
        /// </summary>
        /// <param name="Title">消息标题</param>
        /// <param name="Text">消息内容 </param>
        /// <param name="picUrl">图片地址</param>
        /// <param name="MessageUrl">点击消息跳转的URL</param>
        /// <returns></returns>
        public static string RobotSentLink(string Title, string Text, string picUrl, string MessageUrl)
        {
            var json = new
            {
                msgtype = "link",
                link = new
                {
                    text = Text,
                    title = Title,
                    picUrl = picUrl,
                    messageUrl = MessageUrl
                }
            };
            var dataStr = JsonConvert.SerializeObject(json);
            string result = HttpPost(webhook, dataStr);
            return result;
        }


        #endregion

        #region 机器人发送markdown信息
        /// <summary>
        /// 机器人发送markdown信息
        /// </summary>
        /// <param name="Title">首屏标题</param>
        /// <param name="Text">Markdown格式消息</param>
        /// <param name="Mobiles">手机号</param>
        /// <param name="isAtAll">是否@所有人</param>
        /// <returns></returns>
        public static string RobotSentMarkdown(string Title, string Text, string[] Mobiles, bool isAtAll)
        {

            var json = new
            {
                msgtype = "markdown",
                markdown = new
                {
                    title = Title,
                    text= "### "+Title+ "\n"+ ">" + Text+ "\n\n"
                    //   text = "### 智慧环卫\n" +
                    //"> 系统实现了地图的浏览、显示等常规的GIS功能,并实现了环卫部件基本信息的浏览、查询以及可视化显示,并对城市部件的突发事件做到及时响应,并实现了已知的位置前往事发地点的最短路径分析,减少了事件处理前不必要的时间浪费。 目标系统已经在实际生活中应用,做到了简单、高效的部件管理和实时的事件响应。环卫设施管理包括对垃圾桶、公厕、中转站等重要环卫设施进行信息化管理,基本管理内容包括基于地图标注、更新、删除、查询环卫设施分布情况,及时登记环卫设施维修维护情况。并可以和RFID卡进行对接,对每个环卫设施建立身份证。\n\n" +
                    //"> ![screenshot](http://zrsoft.cn/images/banner18.jpg)\n" +
                    //"> ###### 10点20分发布 [详情](http://zrsoft.cn/huanwei.html) \n"
                },
                at = new
                {
                    atMobiles = Mobiles
                },
                isAtAll = isAtAll
            };
            var dataStr = JsonConvert.SerializeObject(json);
            string result = HttpPost(webhook, dataStr);
            return result;
        }


        #endregion

        #region 机器人发送FeedCard信息
        /// <summary>
        /// 机器人发送FeedCard信息
        /// </summary>
        /// <param name="links">List<Models.FeedCardLinks></param>
        /// <returns></returns>
        public static string RobotSentFeedCard(List<Models.FeedCardLinks> links)
        {
            var json = new
            {
                msgtype = "feedCard",
                feedCard = new
                {
                    links = (from r in links
                             select r).ToArray()
                }
            };
            var dataStr = JsonConvert.SerializeObject(json);
            string result = HttpPost(webhook, dataStr);
            return result;
        }


        #endregion


        #endregion

        #region 请求方式
        ManualResetEvent allDone = new ManualResetEvent(false);
        public string PostJson(string url, string data, Dictionary<string, string> headers = null)
        {
            string _headers = string.Empty;
            string _strResult = null;
            byte[] byteData = Encoding.UTF8.GetBytes(data);
            allDone.Reset();
            if (headers != null)
            {
                foreach (var item in headers)
                {
                    _headers = _headers + item.Key + "=" + item.Value + "&";
                }
                _headers = _headers.Substring(0, _headers.Length - 1);
            }

            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url + (headers == null ? "" : "?") + _headers);

            httpWebRequest.Method = "POST";
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.BeginGetRequestStream((result) =>
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
                    using (Stream requestStream = request.EndGetRequestStream(result))
                    {
                        requestStream.Write(byteData, 0, byteData.Length);
                    }
                    request.BeginGetResponse(a =>
                    {
                        try
                        {
                            var reponse = request.EndGetResponse(a);
                            using (StreamReader reader = new StreamReader(reponse.GetResponseStream(), System.Text.Encoding.UTF8))
                            {
                                _strResult = reader.ReadToEnd();
                            }
                            allDone.Set();
                        }
                        catch (Exception)
                        {
                            _strResult = null;
                            allDone.Set();
                            //throw;
                        }
                    }, null);
                }
                catch (Exception)
                {
                    _strResult = null;
                    allDone.Set();
                }
            }, httpWebRequest);


            allDone.WaitOne();
            _headers = string.Empty;
            return _strResult;


        }
        pu
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VFP(Visual FoxPro)是一种基于对象的编程语言,常用于Windows平台上的数据库应用程序开发。要调用API接口,可以按照以下步骤进行: 1. 首先,需要在开放平台上创建一个企业应用,获取到应用的CorpID和CorpSecret。这些凭证将用于在API调用中进行身份验证。 2. 在VFP中,可以使用URLMON库来发送HTTP请求。使用URLMON库的URLDownloadToFile函数可以下载API返回的数据到本地文件。同时,还可以使用API相关的地址和参数构建需要调用的URL。 3. 在VFP中,可以使用ADO(ActiveX Data Objects)来处理HTTP请求的返回值。通过创建一个ADODB.Stream对象,可以读取下载的API返回的数据,并进行进一步的操作和处理。 4. 在进行API调用时,需要对请求进行签名验证,以确保请求的合法性和安全性。可以使用HMAC-SHA256算法对请求参数进行签名,将签名结果添加到URL中的请求参数中,以验证请求的有效性。 5. 在VFP中,可以使用API的请求参数的JSON格式来进行请求。可以使用VFP的JSON类库或者其他JSON解析器来处理JSON格式的请求参数和返回值。 在调用API接口时,需要仔细阅读开放平台的API文档,了解每个接口的具体使用方法和请求参数,以确保API调用的成功和准确性。完成以上步骤后,即可在VFP中调用API接口,实现与的数据交互和业务操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值