銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

ウェブアプリからGoogle Driveのファイルを扱う 'gdrive-fs'

f:id:takamints:20171130164857j:plain
photo credit: suzyhazelwood DSC04299-02 via photopin (license)

ウェブアプリから Google Drive のファイルを操作するモジュール(npm)を公開しましたので、ご紹介。

これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん
たにぐちまこと
マイナビ出版 (2017-03-27)
売り上げランキング: 13,953

npmはこちら。

www.npmjs.com

目次

関連記事:

takamints.hatenablog.jp

takamints.hatenablog.jp

機能概要

サインインしたユーザーのファイルを読み書き

このモジュールを利用するウェブアプリで、ユーザーがGoogleアカウントでサインインすると、ウェブアプリからユーザー自身のGoogle Driveのファイルへアクセスできます。

これらのファイルは、ユーザーが特別に共有設定などをしない限り、他人には見ることができません(ただしアプリはDrive内の全内容を把握できることには注意が必要)。

ファイル名によるファイルの操作

ローカルのファイルシステムと同じように、ファイル名とフォルダ名によってファイルを扱うAPIを提供しています。

Google Drive API は、ファイルIDによってファイルにアクセスしますが、パスでアクセスできるほうが直感的ですよね。

APIは、おおまかに Node.jsの fs モジュールのメソッド名に従っています。 ただし、多くが非同期関数として動作しますが、callback は受け付けず、Promiseを返します(ほとんどが async 関数です)。

UI作成支援機能

こちらはまだα版。動作確認用のサンプル実装程度です。

そのうちまじめに作って公開するつもりなのでちょっと待ってネ。

インストールと使い方

npmで公開しているので、npmでinstallしてください。

$ npm install --save gdrive-fs

バンドラーを使われているなら、CommonJS的にインポートしてください。

const Gdfs = require("gdrive-fs");
(async()=>{
    await Gdfs.loadApi(<clientId>, <apiKey>);
    .
    .
    .
})();

バンドラーを使っていない場合、HTMLのScriptタグで 本モジュールの/build/gdrive-fs.min.jsを読み込んでください。 この場合、グローバル変数として、Gdfsが利用できます。

<!DOCTYPE html>
<html>
<head>...</head>
<body>
.
.
.
<script src="<path-to-module>/build/gdrive-fs.min.js">
(async()=>{
    await Gdfs.loadApi(<clientId>, <apiKey>);
    .
    .
    .
})();
</script>
</body>
</html>

動作条件

APIキー」と「クライアント ID」

ウェブアプリ開発者は、Google Developer Console でプロジェクトを作成し、ウェブアプリケーション向けの認証情報として、「APIキー」と「OAuth 2.0のクライアント ID」を作成し、適切に設定しておく必要があります。

多くの場合、APIキーはHTTPリファラーによる制限をかけ、クライアントIDのタイプは「ウェブアプリケーション」としておきます。

APIリファレンス

本モジュールが提供しているクラス、APIの完全な説明は、以下のリンクからどうぞ。 つたない英文で書いています。

以下に要約した内容を転載します。最新情報は上記URLを参照してください。

Gdfsクラス

このクラスは Google Drive API v3 へのインターフェースであり、インスタンスはカレントディレクトリを管理して、ファイルやフォルダを操作するメソッドを提供します。

このインスタンスを作成する前に、これを利用するアプリケーションの Client Idと Api Keyにより、クラスメソッド loadApi で、このAPI群が読み込まれていなければなりません。 これら2つのキーは、Google Developer Consoleのプロジェクトで作成されていなくてはなりません。

また、ファイルを操作するにはユーザーがGoogleアカウントでサインインしておく必要があります。

このインスタンスのカレントディレクトリは、コンストラクタでルートフォルダに初期化されます。 これはchdirメソッドで変更できます。 カレントディレクトリ変更時には、oncwdupdate コールバックが呼ばれます。カレントディレクトリを知るには、cwd メソッドが利用できます。

クラスメソッド

  • async loadApi(clientId, apiKey) - Google Drive API (v3)を読み込む。
  • isSignedIn() - Google Driveにサインインしているかどうかの確認。
  • async signIn() - Google Driveにサインインする。
  • async signOut() - Google Driveからサインアウトする。

コンストラク

  • Gdfs() - コンストラク

インスタンスメソッド

  • async chdir(directory:string) - カレントディレクトリの移動。
  • cwd() - カレントディレクトリを返す。
  • async isDirectory(path:string) - パスがディレクトリかどうかを返す。
  • async mkdir(path:string) - ディレクトリの作成。
  • async readdir(path:string, options:object) - ディレクトリ内のファイルのリストを読み出す。
  • async readFile(path:string) - ファイル内容の読み取り。
  • async rmdir(path:string) - ディレクトリ削除。
  • async stat(path:string) - ファイルのメタ情報を取得する。
  • async unlink(path:string) - ファイルの削除(ゴミ箱には入らない)
  • async writeFile(path:string, mimeType:string, data:any) - ファイルへの書き込み。または新規作成。

制限事項・注意事項

名前だけではファイルを特定できない問題は無視

Google Driveでは、一つのフォルダ内に同じ名前のファイルが複数存在できます。 なので、本当は名前だけではファイルを一意に特定できません。 でも、そういう使い方自体が混乱のもとですから、本モジュールではバッサリ無視して最初に見つけたほうを採用しています(多分)。

削除してもゴミ箱には入りません

Gdfs.unlink(path) メソッド で削除した場合、ごみ箱には入りませんので、重々気を付けてくださいね。

セキュリティ警告とアプリケーションの申請について

未申請のアプリケーションに、ユーザーがサインインしようとすると「安全でないアプリケーションである」との警告が表示されます。 Googleにアプリケーションを申請して承認されていれば、これは表示されなくなるはずです。 アプリケーションを正式に公開する場合は申請しておいたほうが良いでしょう。

アプリケーションの申請はそれぞれのエンドポイントで行う必要があるため、本モジュールで行うものではありません。

ライセンス

本モジュールはMITライセンスにおいて公開しています。

免責

本モジュールは、これを利用するアプリケーションの安全性を保証せず、その動作について一切の責任を負いません。 本モジュールを利用するアプリケーションのすべての動作は、アプリケーションの製造者の責任において試験され、ユーザーに提供されるべきです。 悪意のあるアプリケーションや不具合によって被害を受けないためには、信頼できる人以外が作ったアプリケーションには接続するべきではありません。