>100 Views
February 28, 14
スライド概要
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
Yahoo!ボックスAPI Hackday資料 Yahoo! JAPAN ヤフー株式会社 スマートデバイス戦略室 スマートデバイス開発本部 開発2部 瀬川 秀樹
本日の内容 1.Yahoo!ボックス紹介 - サービス紹介 - デベロッパー様へご案内 2.付録:1.アプリケーションの開発はじめの一歩 - アプリケーションIdの取得から アクセストークン取得のフロー 3.付録:2.ボックスAPIを使ってみよう - サンプルコードによるボックスAPIの使い方解説 2
Yahoo!ボックスサービス概要 Yahoo!ボックスとは 写真や文書など、あらゆるファイルをサーバ上に置 いて管理できるサービスです。置いてあるファイルは ネット全体に公開して共有することもできます。 3
1000万人突破! ユーザ数 4
堅牢性の高い設計で 何重にもデータをバックアップ 5
国内サーバ+バックボーンの回線が同業他社に比べて 圧倒的 6
そんなYahoo!ボックスがAPIを 公開 7
APIを使えばオンライン上のファイルの アップロード、ダウンロード、 コピー、移動、削除、公開 などができます 8
本日デベロッパーの皆さまに お伝えしたい事 9
ボックスAPIを使って サービスを 作ってみませんか!? 10
Yahoo! JAPAN ID所有者全てに リーチ出来るアプリを開発できる! 11
デカイIDを持つプラットフォームが あるんだからそれに 乗っかっちゃってください 乗らない手はありません 12
今回のテーマは 未来のテレビの楽しみ方 皆さんは何を作りますか? 13
テレビの楽しみ方 必ずしも テレビ単体で楽しまれている訳ではない 実況 検索 テレビを中心としながら それに付随する情報で 盛り上がる 投稿&参照 ながらながら・・・ 14
翌日学校や会社で話題になる時代から リアルタイムでLINEやTwitterでシェア される時代へ 例えばオリンピックの個人実況など・・・ スピードが上がっている 15
Yahoo!ボックスAPIを 使っていただければ 16
Twitterのつぶやきなどの テキストデータ 17
写真や動画
ドキュメント 19
ファイルの公開・共有 20
あらゆるデータを自由に保存・ 引き出すことができます 21
端末のストレージ領域に縛られることなく オンライン上にあるファイルを使った 自由な発想 22
! なサービス 23
デベロッパーの皆さまにも ! なサービスを作ってほしい 24
それでは楽しい開発を! ご静聴ありがとうございました 25
ここからはサンプルコードを 含めたデベロッパー向け解説ページです 26
アプリケーションの開発 はじめの⼀一歩 27
アプリケーションIDの取得 アプリを開発するためにはアプリケーションIDが必要です。 Yahoo!デベロッパーネットワークで取得してください。 はじめて開発する方はこちら すでにアプリケーションIDを 持っている方はこちら 28
認証を通して使用するAPIの決定 アプリケーションIDにスコープ(アプリが使用する機能) を設定します。 利用するスコープに 「ボックス参照・更新機能」を入れてください。 29
アプリケーションIDの確認 アプリで使うので控えておきます 30
アクセストークンの取得⽅方法 31
YConnect YConnect OAuth2.0の仕様に準拠した認可機能 http://developer.yahoo.co.jp/yconnect/ アプリがWebAPIへアクセスするための 「アクセストークン」を取得するための認可フロー 32
YConnectユーザ認可の取得(ユーザからの見え方) 認証コード このアプリがユーザーに対して Yahoo!の各リソースへアクセスする 許可を求める画面です。 33
トークン、リフレッシュトークンの取り方(authorization)
//    1.認証コードを取得画⾯面を表⽰示
$appid        =  'dj0zaiZpPTZqSVJ5TW80NHh-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒';
$url    =  ʻ‘https://auth.login.yahoo.co.jp/yconnect/v1/authorizationʼ’;
$params  =  '?response_̲type=code+id_̲token&client_̲id='.$appid.'&redirect_̲uri=oob&scope=openid&nonce=aaddeeff';
$url  .=  $params;
header(ʻ‘Location:  ʼ’.$url);  //  アプリケーションでYahoo!の認証画⾯面にリダイレクト
//  2.トークン取得エンドポイントにリクエストしてトークン、リフレッシュトークンを取得する
$appid    =  ʻ‘YJDNで取得するアプリケーションIDʼ’;
$secret  =  ʻ‘YJDNで取得するシークレットʼ’;
$code        =  ʻ‘1.で取得してユーザに⼊入⼒力力させた認証コードʼ’;
$url  =  ʻ‘https://auth.login.yahoo.co.jp/yconnect/v1/tokenʼ’;  //  トークン取得エンドポイント
$params    =  'grant_̲type=authorization_̲code&';
$params  .=  'code=ʻ‘.$code;
$params  .='&redirect_̲uri=oob';
$headers  =  array(
                                                    'Content-‐‑‒Type:  application/x-‐‑‒www-‐‑‒form-‐‑‒urlencoded;charset=UTF-‐‑‒8',
                                                    'Authorization:  Basic  '.base64_̲encode($appid.':'.$secret),
                                                    );
$curl  =  curl_̲init();
curl_̲setopt($curl,  CURLOPT_̲URL,  $url_̲token);
curl_̲setopt($curl,  CURLOPT_̲POST,  true);
curl_̲setopt($curl,  CURLOPT_̲RETURNTRANSFER,  true);
curl_̲setopt($curl,  CURLOPT_̲POSTFIELDS,  $params);
curl_̲setopt($curl,  CURLOPT_̲HTTPHEADER,  $headers);
curl_̲setopt($curl,  CURLOPT_̲VERBOSE,  true);
$result  =  curl_̲exec($curl);
curl_̲close($curl);
34	
トークン取得エンドポイントのレスポンスの例
string(1249)  
"{"access_̲token":"6GMsysoGhJvbEry5lYWU2ea3XsE7T4_̲xDq0tfAA1_̲AY5KiciO4QCCZEvrHUYUxySI43Vg4
rbdaQsdHrB0SmRDvjM.v4vBmWA8rmeX4qZzkqbt9BO9vZdoyfCYfDveBKN2ob8aatXQVECksRTH3WOQDFj
CcmRwnlgWCq0vyn.
1qs2Lm4OABpvyJ60bNclYp4bYnLnfg_̲2CWlSasQMzZFNddtRjd5HawBfe9nKUUfUOrybyqdefOKqR8B8lyHXT
92X1OL8w9vmEbsEA2wmYHek3yzM93RuhpstpEANARSI_̲JYX.vZLDrYuugFoP8S.Nr6rilL.
8SNyAI5XnSJ8vnjKl5q8Y_̲ly9kLKxWW1q8ftj60v1uK.hHVn21iV8hVy.LXuX8LcHYhKr2OBB4PHfJBRGCvbPay
rY3mmOL63C92Duo_̲Tnwqwymf6SQxWQu6O4KA8S0OgVJWFIsVaSxOtEcQwTJIc.RL1bvr6pQuysvEce5ZM
PWZi.U_̲6XqTFNLval1.OnqKWYSe0RQHK8Cj05GmoWRe7X7pCzwG2_̲pr0RLwjhlDkem.QXBDVpTahiLPEYK
C1O3s4rcuDVk4bPK4VaSX05EHnXHUn0oy5mjTZMaYULicpVw68K1nR5rpZ28VSR1BRiIPKcfCDdkTFx831p
B8CAALH67sKFJqGnvSonj6xoSwHDUoltpdBusP.Tw6okLb9HcpHEPLLFIweQwHyrg_̲A7SC8E7_̲VVBsG_̲H7h
DLjpq0Yo5gltrkE","token_̲type":"bearer","expires_̲in":"3600","refresh_̲token":"AJ5F3lI20AJ.
0kMFVZbABthjxGgNawjRERcbid5JFvhDdDsDovfP","id_̲token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ey
Jpc3MiOiJodHRwczpcL1wvYXV0aC5sb2dpbi55YWhvby5jby5qcCIsInVzZXJfaWQiOiJTVlE2WlI3V1lMUFlUTj
NPVEtURVROMkdEUSIsImF1ZCI6ImRqMHphaVpwUFRacVNWSjVUVzgwTkhoTlZTWnpQV052Ym5OMWJX
VnljMlZqY21WMEpuZzlOVFEtIiwiaWF0IjoxMzkwOTA0NTE3LCJleHAiOjEzOTMzMjM2ODQsIm5vbmNlIjoiYW
FkZGVlZmYifQ.H0qnX_̲1PuxbmD4F_̲YLa1IA-‐‑‒GCNqw5byLiciSM9VXxwQ"}“
acess_̲tokenとrefresh_̲tokenは保存しておく。
access_̲tokenの有効時間は3600s
その後はaccess_̲tokenが無効になるので、保存しておいたrefresh_̲tokenでaccess_̲tokenを更更新する。
refresh_̲tokenの期限切切れの場合はやり直して両⽅方を新規取得する。
35	
トークンを使用してユーザのGuidを取得する ・Guidとは Yahoo! JAPAN IDをサービスで使わない(表⽰示しない)ために Yahoo! JAPAN IDに「⼀一対」になった代替ID (変わることはない) ・どうやって取るか YConnectで⽤用意されているUserInfoAPIへリクエストして取得する http://developer.yahoo.co.jp/yconnect/userinfo.html 36
取得したトークンでUserInfoAPIへリクエスト
・リクエスト(GET)
<?php
$access_̲token  =  ʻ‘取得したアクセストークンʼ’;
$httpHeader  =  array(
                                                          ʻ‘GET  /yconnect/v1/attribute?schema=openid  HTTP/1.1ʼ’,
                                                          ʻ‘Host:  userinfo.yahooapis.jpʼ’,
                                                          ʻ‘Authorization:  Bearer  ʻ‘  .  $access_̲token,
                                                              );
$curlSetOptArray  =  array(
                                                                        CURLOPT_̲URL                                      =>  'https://userinfo.yahooapis.jp/yconnect/v1/attribute?
schema=openid',
                                                                        CURLOPT_̲HTTPHEADER              =>  $httpHeader,
                                                                        CURLOPT_̲VERBOSE                        =>  true,
                                                                        CURLOPT_̲SSL_̲VERYFYPEER  =>  true,
                                                                        CURLOPT_̲HEADER                            =>  true,
                                                                        );
$ch  =  curl_̲init();
curl_̲setopt_̲array($ch,  $curlSetOptArray($ch,  $curlSetOptArray);
$result  =  curl_̲exec($ch);
curl_̲close($ch);
37	
UserInfoAPI:レスポンス ・レスポンス {“user_̲id”:“SVQ6ZR7WYLPYTN3OTKTETN2GDQ” Guid(user_̲id)が返ってきます。(後ほど使います) 38
ボックスAPIを使ってみよう 39
ボックスの仕様 Sid(StorageID) ユーザに紐づくストレージ上の領域ID UniqId 各ファイル・フォルダに振られる ユニークID Sid+UniqIdの組み合わせでストレージ上の オブジェクトを指定する 40
ボックスの仕様:公開について 公開URL 見せたいファイルを 公開状態にする 41 公開URLから いつでも参照できる
ボックスの仕様:公開のポイント ・継承公開 上位フォルダに公開設定をするとその配下全ての ファイル・フォルダも「継承公開」として公開状態になる仕様。 継承公開されているかどうかは 「PublicInherited」フラグで判断することができる。 ・コピー コピーすると、コピー先での予期せぬ公開を防ぐためコピー先 ファイル・フォルダの全ての公開情報がリセットされる。 ・移動 移動は公開状態が維持されたまま移動される。 Sid UniqIdは変わらない。 42
ボックスの仕様:継承公開について 公開 継承公開 継承公開 継承公開 継承公開 公開 継承公開 継承公開 43
ボックスAPIの使い方 サンプルコードを通してAPIの基本的な使い方を解説します。 フォルダ作成やアップロードなどの結果は実際にボックスを 確認しながら行ってみてください。 ユーザ情報取得 作成したフォルダ にアップロード フォルダ作成 44 アップロードした ファイルを公開する
ボックスユーザ情報取得:リクエスト <?php $access_̲token = ʻ‘取得したアクセストークンʼ’; $guid = ʻ‘取得したGuidʼ’; $url = ʻ‘https://ybox.yahooapis.jp/v1/user/fullinfo/ʼ’ . $guid; $httpHeader = array( ʻ‘Host:ybox.yahooapis.jpʼ’, ʻ‘Authorization: Bearer ʻ‘ . $access_̲token, ); $curlSetoptArray = array( CURLOPT_̲URL => $url, CURLOPT_̲HTTPHEADER => $httpHeader, CURLOPT_̲RETURNTRANSFER => true, CURLOPT_̲VERBOSE => true, CURLOPT_̲HEADER => true, ); $ch = curl_̲init(); curl_̲setopt_̲array($ch, $curlSetoptArray); $result = curl_̲exec($ch); curl_̲close($ch); 45
ボックスユーザ情報取得:レスポンス <?xml version="1.0" encoding="UTF-‐‑‒8"?> <User> <Guid>NG33XHXZ5GMCQBYUHODK5IFENQ</Guid> <isService>true</ServiceStatus> <isSuspend>false</ServicesSuspend> <QuotaOver>false</QuotaOver> <Sid>box-‐‑‒l-‐‑‒e7q4pp5kzdohdpe7vvheelgpce</Sid> (ユーザのSid) <RootUniqId>d9b6ed3f-‐‑‒3826-‐‑‒4f3b-‐‑‒a47f-‐‑‒5e09a73cbe69</RootIUniqId>(ユーザのルートデ ィレクトリ「/」(マイボックス)のUniqId) <Quota> <Max>53687091200</Max> 使⽤用できる容量量(Byte) <TotalUsed>2242518</TotalUsed> 現在使⽤用している容量量(Byte) </Quota> </User> 次:ルートディレクトリ「/」(マイボックス)のUniqIdが取得出来たので、ルートディレクトリにフォルダを作成する 46
フォルダ作成:リクエスト
$sid  =  ʻ‘ユーザのSidʼ’;
$uid  =  ʻ‘ルートディレクトリ「/」のUniqIdʼ’;
$access_̲token  =  ʻ‘取得したアクセストークンʼ’;
$url  =  'https://ybox.yahooapis.jp/v1/file/'  .  $sid  .  '/'.$uid;
//  フォルダ作成のボディ
$body  =  ʻ‘<?xml  version=“1.0”  encoding=“UTF-‐‑‒8”?><Object><Name>作成したいフォルダの名前</Name></Object>ʼ’;
$httpHeader  =  array(
                                                                  'Host:ybox.yahooapis.jp',
                                                                  'Authorization:  Bearer  '  .  $access_̲token,
                                                                    );
$curlSetoptArray  =  array(
CURLOPT_̲URL                                              =>  $url,
CURLOPT_̲HTTPHEADER                  =>  $httpHeader,
CURLOPT_̲RETURNTRANSFER  =>  true,
CURLOPT_̲VERBOSE                                =>  true,
CURLOPT_̲HEADER                                    =>  true,
CURLOPT_̲POST                                            =>  true,
CURLOPT_̲POSTFIELDS                      =>  $body,
);
$ch  =  curl_̲init();
curl_̲setopt_̲array($ch,  $curlSetoptArray);
$result  =  curl_̲exec($ch);
curl_̲close($ch);
47	
フォルダ作成:レスポンス
<?xml  version="1.0"  encoding="utf-‐‑‒8"  ?>
<Object>
<Sid>box-‐‑‒l-‐‑‒svq6zr7wylpytn3otktetn2gdq-‐‑‒1004</Sid>
<UniqId>17c80ee0-‐‑‒612e-‐‑‒481b-‐‑‒b73b-‐‑‒3afaf59f1aa6</UniqId>  作成されたフォルダのUniqId
<Path><![CDATA[/作成したいフォルダの名前]]></Path>
<ModifiedTime>2014-‐‑‒02-‐‑‒06T19:56:32+09:00</ModifiedTime>
</Object>
次:フォルダにファイルをアップロードする
48	
フォルダ作成されたか確認する ボックスWebを開いてフォルダが作成されたかどうか確認 49
アップロード:リクエスト
<?php
$token  =  ʻ‘アクセストークンʼ’;
$sid  =  ʻ‘ユーザのSidʼ’;
$uid  =  ʻ‘アップロードするフォルダのUniqIdʼ’;
$file  =  ʻ‘/tmp/test.jpgʼ’;
$file_̲name  =  ʻ‘test.jpgʼ’;
$body  =  file_̲get_̲contents($file);
$headers  =  array(
                                                    ʻ‘Authorization:  Bearer  ʼ’  .  $token,
                                                    ʻ‘Content-‐‑‒Type:  multipart/form-‐‑‒dataʼ’,
                                                    ʻ‘Content-‐‑‒length:  ʻ‘  .  filesize($file),
                                                    ʻ‘box-‐‑‒obj-‐‑‒sid:  ʻ‘  .  $sid,
                                                    ʻ‘box-‐‑‒obj-‐‑‒parentuniqid:  ʻ‘  .  $uid,
                                                    ʻ‘box-‐‑‒obj-‐‑‒filename:  ʻ‘.  $file_̲name,
                                                    ʻ‘box-‐‑‒obj-‐‑‒md5:  ʻ‘  .  Md5($body),
                                                        );
$url  =  'https://upload.ybox.yahooapis.jp/v1/upload';
$curl  =  curl_̲init($url);
curl_̲setopt($curl,CURLOPT_̲HEADER,  true);
curl_̲setopt($curl,CURLOPT_̲HTTPHEADER,  $headers);
curl_̲setopt($curl,CURLOPT_̲POST,true);
curl_̲setopt($curl,CURLOPT_̲RETURNTRANSFER,  true);
curl_̲setopt($curl,CURLOPT_̲POSTFIELDS,$body);
curl_̲setopt($curl,CURLOPT_̲VERBOSE,true);
$result  =  curl_̲exec($curl);
if(!curl_̲errno($curl)){
        $response_̲header  =  curl_̲getinfo($curl);
}
curl_̲close($curl);
var_̲dump($result);
50	
アップロード:レスポンス
<?xml  version="1.0"  encoding="utf-‐‑‒8"  ?>
<Object>
<Name>test.jpg</Name>
<Sid>box-‐‑‒l-‐‑‒svq6zr7wylpytn3otktetn2gdq-‐‑‒1004</Sid>
<UniqId>0c703d7c-‐‑‒3e10-‐‑‒4af2-‐‑‒bccc-‐‑‒4539492a5c18</UniqId>アップロードされて発⾏行行された
UniqId
<Etag>"5ddf0bde1391418521237985"</Etag>
<ModifiedTime>2014-‐‑‒02-‐‑‒03T18:08:41+09:00</ModifiedTime>
<Path>/作成したいフォルダの名前/test.jpg</Path>
<Url>https://yoctfs.jp/res/box-‐‑‒l-‐‑‒svq6zr7wylpytn3otktetn2gdq-‐‑‒1004?
account=storage&expires=1391418642&uid=0c703d7c-‐‑‒3e10-‐‑‒4af2-‐‑‒
bccc-‐‑‒4539492a5c18&signature=NzY2ODkyM2MyNzc5YmQ1YWRmMmY1N2YxZWQ3NTh
kMWEyZDJmYjYyMg-‐‑‒-‐‑‒</Url>
</Object>
次:アップロードしたファイルを公開設定する
51	
アップロードされたか確認する ボックスWebを開いてファイルがアップロードされたか確認 52
ファイル公開:リクエスト ・リクエスト:公開したいファイルのUniqIdを指定してリクエスト(PUT) $sid = ʻ‘ユーザのSidʼ’; $uid = ʻ‘公開したいファイルのUniqIdʼ’; $url = 'https://ybox.yahooapis.jp/v1/file/public/'.$sid.'/'.$fuid; $httpHeader = array( 'Host:ybox.yahooapis.jp', 'Authorization: Bearer ' . $access_̲token, ); $curlSetoptArray = array( CURLOPT_̲URL => $url, CURLOPT_̲HTTPHEADER => $httpHeader, CURLOPT_̲RETURNTRANSFER => true, CURLOPT_̲VERBOSE => true, CURLOPT_̲HEADER => true, CURLOPT_̲PUT => true, ); $ch = curl_̲init(); curl_̲setopt_̲array($ch, $curlSetoptArray); curl_̲exec($ch); $response_̲header = curl_̲getinfo($ch); curl_̲close($ch); 53
公開されたか確認してみる ボックスWebを開いてファイルが公開状態になっているか確認 54
参考資料 •Yahoo!デベロッパーネットワーク(YJDN) http://developer.yahoo.co.jp/ •ボックスAPI http://developer.yahoo.co.jp/webapi/box/ •YConnect http://developer.yahoo.co.jp/yconnect/ •Yahoo!ボックス http://info.box.yahoo.co.jp/index.html 写真素材:©株式会社データクラフト 55