zoukankan      html  css  js  c++  java
  • SkyDrive API 的使用

    微软的 SkyDrive 网盘提供了 RESTful API,而且提供了 JavaScript 库,很方便在第三方网站中使用。

    要使用 SkyDrive API,首先需要到 Live Connect Developer Center 添加你的应用。在这个网站中点击“My apps”,就可以添加你的应用。在应用中,Client IDRedirect domain 这两项是我们后面要用到的。

    要在我们的网站 http://example.com 中使用 SkyDrive,需要在网页中载入 wl.js,如下:

    <script type="text/javascript" src="http//js.live.net/v5.0/wl.js"></script>
    

    然后在 JavaScript 中我们可以用下面的函数初始化 SkyDrive:

    function initDrive() {
      WL.Event.subscribe("auth.login", onLoginComplete);
      WL.Event.subscribe("auth.logout", onLogoutComplete);
      WL.Event.subscribe("auth.sessionChange", onSessionChange);
      WL.Event.subscribe("auth.statusChange", onStatusChange);
      WL.Event.subscribe("wl.log", onErrorOccur);
    
      WL.init({
        client_id: "0000056789ABCDEF",
        redirect_uri: "http://example.com/skydrive.htm",
        scope: ["wl.signin", "wl.skydrive", "wl.skydrive_update"],
        response_type: "token",
        status: true,
        logging: true
      });
    }
    

    其中 WL.init 函数将连接 SkyDrive,并设定应用的权限,其中的 client_id 就是前面创建应用时得到的 Client ID,而 redirect_uri 中的域名必须和应用的 Redirect domain 一致。而 skydrive.htm 文件的内容如下:

    <!DOCTYPE html>
    <html>
        <head>
            <title></title>
        </head>
        <body>
            <script src="//js.live.net/v5.0/wl.js"></script>
        </body>
    </html>
    

    在前面初始化 SkyDrive 的过程中,我们绑定了几个事件的处理函数,它们的处理方式如下:

    var skydrive = {
      status: "",
      access_token: ""
    };
    
    function onLoginComplete() {
      var session = WL.getSession();
      if (session.error) {
        alert("Error signing in: " + session.error);
      }
      else {
        alert("You have been logged into SkyDrive.");
        skydrive.access_token = session.access_token;
        // do something
      }
    }
    
    function onLogoutComplete() {
      alert("You have been logged out of SkyDrive.");
      // do something
    }
    
    function onSessionChange() {
      var session = WL.getSession();
      if (session) {
        skydrive.access_token = session.access_token;
        console.log("skydrive: your session has changed.");
      }
    }
    
    function onStatusChange() {
      WL.getLoginStatus(function(response) {
        skydrive.status = response.status;
        // do something
        console.log("skydrive: your status has changed.");
      });
    }
    
    function onErrorOccur() {
      console.log("skydrive: error in skydrive!");
    }
    

    其中我们保存了 access_token 和 status 变量,因为后面要用到。

    现在可以让用户登录和退出 SkyDrive 了:

    function signUserIn() {
      if (skydrive.status != "connected") {
        WL.login();
      }
    }
    
    function signUserOut() {
      if (skydrive.status == "connected") {
        WL.logout();
      }
    }
    

    调用 WL.login() 函数时,将弹出新窗口打开 Microsoft Live Account 的登录页面,登录成功后将跳转到之前设置的 http://example.com/skydrive.htm 地址并验证域名正确性,然后自动关闭弹出窗口。

    登录成功后可以读取 SkyDrive 目录和文件了。例如:

    function showMainFolder() {
      WL.api(
      {
        path: "/me/skydrive/files",
        method: "GET"
      },
      function(response) {
        if (!response.error) {
          var data;
          for (var i = 0; i < response.data.length; i++) {
            data = response.data[i];
            if (data.type == "folder") {
              console.log(data.name, data.id);
            }
          }
        } else {
          alert('Error in reading skydrive files!');
        }
      });
    }
    
    function showSomeFolder(fid) {
      WL.api(
      {
        path: fid + "/files",
        method: "GET"
      },
      function(response) {
        if (!response.error) {
          var data, id;
          for (var i = 0; i < response.data.length; i++) {
            data = response.data[i];
            if (data.type == "file") {
              console.log(data.name, data.id, data.source, data.size);
            }
          }
        } else {
          alert('Error in reading skydrive files!');
        }
      });
    }
    
    function createMainFolder() {
      WL.api({
        path: "me/skydrive",
        method: "POST",
        body: {
          name: "Example"
        }
      },
      function(response){
        if (!response.error) {
          console.log("skydrive: folder id is ", response.id);
        } else {
          alert('Error in creating example folder!');
        }
      });
    }

    其中每个文件夹或者文件都有一个惟一的 id。利用文件夹的 id 我们可以读取其中的文件列表,也可以在其中创建子文件夹。但是同源策略的限制,在 JavaScript 中没法创建新文件。类似地,文件的 source 属性给出了该文件的下载地址,但我们也没法在 JavaScript 中读取该文件内容。因此,我们只能通过服务器来完成文件的上传和下载(参考这篇文章:用 PHP 编写跨域访问代理)。

    实际使用中,在 PHP 中用 curl 上传 SkyDrive 文件总是失败,而 curl 提供的错误信息又不清楚(参考这篇文章),所以最后改用 pfsockopen 来上传文件(也可用 fsockopen,如果服务器支持该函数)。另外,通过 SkyDrive API 方式只能创建某些类型的图片,视频和文档,文件扩展名不在它们允许范围时将无法上传。

    参考资料:
    [1] Live Connect Developer Center
    [2] Live SDK developer guide (Live Connect)
    [3] Getting started (Live Connect)
    [4] Live SDK core concepts (Live Connect)
    [5] SkyDrive API (Live Connect)
    [6] JavaScript API (Windows 8 and web) (Live Connect)
    [7] Interactive Live SDK
    [8] Developers: JavaScript connects your site to SkyDriv
    [9] MSN连接开放平台
    [A] Live Connect Forum

  • 相关阅读:
    假期(面试题二)
    假期(面向对象相关)
    假期(模块相关)
    假期(面试题一)
    假期(函数相关)
    最后一个假期
    Django缓存问题
    python pass关键字神奇吗
    python中类变量,成员变量
    python类中self是什么
  • 原文地址:https://www.cnblogs.com/zoho/p/2909530.html
Copyright © 2011-2022 走看看