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
{
///
/// 访问AccessToken
///
public class HCAccessToken
{
///
/// 票据的值
///
public string Value { get; set; }
///
/// 票据的开始时间
///
public DateTime Begin { get; set; } = DateTime.Parse("1970-01-01");
}
///
/// 访问ticket
///
public class HCAccessticket
{
///
/// 票据的值
///
public string Value { get; set; }
///
/// 票据的开始时间
///
public DateTime Begin { get; set; } = DateTime.Parse("1970-01-01");
}
public static HCAccessToken HCToken = new HCAccessToken();
public static HCAccessticket HCticket = new HCAccessticket();
#region 更新AccessToken
///
///更新票据
///
/// true:强制更新.false:按缓存是否到期来更新
public static void UpdateAccessToken(bool forced = false)
{
//ConstVars.CACHE_TIME是缓存时间(常量,也可放到配置文件中),这样在有效期内则直接从缓存中获取票据,不需要再向服务器中获取。
if (!forced && HCToken.Begin.AddMinutes(100) >= DateTime.Now)
{//没有强制更新,并且没有超过缓存时间
return;
}
GetAccessToken();
}
#endregion
#region 更新ticket
///
///更新票据
///
/// true:强制更新.false:按缓存是否到期来更新
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信息
///
/// 机器人发送Text信息
///
/// 发送内容
/// 手机号
/// 是否@所有人
///
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信息
///
/// 机器人发送Link信息
///
/// 消息标题
/// 消息内容
/// 图片地址
/// 点击消息跳转的URL
///
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信息
///
/// 机器人发送markdown信息
///
/// 首屏标题
/// Markdown格式消息
/// 手机号
/// 是否@所有人
///
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" +
//"> \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信息
///
/// 机器人发送FeedCard信息
///
/// List
///
public static string RobotSentFeedCard(List 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 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;
}
public static string HttpGet(string Url, string DataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (DataStr == "" ? "" : "?") + DataStr);
request.Method = "GET";
request.ContentType = "application/json;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
public static string HttpPost(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8 ";
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("utf-8"));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
public static string PostFile(string url, string fileWithPath)
{
var result = string.Empty;
var request = (HttpWebRequest)WebRequest.Create(url);
var boundary = "----------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
using (Stream requestStream = request.GetRequestStream())
{
byte[] boundarybytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "–-\r\n");
var filename = Path.GetFileName(fileWithPath);
using (FileStream fs = new FileStream(fileWithPath, FileMode.Open, FileAccess.Read))
{
byte[] bArr = new byte[fs.Length];
fs.Read(bArr, 0, bArr.Length);
requestStream.Write(boundarybytes, 0, boundarybytes.Length);
var header = $"Content-Disposition:form-data;name=\"media\";filename=\"{filename}\"\r\nfilelength=\"{fs.Length}\"\r\nContent-Type:application/octet-stream\r\n\r\n";
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(header.ToString());
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
fs.Close();
requestStream.Write(bArr, 0, bArr.Length);
requestStream.Write(trailer, 0, trailer.Length);
}
}
var response = (HttpWebResponse)request.GetResponse();
var responseStream = response.GetResponseStream();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
return result;
}
#endregion
#region 主要类
public class AccessTokenlist
{
///
/// 错误码
///
public string errcode { get; set; }
///
/// 错误信息
///
public string errmsg { get; set; }
///
/// access_token
///
public string access_token { get; set; }
}
public class Message
{
///
/// 错误码
///
public string errcode { get; set; }
///
/// 错误信息
///
public string errmsg { get; set; }
///
/// messageId
///
public string messageId { get; set; }
///
/// invalidparty
///
public string invalidparty { get; set; }
}
public class TextMsgModelmarkdown
{
public string agentid { get; set; }
public string touser { get; set; }
public string msgtype { get; set; }
public markdown markdown { get; set; }
}
public class CreateGroup2
{
///
/// 错误码
///
public string errcode { get; set; }
///
/// 错误信息
///
public string errmsg { get; set; }
///
/// access_token
///
public string chatid { get; set; }
}
public class markdown
{
public string title { get; set; }
public string text { get; set; }
}
public class text
{
public string content { get; set; }
}
#endregion
#region 获取唯一凭证token(已测试)
public static string JTToken;
public static string GetAccessToken()
{
string corpid = "corpid="+ ConfigurationManager.AppSettings["corpId"]+"&corpsecret="+ConfigurationManager.AppSettings["corpSecret"];
string result = HttpGet("https://oapi.dingtalk.com/gettoken/", corpid);
AccessTokenlist token = JsonConvert.DeserializeObject(result);
HCToken.Value = token.access_token;
HCToken.Begin = DateTime.Now;
JTToken = token.access_token;
return JTToken;
}
#endregion
#region 获取jsapi_ticket(已测试)
public class Get_jsapi_ticketM
{
public string type { get; set; }
public string ticket { get; set; }
}
public static string JTticket;
public static string Get_jsapi_ticket()
{
//UpdateAccessToken();
string url = string.Format("https://oapi.dingtalk.com/get_jsapi_ticket?access_token={0}&type=jsapi", JTToken);
string result = HttpGet(url, "");
Get_jsapi_ticketM token = JsonConvert.DeserializeObject(result);
result= token.ticket;
//HCticket.Value = token.ticket;
//HCticket.Begin = DateTime.Now;
JTticket = result;
return result;
}
#endregion
#region 获取随机码
///
///开发者在web页面使用钉钉容器提供的jsapi时,需要验证调用权限,并以参数signature标识合法性
///签名生成的规则:
///List keyArray = sort(noncestr, timestamp, jsapi_ticket, url);
/// String str = assemble(keyArray);
///signature = sha1(str);
///
/// 随机字符串,自己随便填写即可
/// 当前时间戳,具体值为当前时间到1970年1月1号的秒数
/// 获取的jsapi_ticket
/// 当前网页的URL,不包含#及其后面部分
/// 生成的签名
/// 0 成功,2 失败
public static string GenSigurate(string noncestr, string sTimeStamp, string jsapi_ticket, string url)
{
//例如:
//noncestr = Zn4zmLFKD0wzilzM
//jsapi_ticket = mS5k98fdkdgDKxkXGEs8LORVREiweeWETE40P37wkidkfksDSKDJFD5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcKIDU8l
//timestamp = 1414588745
//url = http://open.dingtalk.com
//步骤1.sort()含义为对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)
//注意,此处是是按照【字段名】的ASCII字典序,而不是参数值的字典序(这个细节折磨我很久了)
//0:jsapi_ticket 1:noncestr 2:timestamp 3:url;
//步骤2.assemble()含义为根据步骤1中获的参数字段的顺序,使用URL键值对的格式(即key1 = value1 & key2 = value2…)拼接成字符串
//string assemble = "jsapi_ticket=3fOo5UfWhmvRKnRGMmm6cWwmIxDMCnniyVYL2fqcz1I4GNU4054IOlif0dZjDaXUScEjoOnJWOVrdwTCkYrwSl&noncestr=CUMT1987wlrrlw×tamp=1461565921&url=https://jackwangcumt.github.io/home.html";
string assemble = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, sTimeStamp, url);
//步骤2.sha1()的含义为对在步骤2拼接好的字符串进行sha1加密。
SHA1 sha;
ASCIIEncoding enc;
string hash = "";
sha = new SHA1CryptoServiceProvider();
enc = new ASCIIEncoding();
byte[] dataToHash = enc.GetBytes(assemble);
byte[] dataHashed = sha.ComputeHash(dataToHash);
hash = BitConverter.ToString(dataHashed).Replace("-", "");
hash = hash.ToLower();
return hash;
}
public static string GetSign(string ticket, string noceStr, string timeStamp, string url)
{
string plain = string.Format("noncestr={1}×tamp={2}&jsapi_ticket={0}&url={3}", JTticket, noceStr, timeStamp, url);
try
{
byte[] bytes = Encoding.UTF8.GetBytes(plain);
byte[] digest = SHA1.Create().ComputeHash(bytes);
string digestBytesString = BitConverter.ToString(digest).Replace("-", "").ToLower();
return digestBytesString.ToLower();
}
catch (Exception e)
{
throw;
}
}
#endregion
#region 通过CODE换取用户身份
public static string GetUserabout(string Code)
{
string url = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", GetAccessToken(), Code);
string result = HttpGet(url, "");
GetUserInfoModel model = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
return model.userid;
}
#endregion
#region 获取企业自定义空间
public class GetSpaceId
{
///
/// 错误码
///
public string errcode { get; set; }
///
/// 错误信息
///
public string errmsg { get; set; }
///
/// access_token
///
public string spaceid { get; set; }
}
public static string GetSpace(string domain)
{
string url = string.Format("https://oapi.dingtalk.com/cspace/get_custom_space?access_token={0}&domain={1}&agent_id={2}", JTToken, domain, "136369019");
string result = HttpGet(url, "");
GetSpaceId model = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
return model.spaceid;
}
#endregion
#region 授权用户访问企业下的自定义空间
public class GetUserJurisdiction
{
///
/// 错误码
///
public string errcode { get; set; }
///
/// 错误信息
///
public string errmsg { get; set; }
}
public static string GetJurisdiction(string Id)
{
string url = string.Format("https://oapi.dingtalk.com/cspace/grant_custom_space?access_token={0}&domain=ABC123&agent_id={1}&type=add&userid={2}&path=/&fileids=&duration=600", JTToken,"136369019",Id);
string result = HttpGet(url, "");
GetUserJurisdiction model = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
return model.errcode;
}
#endregion
#region 创建一个群(已测试)
public class CreateQModel
{
public string name { get; set; }
public string owner { get; set; }
public string[] useridlist { get; set; }
}
///
/// 创建会话
///
/// 群名称
/// 群主userId
/// 群成员列表UserId用,隔开即可,每次最多操作40人,群人数上限为1000
/// 返回群会话的Id
public static string CreateGroup(string name, string owner, string[] useridlist)
{
string url = string.Format("https://oapi.dingtalk.com/chat/create?access_token={0}", GetAccessToken());
var msgModel = new CreateQModel
{
name = name,
owner = owner,
useridlist = useridlist
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
CreateGroup2 token = JsonConvert.DeserializeObject(result);
return token.chatid;
}
#endregion
#region 获取群会话(已测试)
public class GetChatM
{
public string chatid { get; set; }
}
///
/// 获取群会话
///
/// 群会话的id
/// name 群名称 owner 群主userid useridlist 群成员userId列表
public static string GetChat(string chatid)
{
string url = string.Format("https://oapi.dingtalk.com/chat/get?access_token={0}&chatid={1}", GetAccessToken(), chatid);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 发送群消息 markdown消息(已测试)
public class MessageateModel
{
public string chatid { get; set; }
public string msgtype { get; set; }
public markdown markdown { get; set; }
}
///
/// 发送群消息 markdown消息
///
/// 会话Id
/// 标题
/// 内容
///
public static string SendGroupMessageate(string chatid, string title, string text)
{
string url = string.Format("https://oapi.dingtalk.com/chat/send?access_token={0}", GetAccessToken());
var msgModel = new MessageateModel
{
chatid = chatid,
msgtype = "markdown",
markdown = new markdown()
{
title = title,
text = text
},
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
return result;
}
#endregion
#region 创建成员(已测试)
public class CreteUserModel
{
public string userid { get; set; }
public string name { get; set; }
public string[] department { get; set; }
public string mobile { get; set; }
}
///
/// 创建成员
///
/// 员工唯一标识ID
/// 成员名称
/// 数组类型,数组里面值为整型,成员所属部门id列表
/// 手机号码,企业内必须唯一
///
public static string CreateUser(string userid, string name, string[] department, string mobile)
{
string url = string.Format("https://oapi.dingtalk.com/user/create?access_token={0}", GetAccessToken());
var msgModel = new CreteUserModel
{
userid = userid,
name = name,
department = department,
mobile = mobile
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
return result;
}
#endregion
#region 删除成员(已测试)
public class DeleteUserModel
{
public string userid { get; set; }
}
///
/// 删除成员
///
/// 员工唯一标识ID
///
public static string DeleteUser(string userid)
{
string url = string.Format("https://oapi.dingtalk.com/user/delete?access_token={0}&userid={1}", GetAccessToken(), userid);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 批量删除成员(已测试)
public class batchdelete
{
public string[] useridlist { get; set; }
}
///
/// 批量删除成员
///
/// 员工唯一标识ID "useridlist":["zhangsan","lisi"]
///
public static string DeleteUser(string[] useridlist)
{
string url = string.Format("https://oapi.dingtalk.com/user/batchdelete?access_token={0}", GetAccessToken());
var msgModel = new batchdelete
{
useridlist = useridlist,
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
return result;
}
#endregion
#region 获取成员详情(已测试)
public class UserGetModel
{
public string userid { get; set; }
}
///
/// 获取成员详情
///
/// 员工UserId
/// 返回成员详情
public static string GetUserList(string userid)
{
string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", GetAccessToken(), userid);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 获取管理员列表(已测试)
public class UserGetadmin
{
public long department_id { get; set; }
}
///
/// 获取部门成员
///
/// 获取的部门id
///
public static string simplelist(long department_id)
{
string url = string.Format("https://oapi.dingtalk.com/user/simplelist?access_token={0}&department_id={1}", GetAccessToken(), department_id);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 获取部门成员详情(已测试)
public class UserListModel
{
public long department_id { get; set; }
public long offset { get; set; }
public int size { get; set; }
}
///
/// 获取部门成员详情
///
/// 获取的部门id
/// 支持分页查询,与size参数同时设置时才生效,此参数代表偏移量
/// 支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大100
///
public static string GetUserabout(long department_id, long offset, int size)
{
string url = string.Format("https://oapi.dingtalk.com/user/list?access_token={0}&department_id={1}&offset={2}&size={3}", GetAccessToken(), department_id, offset, size);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 获取部门详情(已测试)
public class department
{
public string id { get; set; }
}
///
/// 获取部门详情
///
/// 部门id
///
public static string Getdepartment(string id)
{
string url = string.Format("https://oapi.dingtalk.com/department/get?access_token={0}&id={1}", GetAccessToken(), id);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 创建部门(已测试)
public class Createdepartment
{
public string name { get; set; }
public string parentid { get; set; }
}
///
/// 创建部门
///
/// 部门名称
/// 父部门id,根部门为1
/// id创建的部门id
public static string Getdepartment(string name, string parentid)
{
string url = string.Format("https://oapi.dingtalk.com/department/create?access_token={0}", GetAccessToken());
var msgModel = new Createdepartment
{
name = name,
parentid = parentid
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
return result;
}
#endregion
#region 删除部门(已测试)
public class DeletedepartmentM
{
public long id { get; set; }
}
///
/// 删除部门
///
/// 部门id。(注:不能删除根部门;不能删除含有子部门、成员的部门)
///
public static string Deletedepartment(long id)
{
string url = string.Format("https://oapi.dingtalk.com/department/delete?access_token={0}&id={1}", GetAccessToken(), id);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 查询部门的所有上级父部门路径(已测试)
public class SearchHdepartmentM
{
public long id { get; set; }
}
///
/// 查询部门的所有上级父部门路径
///
/// 部门id。(注:不能删除根部门;不能删除含有子部门、成员的部门)
/// parentIds该部门的所有父部门id列表
public static string SearchHdepartment(long id)
{
string url = string.Format("https://oapi.dingtalk.com/department/list_parent_depts_by_dept?access_token={0}&id={1}", JTToken, id);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 查询指定用户的所有上级父部门路径(已测试)
public class SearchUdepartmentM
{
public string userId { get; set; }
}
///
/// 查询指定用户的所有上级父部门路径
///
/// 希望查询的用户的id
/// parentIds 该部门的所有父部门id列表
public static string SearchUdepartment(string userId)
{
string url = string.Format("https://oapi.dingtalk.com/department/list_parent_depts?access_token={0}&userId={1}", GetAccessToken(), userId);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 获取企业员工人数(已测试)
public class GetUserCountM
{
public int onlyActive { get; set; }
}
///
/// 获取企业员工人数
///
/// 部门id。(注:不能删除根部门;不能删除含有子部门、成员的部门)
/// count 企业员工数量
public static string GetUserCount(int onlyActive)
{
string url = string.Format("https://oapi.dingtalk.com/user/get_org_user_count?access_token={0}&onlyActive={1}", GetAccessToken(), onlyActive);
string result = HttpGet(url, "");
return result;
}
#endregion
#region 获取最近4天考勤打卡数据(已测试)
public class AttendanceModel
{
public string userId { get; set; }
public string workDateFrom { get; set; }
public string workDateTo { get; set; }
//public string[] useridlist { get; set; }
}
public static string Attendance(string UserID, DateTime StarTime, DateTime EndTime)
{
string url = string.Format("https://oapi.dingtalk.com/attendance/list?access_token={0}", GetAccessToken());
var msgModel = new AttendanceModel
{
workDateFrom = Convert.ToString(StarTime).Replace("/", "-"),
workDateTo = EndTime.ToString().Replace("/", "-"),
userId = UserID,
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(url, dataStr);
return result;
}
#endregion
#region 传入钉钉Id 给人员 发消息
///
/// 钉钉发消息
///
/// 钉钉Id
/// 标题
/// 内容
///
public static string DingMessage(string UserId, string title, string Content)
{
string result = SendMessagemarkdown("132516265", UserId, title, Content);
Message token = JsonConvert.DeserializeObject(result);
return token.errcode+";"+token.errmsg;
}
#endregion
#region 以微应用的形式通知到个人(一天50条,内容不能重复,此接口有限流政策具体内容请参考官网)(已测试)
///
/// 以微应用的形式通知到个人
///
/// 企业应用id,这个值代表以哪个应用的名义发送消息
/// 员工id列表(消息接收者,多个接收者用|分隔)
/// 标题
/// 内容
/// messageId 标识企业消息的id,字符串,最长128个字符
public static string SendMessagemarkdown(string agentid, string touser, string title, string text)
{
string url = string.Format("https://oapi.dingtalk.com/message/send?access_token={0}", JTToken);
var msgModel = new TextMsgModelmarkdown
{
agentid = agentid,
//Toparty = "32760351"
touser = touser,
msgtype = "markdown",
markdown = new markdown()
{
title = title,
text = text
},
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = Core.Utils.HttpPost(url, dataStr);
return result;
}
#endregion
#region 测试 扩展发企业通知
//public static string TestFXX()
//{
// IDingTalkClient client = new DefaultDingTalkClient("https://eco.taobao.com/router/rest");
// CorpMessageCorpconversationAsyncsendRequest req = new CorpMessageCorpconversationAsyncsendRequest();
// req.Msgtype = "text";
// req.AgentId = 132516265;
// req.UseridList = "142558190626104277";
// req.DeptIdList = "58109347";
// req.ToAllUser = false;
// req.Msgcontent = "{\"message_url\": \"\",\"head\": {\"bgcolor\": \"FFBBBBBB\",\"text\": \"头部标题\"},\"body\": {\"title\": \"正文标题\",\"form\": [{\"key\": \"姓名:\",\"value\": \"张三\"},{\"key\": \"爱好:\",\"value\": \"打球、听音乐\"}],\"rich\": {\"num\": \"15.6\",\"unit\": \"元\"},\"content\": \"大段文本大段文本大段文本大段文本大段文本大段文本大段文本大段文本大段文本大段文本大段文本大段文本\",\"image\": \"\",\"file_count\": \"3\",\"author\": \"李四 \"}}";
// CorpMessageCorpconversationAsyncsendResponse rsp = client.Execute(req, JTToken);
// //Console.WriteLine(rsp.Body);
// return rsp.Body;
//}
#endregion
#region 获取企业通知消息已读未读状态(已测试)
public class list_message_statusM
{
public string messageId { get; set; }
}
///
/// 获取企业通知消息已读未读状态
///
/// 消息id
/// read 已读人员 unread 未读人员
public static string list_message_status(string messageId)
{
string url = string.Format("https://oapi.dingtalk.com/message/list_message_status?access_token={0}", GetAccessToken());
var msgModel = new list_message_statusM
{
messageId = messageId,
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = Core.Utils.HttpPost(url, dataStr);
return result;
}
#endregion
#region 创建微应用(已测试)
public class CreatemicroappM
{
public string appIcon { get; set; }
public string appName { get; set; }
public string appDesc { get; set; }
public string homepageUrl { get; set; }
public string pcHomepageUrl { get; set; }
public string ompLink { get; set; }
//public string[] useridlist { get; set; }
}
///
/// 创建微应用
///
/// 微应用的图标。需要调用上传接口将图标上传到钉钉服务器后获取到的mediaId
/// 微应用的名称。长度限制为1~10个字符
/// 微应用的描述。长度限制为1~20个字符
/// 微应用的移动端主页,必须以http开头或https开头
/// 微应用的OA后台管理主页,必须以http开头或https开头 可不填
/// 微应用的PC端主页,必须以http开头或https开头,如果不为空则必须与homepageUrl的域名一致 可不填
/// id 创建的微应用id
public static string Createmicroapp(string appIcon, string appName, string appDesc, string homepageUrl, string ompLink, string pcHomepageUrl)
{
string url = string.Format("https://oapi.dingtalk.com/microapp/create?access_token={0}", GetAccessToken());
var msgModel = new CreatemicroappM
{
appIcon = appIcon,
appName = appName,
appDesc = appDesc,
homepageUrl = homepageUrl,
ompLink = ompLink,
pcHomepageUrl = pcHomepageUrl
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = Core.Utils.HttpPost(url, dataStr);
return result;
}
#endregion
#region 获取通讯录权限(已测试)
public static string Scopes()
{
string url = string.Format("https://oapi.dingtalk.com/auth/scopes?access_token={0}", GetAccessToken());
string result = Core.Utils.HttpGet(url, "");
return result;
}
#endregion
#region 自定义机器人@人(已测试)
public class RobotSentM
{
public string content { get; set; }
public bool isAtAll { get; set; }
public string msgtype { get; set; }
public at at { get; set; }
public text text { get; set; }
}
public class at
{
public string[] atMobiles { get; set; }
}
///
/// 自定义机器人@人
///
/// 消息内容
/// 被@人的手机号
/// @所有人时:true,否则为:false
/// 在机器人管理页面获取webhook
///
public static string RobotSent(string content, string[] atMobiles, bool isAtAll, string webhook)
{
var msgModel = new RobotSentM
{
msgtype = "text",
isAtAll = isAtAll,
text = new text()
{
content = content
},
at = new at()
{
atMobiles = atMobiles,
}
};
var dataStr = JsonConvert.SerializeObject(msgModel);
string result = HttpPost(webhook, dataStr);
return result;
}
#endregion
#region 上传媒体文件(图片 1MB支持jpg格式 语音 2MB不超过60s AMR格式 普通文件 10MB)(已测试)
public class UploadMediaRequestModel
{
public string FileName { get; set; }
public string multipart { get; set; }
public string type { get; set; }
}
public class uploadmediaG
{
public string media_id { get; set; }
public string type { get; set; }
public string created_at { get; set; }
}
///
/// 上传媒体文件
///
/// 位置Server.MapPath("~/Content/images/1505888395.png")
/// 类型
/// media_id 媒体文件上传后获取的唯一标识 type 媒体文件类型,分别有图片(image)、语音(voice)、普通文件(file) created_at 媒体文件上传时间戳
public static string uploadmedia(string FileName, string type)
{
string url = string.Format("https://oapi.dingtalk.com/media/upload?access_token={0}&type={1}", GetAccessToken(), type);
string result = PostFile(url, FileName);
uploadmediaG token = JsonConvert.DeserializeObject(result);
return result;
}
#endregion
#region 获取媒体文件(已测试)
public class downloadFileM
{
public string media_id { get; set; }
}
///
/// 获取媒体文件
///
/// 媒体文件的唯一标示
/// 下载地址
///
public static string downloadFile(string media_id, string Address)
{
string url = string.Format("https://oapi.dingtalk.com/media/downloadFile?access_token={0}&media_id={1}", JTToken, media_id);
string result = HttpGet(url, "");
WebClient clint = new WebClient();
clint.DownloadFile(url, Address);
if (File.Exists(Address))
return "{\"errcode\": 0,\"errmsg\": \"ok\"}";
else
{
return result;
}
}
#endregion
#region 发送文件给指定用户(已测试)
public class SendFileM
{
public string agentid { get; set; }
public string touser { get; set; }
public string msgtype { get; set; }
public file file { get; set; }
}
public class file
{
public string media_id { get; set; }
}
///
/// 发送文件给指定用户
///
/// 企业应用id,这个值代表以哪个应用的名义发送消息
/// 员工id列表(消息接收者,多个接收者用|分隔)
/// 媒体文件Id
///
public static string SendFile(string agentid, string touser, string media_id)
{
//media_id = System.Web.HttpUtility.UrlEncode(media_id);
//file_name = System.Web.HttpUtility.UrlEncode(file_name);
string url = string.Format("https://oapi.dingtalk.com/message/send?access_token={0}", JTToken);
var msgmodel = new SendFileM()
{
agentid = agentid,
touser = touser,
msgtype = "file",
file = new file()
{
media_id = media_id
}
};
var datastr = JsonConvert.SerializeObject(msgmodel);
string result = HttpPost(url, datastr);
return result;
}
#endregion
#region 单步文件上传(已测试)
public class singleM
{
public string media_id { get; set; }
}
///
/// 上传媒体文件
///
/// 位置Server.MapPath("~/Content/images/1505888395.png")
/// 类型
/// media_id 媒体文件上传后获取的唯一标识 type 媒体文件类型,分别有图片(image)、语音(voice)、普通文件(file) created_at 媒体文件上传时间戳
public static string single(string FileName, string agent_id, int file_size)
{
string url = string.Format("https://oapi.dingtalk.com/file/upload/single?access_token={0}&agent_id={1}&file_size={2}", JTToken, agent_id, file_size);
string result = PostFile(url, FileName);
uploadmediaG token = JsonConvert.DeserializeObject(result);
return result;
}
#endregion
}
class GetUserInfoModel
{
public string userid { get; set; }
public string deviceId { get; set; }
public string is_sys { get; set; }
public string sys_level { get; set; }
internal string errcode { get; set; }
}
}