Parallax Image

Cutls Code Archives


SNZ 2016

PHPでDropbox APIを叩く

カテゴリ:Code Archives, PHP, サーバー 投稿日:2017年7月16日

更新間隔が空きすぎてお久しぶりと書く必要もないような気がします。

とりあえずComposerでDropbox SDKを持ってきます。Composerとかそこら辺の詳しい知識はないので…
適当なディレクトリ上で(インストールされるディレクトリなので、サーバー上の任意のディレクトリ)、
composer.jsonを作成して、そこに、

{
  "require": {
    "dropbox/dropbox-sdk": "*"
  }
}

と書いて、その後、

$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install

と叩く
これで終了です。PHPの頭に

require './vendor/autoload.php';

と書くだけカンタンです。

APIの下準備として、Developers – Dropboxに行って、Create you appを選んで適当に入れます。

Appが作成できたら、次にやることは目的によって変わってきます。

  1. 自分のDropboxアカウントのみ操作
  2. ユーザーのDropboxアカウントを、承認を得て操作

1.自分のDropboxアカウントのみ操作
Generated access tokenのGenerateを押して、コードをコピーしておく

あとは、PHPのrequireの下に、

$dropbox = new \Dropbox\Client('<ここにさっきのコードを入力>', 'agent-name');

と書けば準備完了です。
[2.~]を飛ばして読んで下さい。

2.ユーザーのDropboxアカウントを、承認を得て操作
今回はエンジニア側の負担が少ない簡便な認証コード入力方式を採用します。
App key、App secretを持ってきます。

https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=<App key>
にユーザーをアクセスさせます。
そして出てきたコードを何らかの形でサーバーに送信してもらいます。
サーバー上で、

$POST_DATA = array(
    'code' => <取得したコード>,
	"grant_type" => "authorization_code",
      "client_id" => "<App key>",
      "client_secret" => "<App secret>",
);
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, "https://api.dropboxapi.com/1/oauth2/token");
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_COOKIEJAR,      'cookie');
curl_setopt($curl,CURLOPT_COOKIEFILE,     'tmp');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡

$response= curl_exec($curl);
$resp = json_decode($response, true); 
$at=$resp["access_token"];

ここで、$atに入った値(アクセストークン)さえあれば、APIは全て利用可能です。この値は不変なので保存しておけばいつでもユーザーの承認なしにアクセス可能です。
逆に、流出してしまうと大変ですので、保存の際は暗号化等、万全の対策を取ってください。
その後に、

//$atにアクセストークンを入れた状態で
$dropbox = new \Dropbox\Client($at, 'agent-name');

これでAPIにアクセス可能です。

APIへのアクセスはカンタンです。
例としてアップロードしてみましょう。

$fp = fopen('video.mp4(サーバー側のファイル)', 'rb');
$res = $dropbox->uploadFile('/Videos/video.mp4(Dropbox側のファイル)', \Dropbox\WriteMode::add(), $fp);
fclose($fp);

もしユーザーからアップされたファイルを受信したい場合は、$_FILESを見ればOKです。Ajaxの場合はまず.js上でBase 64に変換してからテキストとして送り、PHP上でtmpfile()などで仮のファイルを作成してから同様の操作をすればOKです。そこら辺は調べてください。

その他のAPIは、Class Dropbox\Client | Dropbox SDK for PHPを見ればわかると思います。
例えば、共有可能なリンクを取得したい場合、

$res=$dropbox->createShareableLink('');

です。