微软的 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

浙公网安备 33010602011771号