取得手順
概要
Google Drive APIを使ってファイルを操作するためには認証情報が必要。今回は簡易的な方法(サーバ上ではなくローカルPCで直接node.jsを実行する)を使って、認証情報を取得してみる。Google Drive APIのQuickstartを参考に進める。
Google Drive APIを有効化
Google Cloud コンソールのAPI へのアクセスの有効化メニューで、Google Drive API を有効にする
OAuth 同意画面を構成する
Google Cloud コンソールのOAuth 同意画面メニューで、OAuth同意画面を構成する。User Typeは外部
を指定(内部は選択できず)。Google Driveを直接操作するにはOAuthによる認証、認可が必要らしい。
認証情報の作成
Google Cloud コンソールの認証情報メニューでOAuth 2.0 クライアント ID
を作成する。承認済みのリダイレクトURIにはhttp://localhost:3000/oauth2callback
を指定。最後の画面で、jsonを出力しておく(credentials.jsonとして保存)。
なお、ここで作成する認証情報はOAuthで認証、認可するためのものであって、Google Drive APIをたたけるようにするには後述するようにブラウザ上での認証が必要。
プロジェクトの準備
今回はnode.js+googleapiで実装することにする。開発環境としてはWindows版のnode.jsとVisual Studio Codeを使用。
プロジェクトのフォルダを作って、以下を実行
npm init
npm install googleapis@105 @google-cloud/[email protected] --save
APIアクセス用のトークンを取得するためのコードを入手
先ほどのquickstartにあったコードをコピー(get_token.jsにrename)する。事前に同じフォルダに先ほど認証情報の作成画面で出力したjsonをcredentials.jsonという名前でコピーしておく必要がある。そして以下のように実行する。※@google-cloud/local-auth
はデモ用のためか、ローカルPCで直接実行する必要があるようだ。devcontainerだとうまくいかなかった(ブラウザが開けない)。
node get_token.js
うまくいけばブラウザが開くので、Google Drive APIでアクセスするGoogle Driveのユーザーで認証する。認証に成功すると、token.jsonが生成される。
ちなみにこちらのページによるとリフレッシュトークンは「プロジェクトの設定が外部ユーザへ開放されていて、かつTesting状態の場合はRefresh Tokenは7日間で失効する。」とのこと。失効したら上記の手順でtoken.jsonを再生成する必要がある。
Google Drive APIを使ってみる
APIを使ってGoogle Driveから画像をダウンロードしてみます。
- credentialsの読み込み
先ほどのget_token.jsの中のauthorize
という関数を使うため、このファイルの最後の行に以下を追加。
module.exports = authorize;
- 実装
以下のようにauthorizeを使ってGoogle Drive APIを呼び出せばファイルを取得したりできます。なお、こちらはES Modulesを使用していますのでファイル名はindex.mjsとしてます。
import authorize from './get_tokens.js';
import {google} from 'googleapis';
import fs from 'fs';
/**
* 最新画像を取得しコピーする
* @param {OAuth2Client} authClient An authorized OAuth2 client.
*/
async function getCurrentImage(authClient) {
const drive = google.drive({version: 'v3', auth: authClient});
const res = await drive.files.list({
pageSize: 10,
fields: 'nextPageToken, files(id, name)',
q: 'mimeType=\'image/jpeg\' and trashed = false and \'YOUR_FILE_ID\' in parents and name = \'myimage.jpg\'',
});
const files = res.data.files;
if (files.length === 0) {
console.log('No files found.');
return;
}
const dest = fs.createWriteStream('out.jpg');
try {
const res = await drive.files.get({fileId: files[0].id, alt: 'media'}, {responseType: 'stream'});
res.data.on('data', chunk => dest.write(chunk));
res.data.on('end', () => dest.end()); //保存完了
} catch (err) {
console.log('The API returned an error: ' + err);
}
}
const authClient = await authorize();
await getCurrentImage(authClient);
- 実行
node index.mjs
でファイルをダウンロードできました。なお、先ほど作成したcredentials.json
とtoken.json
を使いまわすことでローカルPC以外でも上記のプログラムは動かせました。
Comments