引言
随着业务复杂度以及对数据分析的高要求,以企业文档数据作为元数据的情况越来越多。有一个场景,客户专人每天会往某个在线企业表格更新同步他们数据,要求我们每天都去同步该表格数据到本地数据库。那么我们肯定不会傻傻的去每天把企业微信在线表格数据手动导进数据库。我们要找一个方法,去实时的获取表格数据。
企业微信开发文档提供了这样的接口,比如创建文档,获取文档信息...
我们这篇文章介绍了,利用接口创建智能表格,然后利用接口去获取在线表格的数据,同步到本地库。
干货部分
注意:我们现在大多数的企业在线表格都是通过客户端手动创建的,就是直接在企业微信的文档,直接新建文档,但是目前的企业微信提供的接口,是获取不到通过客户端创建的在线表格的docID的,获取表格数据的必要参数之一就是docID,所以通过客户端创建的在线表格是不能用接口获取数据的。
1.接口创建智能表格接口:新建文档 - 文档 - 企业微信开发者中心
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/wedoc/create_doc?access_token=ACCESS_TOKEN
请求包体
{
"spaceid": "SPACEID", //空间spaceid。若指定spaceid,则fatherid也要同时指定,非必填
"fatherid": "FATHERID", //父目录fileid, 在根目录时为空间spaceid,非必填
"doc_type": 3, //文档类型,3:文档,4:表格,10:智能表格,必填
"doc_name": "DOC_NAME", //文档名称,必填
"admin_users": ["USERID1", "USERID2", "USERID3"] //授权给某人,这个的userID就是企业微信的用户的userId,管理员在通讯录那个地方能看到,必填
}
实际代码
//在线创建智能表格
public static void CreateFile()
{
var token = GetQW_AccessToken();
string url = $"https://qyapi.weixin.qq.com/cgi-bin/wedoc/create_doc?access_token={token}";
string postData = JsonConvert.SerializeObject(new
{
doc_type = 10,
doc_name = "测试_智能表格",
admin_users = new[] { "userID1", "userID2", "userID3" }
});
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
}
using (WebResponse response = request.GetResponse())
{
var responseText = new StreamReader(response.GetResponseStream()).ReadToEnd();
var result = JObject.Parse(responseText);
}
}
注意:这个地方的admin_users 一定要分配给某人权限,否则你这个在线智能表格是不能编辑的,授权给这个人,这个人就能编辑读取分享这个文档
2. 获取表格数据接口:查询记录 - 文档 - 企业微信开发者中心
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/get_records?access_token=ACCESS_TOKEN
请求包体
{
"docid": "DOCID", //文档ID,只有在接口创建的时候,接口会返回,做好记录 必填
"sheet_id": "123Abc", //文档通过浏览器打开,tab后面的就是sheet_id 必填
"view_id": "vCRl8n", //智能表格里面的视图ID,浏览器打开文档,viewid后面的就是 必填
//下面的都是非必填 有特殊要求的可对应配置
"record_ids": [], //由记录 ID 组成的 JSON 数组
"key_type": "CELL_VALUE_KEY_TYPE_FIELD_TITLE", //返回记录中单元格的key类型
"field_titles": [], //返回指定列,由字段标题组成的 JSON 数组 ,key_type 为 CELL_VALUE_KEY_TYPE_FIELD_TITLE 时有效
"field_ids": [], //返回指定列,由字段 ID 组成的 JSON 数组 ,key_type 为 CELL_VALUE_KEY_TYPE_FIELD_ID 时有效
"sort": [], // 对返回记录进行排序
"offset": 0, // 偏移量,初始值为 0
"limit": 100, //分页大小 , 每页返回多少条数据;当不填写该参数或将该参数设置为 0 时,如果总数大于 1000,一次性返回 1000 行记录,当总数小于 1000 时,返回全部记录;limit 最大值为 1000
"ver": 160, // 版本号
"filter_spec": { //过滤设置
"conjunction": "CONJUNCTION_AND",
"conditions": [{
"field_id": "f53B4X",
"field_type": "FIELD_TYPE_TEXT",
"operator": "OPERATOR_CONTAINS",
"string_value": {
"value": [
"123"
]
}
}]
}
}
实际代码
//获取对应视图数据
public static string GetQWData(string docId, string sheetId, string viewId)
{
var token = GetQW_AccessToken();
string url = $"https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/get_records?access_token={token}";
string postData = JsonConvert.SerializeObject(new
{
docid = docId,
sheet_id = sheetId,
view_ids = new string[] { viewId },
});
//通过设置ServicePointManager的全局回调,覆盖.NET默认的证书验证逻辑
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
}
using (WebResponse response = request.GetResponse())
{
var responseText = new StreamReader(response.GetResponseStream()).ReadToEnd();
return responseText;
}
}
3.实际操作
首先我们要获取应用对应的accesstoken,这个接口需要我们提供企业应用的corpId和secret。
获取token接口:
//新人所有证书
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{ // 总是接受,无条件信任所有证书
return true;
}
/// <summary>
/// 获取企业微信应用的accesstoken
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static string GetQW_AccessToken()
{
//通过设置ServicePointManager的全局回调,覆盖.NET默认的证书验证逻辑
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
string url = $"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={SECRET}";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
dynamic result = JsonConvert.DeserializeObject(reader.ReadToEnd());
if (result.errcode == 0)
{
return result.access_token;
}
LogHelper.Error($"获取token失败: {result.errmsg}", null);
throw new Exception($"获取token失败: {result.errmsg}");
}
}
总结
通过这篇文章,我们能学会如果通过接口获取在线表格的数据,目前企业微信不支持通过接口获取客户端创建的在线表格的数据,因为客户端创建的在线表格不能获取到docId,只有通过接口创建的在线表格,才能拿到docId。