• 分享一个原创.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=

  • 相关阅读:
    vim实用技巧
    《C程序设计语言》学习笔记
    《鸟哥的Linux私房菜:服务器搭建篇》第一部分学习笔记
    入职培训学习心得
    [NOI2013]树的计数
    bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)
    P2944 [USACO09MAR]地震损失2Earthquake Damage 2(网络流)
    bzoj3218 a + b Problem(网络流+主席树)
    P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
    P4843 清理雪道(上下界网络流)
  • 原文地址:https://www.cnblogs.com/handk/p/2402939.html
Copyright © 2020-2023  润新知