分享一个原创.net 版的金山快盘 api
折腾了两天终于将快盘的 Oauth授权机制搞清楚了,并成功的获取了授权用户的信息以及文件夹的信息.
记录下开发经过,方便后来人.
先上图:
1..net 下的时间戳的获取.
2.Hmac_Sha1加密算法
3.Urlencode 算法
4.参数的排序
5.上一个demo信息
以上三个算法是.net 下成功调用快盘API的核心,稍有差异便调用失败.一下是开发经过.
1 时间戳的获取,要将将系统时间转换成UNIX时间戳 ,.net 的 DateTime.Now.Ticks 不行.必须要转化,时间戳是10位的.下面上代码.
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
private string GetTimeStamp() {
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
TimeSpan toNow = dtNow.Subtract(dtStart);
string timeStamp = toNow.Ticks.ToString();
timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
return timeStamp;
}
2.Hmac_Sha1 算法.
.net 下可以用System.Security.Cryptography.HMACSHA1 这个类进行转化.但是这个类计算的结果是 一个字节数组,要用base64 才能转成为字符串.因此后面签名里的 base64 就可以不用了,否则两次base64会出现签名失败的情况.
private string Hmac_Sha1AndBase64(string Source,string SecretKey){
System.Security.Cryptography.HMACSHA1 hmacsha1 = new System.Security.Cryptography.HMACSHA1();
hmacsha1.Key = System.Text.Encoding.ASCII.GetBytes(SecretKey);
byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(Source); //signatureBase要进行签名的基础字符串
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
}
3.Urlencode 算法.
这个算法折腾的时间最长,用HttpUtility.UrlEncode() 不行,因为快盘的urlencode算法比较特殊.规则是:
urlencode编码的字符需要用utf8转编码,16进制部分需要大写,如等号”=”是%3D而不是%3d;
urlencode规则:只有字母数字和[.-_~](红色部分,不包括方括号)不用encode,其他字符都需要,例如urlencode(".-_~+*")=".-_~%20%2B%2A"
因此老老实实的将这个算法用c#重新写了一遍.
将字符串转化为字节数组后,每个字符的asicii 码规则应该大家都熟悉;
这里再描述下:
0-9 对应的asicii 为 48-57
a-z 对应的asicii 为 97-122
A-z对应 65-90
46,45,95,126 分别对应.-_~
因此该算法出来了:
private string UrlEncode(string str){
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
if ((byStr[i] >= 48 && byStr[i] <= 57)
|| (byStr[i] >= 97 && byStr[i] <= 122)
|| (byStr[i] >= 65 && byStr[i] <= 90)
|| (byStr[i] == 46)
|| byStr[i] == 45
|| byStr[i] == 95
|| byStr[i] == 126
)
{
sb.Append((char)byStr[i]);
}
else
{
string t = Convert.ToString(byStr[i], 16);
sb.AppendFormat(@"%{0}", t.ToUpper());
}
}
return sb.ToString();
}
4.参数排序.
.net 里面 Dictionary 是按照添加元素的先后进行排序的.与快盘要求的字典数序不一致.
因此找到 SortedDictionary,该集合是按照字典顺序进行排序的,而不是按照添加的顺序进行的.
5.上面的核心算法有了,那么前三步的授权就轻易的获取到了,Account_Info,Metadata 也就能很容易的获取到了.
整个授权的流程个人理解就是:
第一步先取一个临时的 token
第二步根据临时的token 让用户登录获取授权.
第三步 根据临时的token 和oauth_token_secret 获取真正的 token 和oauth_token_secret
后面的Account_info,Meatdata 用到的token和 oauth_token_secret 其实就是第三步获取到的真正的token.
好了.基本分享完毕!
欢迎拍砖!
找不到上传附件的地方,因此将发表在快盘论坛的帖子地址附上,上面有demo下载地址.
http://bbs.kuaipan.cn/viewthread.php?tid=21479&page=1&extra=