Google Drive APIで画像を取得する

取得手順

概要

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から画像をダウンロードしてみます。

  1. credentialsの読み込み
    先ほどのget_token.jsの中のauthorizeという関数を使うため、このファイルの最後の行に以下を追加。
module.exports = authorize;
  1. 実装

以下のように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);
  1. 実行
node index.mjs

でファイルをダウンロードできました。なお、先ほど作成したcredentials.jsontoken.jsonを使いまわすことでローカルPC以外でも上記のプログラムは動かせました。

Comments

Copied title and URL