■URLのメモをだいぶ前から記録していて、ブクマでもいいんですが、単なるメモテキストとして。メモってもURLとタイトルをコピペするだけの簡単なものなんですが、スマホを使い始めてからメモ作成が面倒になってきた。スマホの操作性はあまりよくない。とりあえず「共有」からグーグルドライブにアップロードして、PCから読み出すようにしたのだけど、手間は多くかかる。
考えた末に、グーグルドライブからAPI経由で読み出してメモテキストへ転記するようにしようと思った。
GoogleのAPIはPHPのSDKがあるのでそれを使えばだいぶ楽なんですが、やっかいなのはSDK関係のドキュメントが薄くて、サンプルソースくらいしか参考になるものがないこと。SDKを使う場合は、生のAPIの情報があっても意味がない。
とりあえずSDKにくっついているサンプルソースを観ながら使い方の見当をつけつつ手探りで。
とりあえず、大まかな流れはQuickstart: Run a Drive App in PHPから。
注意がいるのは、APIの認証で使うアカウントは自分のドライブにアクセスする場合でも、自分のアカウントではなく、アプリケーション開発に使うデベロッパーアカウントだという点でしょうか。自分のリソースにデベロッパーアカウントがアクセスするので、共有設定でデベロッパーアカウントからアクセスできるようにすることが必須です。これはカレンダーなどのほかのサービスでも同様。
今回は自分のグーグルドライブに共有用のフォルダを作りました。フォルダに共有を設定しておくと、そこにアップロードしたファイルは自動的に共有設定されるためです。ルートにファイルを置くと、自動的に共有はされません。
面白いのはAPIからはどのフォルダに置かれているかどうかに関わらず、共有可能なファイルはすべてフラットに扱えることです。格納フォルダはファイルが持つメタ情報の中では単なるParentIDでしかありません。
このため、共有フォルダが1つしかない場合、ファイルを取得するのは比較的簡単です。
$service = new Google_DriveService($client); $apiConfig['use_objects'] = true; $parameters = array(); $files = $service->files->listFiles($parameters);
逆に、ファイルパスという概念がないので、アップロードは面倒です。手順としてはアップロードしたいファイルオブジェクトにparentIDとしてアップロード先のフォルダのIDをセットしてからアップロード用のAPIに渡すことになります。フォルダのIDはグーグルドライブでフォルダにアクセスしたときのURLから拾うことができます。'folders/{ID}'という構造を持っています。
$client->setClientId(CLIENT_ID);
$service = new Google_DriveService($client);
$fileOperation = $service->files;
$parent = new Google_ParentReference();
$parent->setId(FOLDER_ID);
$file = new Google_DriveFile();
$file->setTitle($title);
$file->setDescription("Google Drive API test");
$file->setMimeType("text/plain");
$file->setParents(array($parent));
$file->setShared(true);
$fileOperation->insert($file, array("data" => $textBody, "mimeType" =>"text/plain"));
解ってしまえば単純なのですが、SDK経由で使えるメソッド名や使い方の要領というものが自明ではないので、SDKのソースなどを読んで手探りになりました。
これでアップロード、ダウンロードができるようになりました。面白かったのはファイル削除で、APIから削除すると、APIからは見えなくなるのですが、自分のドライブにはオブジェクトがちゃんと残っていることでした。共有設定だけが変更されているようなのですが、アクセスできなくなってしまうとメタ情報がアクセスできなくなるので実装は不明ですが、よくできているような、できていないような、面白い動きでした。