使ってみよう! Windows Live SDK/API

第48回 SkyDrive API 概要(1)

この記事を読むのに必要な時間:およそ 8.5 分

ファイル情報の取得

次はファイル情報を取得してみましょう。フォルダーのパスに「/files」を付けると,フォルダー内のアイテムが取得できます。ひとつのファイル情報は,次のようなJSON形式で取得できます。

{
    "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"
}

ファイルの情報を表す,Fileオブジェクトの内容は次の通りです。

プロパティ 説明
data array Fileオブジェクトを含む配列(複数のアイテムを含む結果の場合)
id string FileオブジェクトのID
from object ファイル作成者の情報
name(fromオブジェクト) string 作成者の名前
id(fromオブジェクト) string 作成者のユーザーID
link string SkyDrive上でのファイルのURL
name string ファイル名(編集可能)
description string 説明(編集可能)
size number ファイルのサイズ(バイト単位)
comments_count number ファイルに付けられたコメント数
comments_enabled true/false ファイルにコメント可能かどうか
is_embeddable true/false 埋め込み用のHTMLコードを取得可能かどうか
source string ファイルのダウンロード用のURL(一時的なURLで使う場合は取得後すぐに参照します)
upload_location string アプリからファイルをアップロードするためのURL
type string オブジェクトの種類
ファイルの場合は,file
created_time string ファイルの作成日時(ISO 8601形式)
updated_time string ファイルの最終更新日時(ISO 8601形式)
shared_with object ファイルの共有情報
access(shared_withオブジェクト) string ファイルの共有情報
次の値のいずれか
  • People I selected
  • Just me
  • Everyone (public)
  • Friends
  • My friends and their friends
  • People with a link

Folderオブジェクトとほぼ同じ内容ですが,ファイルサイズなどファイル特有の情報が含まれています。公開しているファイルにはコメントを付けることができ,その情報を取得できます。また,PowerPointなどの文書はWebページに貼り付けるHTMLコードが生成できます。その埋め込み可否の情報もあります。

ひとつのファイル情報を取得する場合は,パスにFileオブジェクトIDを指定してHTTP GETメソッドでアクセスします。

  • https://apis.live.net/v5.0/FILE_ID?access_token=ACCESS_TOKEN

ファイル情報が含まれるリソースのパスは次の通りです。

パス 説明
/FILE_ID 特定のファイル
/FOLDER_ID/files 特定のフォルダー内のアイテム
/me/skydrive/files サインインユーザーのSkyDriveのアイテム
/me/skydrive/shared または /me/skydrive/shared/files サインインユーザーのSkyDriveで共有されているアイテム
/USER_ID/skydrive/files 特定のユーザーのSkyDriveのアイテム

以上が,ファイル情報の取得についてです。

PHPでフォルダー・ファイルの表示

ここまでの内容をふまえて簡単なサンプルコードを示します。Live Connectは,特定のプラットフォームやプログラミング言語に依存していません。基本的にはHTTP(S)通信とテキスト処理だけです。OAuthの認可処理のみWebブラウザーコントロールなどを使う必要があります。

ここでは,PHPを使って記述します。マイクロソフトからGitHub上に各種プラットフォームや言語でのサンプルコードが提供されていますので,そちらも確認してみるとよいでしょう。

サンプルは,SkyDriveのアイテム一覧を表示する単純なものです図6⁠。フォルダー(またはアルバム)の場合は,リンクとして表示して下の階層へ移動できるようにしています。

図6 サンプルの実行結果

図6 サンプルの実行結果<a nam

PHPによるOAuthの認可処理とREST API呼出しは,第45回でも登場しています。そのときは,サインインしたユーザー名の表示を行いました。今回のコードでの違いはSkyDriveの情報の表示になっているだけで大きな違いはありません。以下にすべてのコードを示します。

<?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>

少しごちゃごちゃとしていますが,単純なREST処理のみでSkyDriveにアクセスできることがわかるかと思います。サンプルでは,下の階層へ移動するため,一時的にCookieにアクセストークンを保存しています。アクセストークンには有効期限がありますが,コードでは考慮していません。

おわりに

今回はここまでです。いかかでしたでしょうか。今回は,SkyDriveのフォルダーとファイル情報の取得まで紹介しました。SkyDriveの操作は制限されているとはいえ,作成・削除など多くの操作ができ,まだまだ紹介できていない内容があります。次回以降もLive Connectを利用してSkyDriveのアクセスについて紹介する予定です。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp