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