目次
サンプル・プログラムの実行例
サンプル・プログラムのダウンロード
| getDropBox.php | サンプル・プログラム本体。 |
| pahooDropboxAPI.php | Dropbox APIクラス pahooDropboxAPI。 Dropbox APIクラスの使い方は「PHPで Dropboxのファイル取得」を参照。include_pathが通ったディレクトリに配置のこと。 |
つづいて Dropbox API Explorer にアクセスし、左ペインからどれかAPIを選ぶと、下図の画面になる。
PHPプログラムでは、このアクセス・トークンを使ってAPIにアクセスする。
解説:pahooDropboxAPI クラス
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」で解説している。
クラスファイル "pahooDropboxAPI" は、組み込み関数 require_once を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
pahooDropboxAPI.php
21: //Dropbox API Access Token:各自で設定
22: //https://www.dropbox.com/lp/developers
23: var $DROPBOX_TOKEN = '**************************';
解説:Dropbox API リクエスト
リクエストは全てhttps通信で処理されることから、「PHPセキュリティ対策:SSL通信を行う」で紹介した cURL 関数群を用いる。
pahooDropboxAPI.php
77: /**
78: * Dropbox API v2:アクセストークンを用いたリクエスト
79: * @param string $url リクエストURL
80: * @param array $argv Dropbox-API-Argに渡すパラメータ配列(省略可能)
81: * @param array $post POSTに渡すパラメータ配列(省略可能)
82: * @param string $upload アップロードするデータ
83: * @return bool TRUE:リクエスト成功/FALSE:失敗
84: */
85: function requestDropboxAPIv2($url, $argv=NULL, $post=NULL, $upload=NULL) {
86: $flagArg = FALSE;
87: $headers[] = 'Authorization: Bearer ' . $this->DROPBOX_TOKEN;
88:
89: // cURLを使ってリクエスト
90: $curl = curl_init() ;
91: curl_setopt($curl, CURLOPT_URL , $url);
92: curl_setopt($curl, CURLOPT_HEADER, 1) ;
93: curl_setopt($curl, CURLOPT_SSL_VERIFYPEER , FALSE); //証明書は無視
94: curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); //結果を文字列で
95: curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
96: curl_setopt($curl, CURLOPT_TIMEOUT, 5);
97: if ($argv != NULL) {
98: $headers[] = 'Dropbox-API-Arg: ' . json_encode($argv);
99: $flagArg = TRUE;
100: }
101: if ($upload != NULL) {
102: $headers[] = 'Content-Type: application/octet-stream';
103: curl_setopt($curl, CURLOPT_POSTFIELDS, $upload);
104: $flagArg = FALSE;
105: } else if ($post != NULL) {
106: $headers[] = 'Content-Type: application/json';
107: curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post));
108: }
109: curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
110:
111: $res1 = curl_exec($curl);
112: $res2 = curl_getinfo($curl);
113: curl_close($curl);
114: $res = substr($res1, $res2['header_size']);
115:
116: //結果処理
117: $this->webapi = $url;
118: preg_match("/HTTP\/[0-9\.]+\s([0-9]+)\s(.+)/ims", $res1, $arr);
119: if (! isset($arr[2])) {
120: $this->error = TRUE;
121: $this->errmsg = 'Dropbox API failure';
122: } else if ($arr[1] >= 300) {
123: $json = json_decode($res);
124: $this->error = TRUE;
125: $this->errmsg = $arr[2];
126: } else {
127: $this->responses = $flagArg ? $res : json_decode($res);
128: }
129: return (! $this->error);
130: }
Dropbox API v2:ファイル検索
| リクエストURL |
|---|
| https://api.dropboxapi.com/2/files/search |
| フィールド名 | 要否 | 内 容 |
|---|---|---|
| path | 必須 | 検索対象ディレクトリ。Dropboxのパスで指定する。 |
| query | 必須 | 検索パターン。ワイルドカードに加え、正規表現を利用できる。 |
| start | 任意 | 検索開始番号。省略時は0。 |
| max_results | 任意 | 検索でヒットした情報の最大数。省略時は100。 |
| mode | 任意 | 検索対象 filename:ファイル名とフォルダ名 filename_and_content:ファイル名、フォルダ名、及びファイルの内容 deleted_filename:削除したファイル目とフォルダ名 省略時はfilename。 |
pahooDropboxAPI.php
132: /**
133: * Dropbox API v2:パターンにマッチするファイルを探す
134: * @param string $pattern パターン
135: * @return array マッチするファイル・ディレクトリを含む配列/FALSE:存在しない
136: */
137: function glob($pattern) {
138: $url = 'https://api.dropboxapi.com/2/files/search'; //リクエストURL
139: $arr = pathinfo($pattern);
140: $post['path'] = $arr['dirname'];
141: $post['query'] = $arr['basename'];
142:
143: $res = array();
144:
145: if ($this->requestDropboxAPIv2($url, NULL, $post) == FALSE) {
146: $res = FALSE;
147: } else if (isset($this->responses->matches[0]->metadata->name)) {
148: foreach ($this->responses->matches as $mat) {
149: $res[] = $mat->metadata->path_display;
150: }
151: } else {
152: $res = FALSE;
153: }
154:
155: return $res;
156: }
Dropbox API v2:通常ファイルかどうか
pahooDropboxAPI.php
158: /**
159: * Dropbox API v2:ファイルのタグ情報を取得する
160: * @param string $filename ファイル名(パスを含む)
161: * @return string タグ情報
162: */
163: function get_tag($filename) {
164: $url = 'https://api.dropboxapi.com/2/files/search'; //リクエストURL
165: $arr = pathinfo($filename);
166: $post['path'] = $arr['dirname'];
167: $post['query'] = $arr['basename'];
168:
169: if ($this->requestDropboxAPIv2($url, NULL, $post) == FALSE) {
170: $res = FALSE;
171: } else if (isset($this->responses->matches[0]->metadata->name)) {
172: $tag = '.tag';
173: $res = $this->responses->matches[0]->metadata->$tag;
174: } else {
175: $res = FALSE;
176: }
177: return $res;
178: }
Dropbox API v2:ファイルの内容取得
| リクエストURL |
|---|
| https://content.dropboxapi.com/2/files/download |
| フィールド名 | 要否 | 内 容 |
|---|---|---|
| path | 必須 | ダウンロードするファイルのフルパス名。Dropboxのパスで指定する。 ファイルIDやrevでも指定できる。 |
pahooDropboxAPI.php
207: /**
208: * Dropbox API v2:ファイルの内容取得
209: * @param string $filename ファイル名(パスを含む)
210: * @return string ファイル内容/FALSE:失敗
211: */
212: function file_get_contents($filename) {
213: $url = 'https://content.dropboxapi.com/2/files/download'; //リクエストURL
214: $argv['path'] = $filename;
215:
216: return ($this->requestDropboxAPIv2($url, $argv) == FALSE) ?
217: FALSE : $this->responses;
218: }
サンプル・プログラムの流れ
getDropBox.php
119: /**
120: * Dropboxのファイル取得
121: * @param string $query 検索パターン
122: * @return array(取得データ,WebAPI,エラーメッセージ)
123: */
124: function getDropboxTextFile($query) {
125: $res = $api = $errmsg = '';
126: $pdb = new pahooDropboxAPI(); //Dropbox APIクラス
127:
128: if ($pdb->iserror()) {
129: $errmsg = $pdb->geterror();
130: //ファイル検索
131: } else if (($files = $pdb->glob($query)) == FALSE) {
132: $errmsg = $query . ' : not found';
133: //通常ファイルかどうか
134: } else if (! $pdb->is_file($files[0])) {
135: $errmsg = $files[0] . ' : is not a file';
136: //ファイル内容取得
137: } else if (($res = $pdb->file_get_contents($files[0])) == FALSE) {
138: $errmsg = $files[0] . ' : ' . $pdb->geterror();
139: }
140: $api = $pdb->webapi;
141: $pdb = NULL;
142:
143: return array($res, $errmsg, $api);
144: }
主な処理はユーザー関数 getDropboxTextFile の通りである。検索パターンは、各自の環境に合わせて変更してほしい。
また、クラス pahooDropboxAPI には、ファイルにデータを書き込んだりアップロードするメソッド、ファイルを削除するメソッドも用意してある。各自の責任において活用してほしい。

2018年(平成30年)9月現在、Dropbox API v2 ではPHP用のSDKが用意されていないため、ここではPHP 5以上でフレームワークを必要とせず、PHPのファイル操作関数に似せたメソッドを用意することを目標にする。
(2022年2月12日)PHP8対応,リファラ・チェック改良