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

原文地址:https://www.cnblogs.com/zoho/p/2909530.html