Google Drive API を利用したいと思うことが多々ある。 しかも、個人で Heroku とかで動かしたい。 そういうときは、サービスアカウントキーを利用する。 JSON 形式であれば、 Google にサンプルがある。

google-api-nodejs-client/jwt.js

比較的に簡単だ。 ただ、一つ気をつけたいのがキーに紐づくユーザーは自分ではないこと。API 用のユーザーです。一覧を取得しても自分のファイルにはアクセスできません。キーを発行するときに Google が発行した新たなメールアドレス経由でディレクトリを共有すればアクセスが可能になります。

ファイルをアップロードする

生成したデータ(JSONファイル)をアップロードします。

const fs = require('fs');
const {google} = require('googleapis');

async function runSample (query) {
  const client = await google.auth.getClient({
    keyFile: 'key.json',
    scopes: [
      'https://www.googleapis.com/auth/drive',
      'https://www.googleapis.com/auth/drive.appdata',
      'https://www.googleapis.com/auth/drive.file',
      'https://www.googleapis.com/auth/drive.metadata',
      'https://www.googleapis.com/auth/drive.metadata.readonly',
      'https://www.googleapis.com/auth/drive.photos.readonly',
      'https://www.googleapis.com/auth/drive.readonly'
    ]
  });

  const drive = google.drive({
    version: 'v3',
    auth: client
  });

  const params = { pageSize: 3 };
  params.q = query;
  const res = await drive.files.create({
    resource: {
      name: 'hoge.json',
      // 自分で生成したドライブディレクトリのID.
      parents: [GOOGLE_DRIVE_TEST_FOLDER_ID]
    },
    media: {
      mimeType: 'application/json',
      body: fs.createReadStream('hoge.json')
    },
    fields: 'id'
  }, (error, response) => {
    if (error) {
      console.error(error);
    } else {
      console.log('File Id: ', response.data.id);
    }
  });
}

runSample();