微软的 SkyDrive 网盘提供了 RESTful API,而且提供了 JavaScript 库,很方便在第三方网站中使用。
要使用 SkyDrive API,首先需要到 Live Connect Developer Center 添加你的应用。在这个网站中点击“My apps”,就可以添加你的应用。在应用中,Client ID 和 Redirect 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