Live ConnectとSkyDrive
前回から日が開いてしまいましたが、
Live Connectは、
アップデートに伴い、
さて、
新しいSkyDrive
はじめにSkyDriveのサービス自体について紹介します。SkyDriveは、

昨年の11月にアップデートがあり、
昨年からSkyDriveはHTML5やCSS3の機能を積極的に利用し、
SkyDrive APIのできること・できないこと
それでは、
Live Connectを利用すると、
フォルダー・ファイルのアクセス
Live Connectで、
- フォルダー・
ファイル情報の取得 - フォルダー・
ファイル情報の変更 - フォルダーの作成
- フォルダー・
ファイルの削除 - ファイルのダウンロード
- ファイルのアップロード
- フォルダー・
ファイルの共有リンクの作成 - ファイルの埋め込み用HTMLコードの取得
- フォルダー・
ファイルの移動 - ファイルのコピー
- フォルダー・
ファイルのコメント取得
SkyDriveでは、


写真・
アルバムと写真などのファイルについても、
- アルバム情報の取得
- アルバム情報の変更
- アルバムの作成
- アルバムの削除
- 写真、
ビデオ、 音楽情報の取得 - 写真、
ビデオ、 音楽情報の変更 - 写真、
ビデオ、 音楽のアップロード - 写真、
ビデオ、 音楽の削除 - タグ情報の取得
以上が、
サポートしているファイル
扱うファイルにも制限があります。サポートしているファイルは、
- ドキュメント
(PDF、 テキストファイル、 マイクロソフトOffice文書) - 写真
(一般的なファイルフォーマットのみ) - ビデオ
(H. 264およびWindows Media Video) - 音楽
(アップロードはWaveファイルのみ)
大きく分類して、
APIを利用したアプリの開発
Live Connectは、
Live Connectでは、
Webブラウザー上で動作するアプリとWindows 8およびWindows Phone向けには、
今回の簡単なサンプルコードでは、
フォルダー情報の取得
最初にフォルダーの情報を取得してみましょう。たとえば、
- https://
apis. live. net/ v5. 0/ me/ skydrive?access_ token=ACCESS_ TOKEN
URLのACCESS_
- https://
oauth. live. com/ authorize?client_ id=CLIENT_ ID &scope=wl.skydrive &response_type=token&locale=ja&redirect_ uri=https:// oauth. live. com/ desktop
CLIENT_

アクセストークンの取得については、
SkyDriveのアクセスについて、
Scopeの値 | 説明 |
---|---|
wl. |
SkyDriveのフォルダー・ |
wl. |
SkyDriveで共有されているフォルダー・ |
wl. |
SkyDriveのフォルダー・ |
ファイルの読み取りだけが必要な場合は、
最初のURLにアクセスすると、
{
"id": "folder.xxxxx",
"from": {
"name": null,
"id": null
},
"name": "SkyDrive",
"description": null,
"parent_id": null,
"upload_location": "https://apis.live.net/v5.0/folder.xxxxx/files/",
"count": 4,
"link": "https://skydrive.live.com?cid\xxxxx",
"type": "folder",
"shared_with": {
"access": "Just me"
},
"created_time": null,
"updated_time": "2012-01-09T14:00:00+0000"
}
Webブラウザーでも、

このフォルダーの情報を表すFolderオブジェクトの内容は、
プロパティ | 型 | 説明 |
---|---|---|
data | array | Folderオブジェクトを含む配列 |
id | string | FolderオブジェクトのID |
from | object | フォルダー作成者の情報 |
name |
string | 作成者の名前 |
id |
string | 作成者のユーザーID |
name | string | フォルダーの名前 |
description | stringまたはnull | フォルダーの説明 |
count | number | フォルダー内のアイテム数 |
link | string | SkyDriveでのフォルダーのURL |
upload_ |
string | アプリから、 Scope |
parent_ |
string | このフォルダーの上位階層のリソースID |
type | string | オブジェクトの種類 フォルダーの場合は、 |
created_ |
string | フォルダーの作成日時 |
updated_ |
string | フォルダー内のコンテンツの更新日時 |
shared_ |
object | フォルダーの共有情報 |
access |
string | フォルダーの共有情報 次の値のいずれか
|
ひとつのフォルダー情報を取得する場合は、
- https://
apis. live. net/ v5. 0/FOLDER_ ID ?access_token=ACCESS_ TOKEN
フォルダー内のアイテムを取得する場合は、
- https://
apis. live. net/ v5. 0/FOLDER_ ID /files?access_token=ACCESS_ TOKEN
フォルダー情報を返すリソースのパスは、
パス | 説明 |
---|---|
/FOLDER_ |
特定のフォルダー |
/FOLDER_ |
特定のフォルダー内のアイテム |
/me/ |
サインインユーザーのSkyDriveのルートフォルダー |
/me/ |
サインインユーザーのSkyDriveのフォルダー内のアイテム |
/me/ |
サインインユーザーのSkyDriveの共有フォルダー内のアイテム |
/USER_ |
特定のユーザーのSkyDriveのフォルダー内のアイテム |
/ALBUM_ |
特定のアルバム内のアイテム |
上記のUSER_
フォルダーに格納できるアイテムは、
ファイル情報の取得
次はファイル情報を取得してみましょう。フォルダーのパスに
{
"id": "file.xxxxx",
"from": {
"name": "梓 中野",
"id": "xxxxx"
},
"name": "prpr.txt",
"description": null,
"parent_id": "folder.xxxxx",
"size": 1234,
"upload_location": "https://apis.live.net/v5.0/file.xxxxx/content/",
"comments_count": 0,
"comments_enabled": false,
"is_embeddable": false,
"source": "http://storage.live.com/xxxxx",
"type": "file",
"shared_with": {
"access": "Just me"
},
"created_time": "2011-12-13T14:42:23+0000",
"updated_time": "2011-12-13T14:42:23+0000"
}
ファイルの情報を表す、
プロパティ | 型 | 説明 |
---|---|---|
data | array | Fileオブジェクトを含む配列 |
id | string | FileオブジェクトのID |
from | object | ファイル作成者の情報 |
name |
string | 作成者の名前 |
id |
string | 作成者のユーザーID |
link | string | SkyDrive上でのファイルのURL |
name | string | ファイル名 |
description | string | 説明 |
size | number | ファイルのサイズ |
comments_ |
number | ファイルに付けられたコメント数 |
comments_ |
true/ |
ファイルにコメント可能かどうか |
is_ |
true/ |
埋め込み用のHTMLコードを取得可能かどうか |
source | string | ファイルのダウンロード用のURL |
upload_ |
string | アプリからファイルをアップロードするためのURL |
type | string | オブジェクトの種類 ファイルの場合は、 |
created_ |
string | ファイルの作成日時 |
updated_ |
string | ファイルの最終更新日時 |
shared_ |
object | ファイルの共有情報 |
access |
string | ファイルの共有情報 次の値のいずれか
|
Folderオブジェクトとほぼ同じ内容ですが、
ひとつのファイル情報を取得する場合は、
- https://
apis. live. net/ v5. 0/FILE_ ID ?access_token=ACCESS_ TOKEN
ファイル情報が含まれるリソースのパスは次の通りです。
パス | 説明 |
---|---|
/FILE_ |
特定のファイル |
/FOLDER_ |
特定のフォルダー内のアイテム |
/me/ |
サインインユーザーのSkyDriveのアイテム |
/me/ |
サインインユーザーのSkyDriveで共有されているアイテム |
/USER_ |
特定のユーザーのSkyDriveのアイテム |
以上が、
PHPでフォルダー・ファイルの表示
ここまでの内容をふまえて簡単なサンプルコードを示します。Live Connectは、
ここでは、
サンプルは、

PHPによるOAuthの認可処理とREST API呼出しは、
<?php
define('CLIENT_ID', 'xxxxx'); // Client ID と Client Secret を設定してください
define('CLIENT_SECRET', 'xxxxx'); //
define('REDIRECT_URI', 'http%3A%2F%2Fkatamari.jp%2Fgihyo%2Flive%2F48.php'); // Redirect 先を設定してください
// Access Token 処理
if (isset($_GET['code']) && preg_match('/^[A-Fa-f0-9\-]+$/', $_GET['code'])) {
// 認可画面からのリダイレクト
// Access Token 取得
$tokens = getTokens($_GET['code']);
if (!$tokens) {
$body = "Error";
} else if (array_key_exists('error', $tokens)) {
$body = htmlspecialchars($tokens['error']['error_description'], ENT_QUOTES, 'UTF-8');
} else {
$token = $tokens['access_token'];
setcookie('AccessToken', $token, 0);
}
} else if (isset($_COOKIE['AccessToken'])) {
$token = $_COOKIE['AccessToken'];
}
// ***.php?folder_id=xxx のようにクエリーに Folder オブジェクトの ID が
// 指定されている場合、そのフォルダー内のアイテムを表示する
if (isset($_GET['id']) && preg_match('/^[A-Za-z0-9!\.]+$/', $_GET['id'])) {
$path = $_GET['id'] . '/files';
} else {
$path = 'me/skydrive/files';
}
// REST API 呼び出しと HTML 生成
if ($token && !$body) {
$body = createList($token, $path);
}
// サインインしていない場合は認可画面へのリンクを表示
if (!$body) {
$signInUri = 'https://oauth.live.com/authorize' .
'?client_id=' . CLIENT_ID .
'&scope=wl.signin%20wl.skydrive' . // Scope に wl.skydrive を指定
'&response_type=code' .
'&display=popup' .
'&locale=ja' .
'&redirect_uri=' . REDIRECT_URI;
}
// REST API 呼出しと HTML 生成
function createList($token, $path) {
$res = callRestApi($token, $path);
if ($res === false) {
return "Error";
} else if (array_key_exists('error', $res)) {
return htmlspecialchars($res['error']['message'], ENT_QUOTES, 'UTF-8');
} else {
$body = '<ul>';
foreach ($res['data'] as $val) {
$name = htmlspecialchars($val['name'], ENT_QUOTES, 'UTF-8');
if ($val['type'] === 'folder' || $val['type'] === 'album') {
$body .= '<li><a href="?id=' . $val['id'] . '">' . $name . '</a></li>';
} else {
$body .= '<li>' . $name . '</li>';
}
}
$body .= '</ul>';
return $body;
}
}
// 認可コードからアクエストークン取得
function getTokens($code) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
'https://oauth.live.com/token' .
'?client_id=' . CLIENT_ID .
'&redirect_uri=' . REDIRECT_URI .
'&client_secret=' . CLIENT_SECRET .
'&code=' . $code .
'&grant_type=authorization_code');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// (サーバー証明書を検証しない)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
// エラーの場合 false を返す
$res = curl_exec($ch);
if ($no = curl_errno($ch)) {
return false;
}
curl_close($ch);
return json_decode($res, true);
}
// REST API の呼び出し (GET メソッドのみ 対応)
function callRestApi($token, $path) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
'https://apis.live.net/v5.0/' .
$path .
'?access_token=' . $token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPGET, true);
// (サーバー証明書を検証しない)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
// エラーの場合 false を返す
$res = curl_exec($ch);
if ($no = curl_errno($ch)) {
return false;
}
curl_close($ch);
return json_decode($res, true);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>SkyDrive Sample</title>
</head>
<body>
<?php
if ($signInUri) {
?>
<div><a href="<?php echo $signInUri; ?>">サインイン</a></div>
<?php
} else {
echo $body;
}
?>
</body>
</html>
少しごちゃごちゃとしていますが、
おわりに
今回はここまでです。いかかでしたでしょうか。今回は、