SKYMENU Cloud Devicecontrol Editionでは、Google Drive APIを使用しています。
今回は、Google Drive上にあるファイル・フォルダを操作するGoogle Drive APIの使い方をご紹介します。
概要
Google Drive APIは、クライアントからGoogle Driveを操作するためのAPI群です。
ファイルのアップロード、ダウンロード、検索、共有、コピー、削除などの操作をプログラムで実行することができます。
また、ファイルやフォルダに付随しているメタデータの更新にも対応しています。
使い方
サンプルとして、Google Drive APIを使って、Google Drive上に存在するファイルをコピーする例を示します。
Googleの公式Node.js用クライアントライブラリ(googleapis)を使う方法と、fetchで呼び出す方法をご紹介します。
※Google Drive APIを使えるようにプロジェクトは作成されているものとします。
※JavaScriptです。
[クライアントライブラリ(googleapis)を使う場合]
const {google} = require('googleapis'); // Google APIライブラリ
const {OAuth2} = google.auth;
// 認証情報を取得する関数
async function getAuth() {
const oAuth2Client = new OAuth2(
'YOUR_CLIENT_ID', // クライアントID
'YOUR_CLIENT_SECRET', // クライアントシークレット
'YOUR_REDIRECT_URL' // リダイレクトURL
);
// トークンを設定
oAuth2Client.setCredentials({
refresh_token: 'YOUR_REFRESH_TOKEN'
});
return oAuth2Client;
}
// ファイルをコピーする関数
async function copyFile() {
// 認証情報取得
const auth = await getAuth();
// Google Drive APIの呼び出し
const driveService = google.drive({version: 'v3', auth});
try {
const fileId = 'YOUR_FILE_ID'; // コピーしたいファイルのID
const response = await driveService.files.copy({
fileId: fileId,
requestBody: {
name: 'YOUR_FILE_NAME' // コピー後のファイル名
}
});
console.log('コピーしました:', response.data); // 成功メッセージとコピーされたファイルのデータを出力
} catch (error) {
console.error('コピーに失敗しました:', error); // エラーメッセージを出力
}
}
[fetchで呼び出す場合]
// 認証情報を取得する関数
async function getAuthToken() {
const oAuth2Client = new OAuth2(
'YOUR_CLIENT_ID', // クライアントID
'YOUR_CLIENT_SECRET', // クライアントシークレット
'YOUR_REDIRECT_URL' // リダイレクトURL
);
// トークンを設定
oAuth2Client.setCredentials({
refresh_token: 'YOUR_REFRESH_TOKEN'
});
const token = await oAuth2Client.getAccessToken();
return token.token;
}
// ファイルをコピーする関数
async function copyFileWithFetch() {
const authToken = await getAuthToken();
const url = `https://www.googleapis.com/drive/v3/files/YOUR_FILE_ID/copy`; // YOUR_FILE_ID:コピーしたいファイルのファイルID
const requestBody = {
name: 'YOUR_FILE_NAME' // コピー後のファイル名
};
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${authToken}`, // 認証トークンをヘッダーに追加
'Content-Type': 'application/json'
},
body: JSON.stringify(requestBody) // リクエストボディをJSON形式で送信
});
if (!response.ok) {
throw new Error('コピーに失敗しました');
}
const data = await response.json();
console.log('コピーしました:', data); // 成功メッセージとコピーされたファイルのデータを出力
} catch (error) {
console.error('コピーに失敗しました:', error); // エラーメッセージを出力
}
}
このように、fetchで呼び出すよりも、クライアントライブラリ(googleapis)を使ったほうが実装は簡単です。
一方、同じ種類のAPIを複数回実行する必要がある場合は、「バッチリクエスト」を使用することにより、1つずつAPIを実行する場合に比べてHTTPの通信回数が減り、API毎のオーバーヘッドもなくなるため、パフォーマンスを向上させることが可能です。
以下に、バッチリクエストの使い方をご紹介します。
バッチリクエストについて
バッチリクエストは、複数のAPIを1つのリクエストとして送信することができます。
ただし、以下のような注意点があります。
1.リクエスト数の制限
バッチリクエストには一度にまとめて送信できるリクエスト数が最大100リクエストまでとなっています。
100を超えるようなリクエストを送信したい場合は、複数回のバッチリクエストを実行する必要があります。
2.実行結果の確認
まとめたリクエストの実行結果は、バッチリクエストのレスポンスに含まれています。
それぞれの実行結果を確認し、失敗したリクエストに対しては、リトライするなど適切にエラーハンドリングする必要があります。
バッチリクエストの実行結果自体は成功していても、まとめたリクエストそれぞれが成功しているとは限りません。
3.バッチリクエストにまとめたリクエストの実行順序は保証されない
例えば、フォルダ作成後にそのフォルダ内にファイルを作成したい場合、順番が逆転するとエラーになります。
処理順序が必要なケースでは使用すべきではありません。
4.APIの実行数制限に注意する
Google Drive APIには、一定期間におけるAPIの実行数制限が設けられています。
バッチリクエストにまとめたAPIも、API実行数としてカウントされますので、制限を超えないように注意が必要です。
以下はバッチリクエストを使って、複数回のコピーを行うサンプルコードです。
前段と同様にクライアントライブラリ(googleapis)を使う方法と、fetchで呼び出す方法をご紹介します。
[クライアントライブラリ(googleapis)を使う場合]
const {google} = require('googleapis'); // Google APIライブラリ
const {OAuth2} = google.auth;
// 認証情報を取得する関数
async function getAuth() {
const oAuth2Client = new OAuth2(
'YOUR_CLIENT_ID', // クライアントID
'YOUR_CLIENT_SECRET', // クライアントシークレット
'YOUR_REDIRECT_URL' // リダイレクトURL
);
// トークンを設定
oAuth2Client.setCredentials({
refresh_token: 'YOUR_REFRESH_TOKEN'
});
return oAuth2Client;
}
// バッチリクエストでコピーする関数
async function batchCopyFiles() {
const auth = await getAuth();
const driveService = google.drive({version: 'v3', auth});
const batch = new google.BatchRequest();
const fileIds = ['YOUR_FILE_ID1', 'YOUR_FILE_ID2']; // コピーしたいファイルのIDリスト
fileIds.forEach(fileId => {
batch.add(driveService.files.copy({
fileId: fileId,
requestBody: {
name: `YOUR_FILE_NAME_${fileId}` // コピー後のファイル名
}
}));
});
try {
const response = await batch.execute();
if( response.status === 200) {
console.log('バッチリクエストは成功しました'); // バッチリクエストの成功メッセージを出力
// 各APIの実行結果を確認
response.forEach((res, index) => {
if (res.status === 200) {
console.log(`API ${index + 1}が成功しました:`, res.data); // 各APIの成功メッセージを出力
} else {
console.error(`API ${index + 1}が失敗しました:`, res.statusText); // 各APIのエラーメッセージを出力
}
});
} else {
console.error('バッチリクエストは失敗しました'); // バッチリクエストのエラーメッセージを出力
}
} catch (error) {
console.error('バッチリクエストは失敗しました:', error); // バッチリクエストのエラーメッセージを出力
}
}
[fetchで呼び出す場合]
// 認証情報を取得する関数
async function getAuthToken() {
const oAuth2Client = new OAuth2(
'YOUR_CLIENT_ID', // クライアントID
'YOUR_CLIENT_SECRET', // クライアントシークレット
'YOUR_REDIRECT_URL' // リダイレクトURL
);
// トークンを設定
oAuth2Client.setCredentials({
refresh_token: 'YOUR_REFRESH_TOKEN'
});
const token = await oAuth2Client.getAccessToken();
return token.token;
}
// バッチリクエストでコピーする関数
async function batchCopyFilesWithFetch(fileIds) {
const authToken = await getAuthToken();
const url = 'https://www.googleapis.com/batch/drive/v3';
const boundary = 'batch_boundary';
let body = '';
fileIds.forEach(fileId => {
body += `--${boundary}\n`;
body += 'Content-Type: application/http\n\n';
body += `POST /drive/v3/files/${fileId}/copy\n`;
body += 'Content-Type: application/json\n\n';
body += JSON.stringify({ name: `YOUR_FILE_NAME_${fileId}` }) + '\n\n';
});
body += `--${boundary}--`; // 各APIリクエストの区切り
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${authToken}`, // 認証トークンをヘッダーに追加
'Content-Type': `multipart/mixed; boundary=${boundary}`
},
body: body // バッチリクエストのボディを送信
});
if (!response.ok) {
throw new Error('バッチリクエストの実行に失敗しました');
} else {
console.log('バッチリクエストの実行に成功しました'); // バッチリクエストの成功メッセージを出力
}
const data = await response.text();
// 各APIの実行結果を確認
const parts = data.split(`--${boundary}`);
parts.forEach((part, index) => {
if (part.includes('HTTP/1.1 200 OK')) {
console.log(`API ${index + 1}が成功しました:`, part); // 各APIの成功メッセージを出力
} else if (part.includes('HTTP/1.1')) {
console.error(`API ${index + 1}が失敗しました:`, part); // 各APIのエラーメッセージを出力
}
});
} catch (error) {
console.error('バッチリクエストの実行に失敗しました:', error); // バッチリクエストのエラーメッセージを出力
}
}
fetchでバッチリクエストを送る場合、bodyに詰める際に各APIの区切りを設定する必要があります(boundary)。
クライアントライブラリ(googleapis)を使うとboundaryはライブラリ側で処理してくれるので、実装が楽になります。
まとめ
Google Drive APIの使い方を説明しました。
同じ処理を複数回実行するようなケースの場合、バッチリクエストを使用すると、パフォーマンスが向上します。
ただし、先述した注意事項もありますので、使用する際はご注意ください。