【钉盘日记】通过调用api的方式定时下载钉盘的文件

最近在整一个定时将钉钉云盘所有文件下载下来的服务,其中因为api只能拿到单独文件的关系,因此逻辑比较绕

在这里插入图片描述
经过设计后,进行代码的编写;
设计逻辑:
1、首先先从apollo拿到所需的appkey和APPsecret,用于获取accesstoken,以及获取能获取到全部文件的用户的unionid。
2、获取到的unionid和token用于获取该用户云盘下的全部文件夹信息,从返回到的json信息中获取spaces内容,并序列化成列表(每个文件夹都有自己的spaceid)。
3、在应用层对spaceid列表进行遍历,对每个spaceid进行接下来的操作。
4、调用获取文件列表接口,将返回结果序列化,因为存在分页机制。如果返回结果中存在nextToken则将此参数进行再次调用,进行序列化后再对列表进行拼接。当文件类型是文件时,与表里的fileid进行一次比对,如果存在就跳过,如果不存在则存入新的list中,当文件类型是文件夹时,递归查询该文件夹下的文件,将列表返回与原列表拼接。
5、将文件列表中的fileid取出并获取下载信息,进行文件的下载,同时获取文件信息,并将文件信息中的人员id拿到人员信息,将文件转换为base64字节和人员信息一齐发送到文件下载服务,最后将文件信息存入表中。
在ddd模式的application层进行循环的编写

在这里插入图片描述
这里最主要的是要进行一个文件的递归,代码较长,只放出一部分抛砖引玉

public List<SortedList<string, string>> GetFileList1(string spaceId, string accessToken, string nextToken, List<SortedList<string, string>> list, string unionId, string parentId)
		{
			bool flag = nextToken == null || nextToken == "";
			List<SortedList<string, string>> result;
			if (flag)
			{
				Dictionary<string, string> dictionary = new Dictionary<string, string>();
				dictionary.Add("unionId", unionId);
				dictionary.Add("maxResults", "50");
				dictionary.Add("orderType", "createTimeDesc");
				dictionary.Add("parentId", parentId);
				string url = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";
				string text = HttpHelper.Get(url, dictionary, accessToken);
				SortedList<string, object> sortedList = JsonConvert.DeserializeObject<SortedList<string, object>>(text);
				JObject jobject = JObject.Parse(text);
				string nextToken1 = Convert.ToString(sortedList["nextToken"]);
				string value = jobject["files"].ToString();
				//筛选出仅有文件列表的list
				List<SortedList<string, string>> olist = new List<SortedList<string, string>>();
				olist = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value);
				//用于递归的列表list
				List<SortedList<string, string>> dlist = new List<SortedList<string, string>>();
				//最终拼接出的文件列表list
				List<SortedList<string, string>> flist = new List<SortedList<string, string>>();
				foreach (SortedList<string, string> sortedList2 in olist)
				{
					//判断文件夹是否存在
					bool flag2 = sortedList2["fileType"] == "folder";
					if (flag2)
					{
						//存在文件夹,进入递归
						dlist = this.GetFileList2(spaceId, accessToken, nextToken1, list, unionId, sortedList2["fileId"]);
						flist.AddRange(dlist);
					}
					else
					{
						//不存在文件夹,先与表比对
						DingPanPo dingPanPoByID = this.dingPanRepository.GetDingPanPoByID(sortedList2["fileId"]);
						bool flag3 = dingPanPoByID == null;
						if (!flag3)
						{
							break;
						}
						//不存在此文件,加入文件列表flist中
						flist.Add(new SortedList<string, string>
						{
							{
								"fileId",
								sortedList2["fileId"]
							}
						});
					}
				}
				//查看是否存在nextToken
				bool flag4 = nextToken1 == null || nextToken1 == "";
				if (flag4)
				{
					result = flist;
				}
				else
				{
					//进入递归
					dlist = this.GetFileList2(spaceId, accessToken, nextToken1, flist, unionId, null);
					result = dlist;
				}
			}
			else
			{
				Dictionary<string, string> dictionary2 = new Dictionary<string, string>();
				dictionary2.Add("unionId", unionId);
				dictionary2.Add("maxResults", "50");
				dictionary2.Add("orderType", "createTimeDesc");
				dictionary2.Add("parentId", parentId);
				dictionary2.Add("nextToken", nextToken);
				string url2 = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";
				string text3 = HttpHelper.Get(url2, dictionary2, accessToken);
				SortedList<string, object> sortedList3 = JsonConvert.DeserializeObject<SortedList<string, object>>(text3);
				JObject jobject2 = JObject.Parse(text3);
				string text4 = Convert.ToString(sortedList3["nextToken"]);
				string value2 = jobject2["files"].ToString();
				List<SortedList<string, string>> list5 = new List<SortedList<string, string>>();
				list5 = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value2);
				List<SortedList<string, string>> list6 = new List<SortedList<string, string>>();
				List<SortedList<string, string>> list7 = new List<SortedList<string, string>>();
				foreach (SortedList<string, string> sortedList4 in list5)
				{
					bool flag5 = sortedList4["fileType"] == "folder";
					if (flag5)
					{
						list6 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, sortedList4["fileId"]);
					}
					else
					{
						DingPanPo dingPanPoByID2 = this.dingPanRepository.GetDingPanPoByID(sortedList4["fileId"]);
						bool flag6 = dingPanPoByID2 == null;
						if (!flag6)
						{
							break;
						}
						list7.Add(new SortedList<string, string>
						{
							{
								"fileId",
								sortedList4["fileId"]
							}
						});
					}
				}
				bool flag7 = list == null;
				if (flag7)
				{
					list = list7;
				}
				else
				{
					list.AddRange(list7);
				}
				bool flag8 = text4 == null || text4 == "";
				if (flag8)
				{
					result = list;
				}
				else
				{
					List<SortedList<string, string>> list8 = new List<SortedList<string, string>>();
					list8 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, null);
					result = list8;
				}
			}
			return result;
		}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值