ITも大抵筋肉でなんとかなる

気が向いたら技術的なことも書くかもしれないですが、技術的なこと=ITとは限りません。

Python3でGoogle Driveのファイルを操作する ~Google Drive操作編~

操作するためのモジュールを作成する

すでに「Python3でGoogle Driveのファイルを操作する ~アクセストークン発行編~Access tokenを得ているはずである。またdrive serviceも作成できるようになっているかと思う。これらを利用しupload,downloadなどの基本操作ができる関数群を内包したモジュールを作成する。
具体的には下記があれば事足りるだろう。

  • upload
  • download
  • delete
  • search

これらの機能を提供できるソースコードの例を下記に示した。

google_drive_utils.pyの解説

execute_search_queryについて

Google Driveのファイルを検索するために、Googleが検索用のクエリを用意してくれている。この関数はそれを実行している。詳細は下記。

なお実行した結果取得できるファイルの情報はデフォルトでid・name・parentsに絞っているが、実際は下記に記載された情報が取得可能。

この関数における主な役割はGoogle Drive上に存在しているファイルのfileId(folderId)を取得すること。後述のdownload,deleteを使用するためにはfileIdが分かっていなければならない。ファイル名から削除することはできないためである。Google Driveは仕様上同名のファイルを同一フォルダ上に配置できるのでファイル名では一意にならないことが理由。downloadとdeleteを使用するためにはまずfileIdを知る必要がある。この関数を使用すればそれらの関数にfileIdを渡すことが可能となる。

uploadについて

uploadは下記が抑えられていれば特に難しいこともないかと思う。 1. アップロード元ファイルとアップロード先ファイルのファイル名ば別途指定する必要がある(名称を変更してアップロードできる) 2. 1つのファイル実体を複数のフォルダ配下に置くことができる(Google Driveの仕様) 3. MIME Typeを指定する必要がある 4. drive_service.files.create()で指定しているbodyはnameやmimeType等のヘッダ情報であるイメージ 5. drive_service.files.create()で指定しているmedia_bodyが実際に保存する中身

2.に関しては特にややこしいポイントかと思う。これに関しては「google drive 親 複数」などと検索してもらえれば何を言っているのかすぐに分かると思う。

downloadについて

downloadについてもこと難しいポイントはない。ただしuploadと違いGoogle DriveのfileIdが分かっていないと使用できないため、事前にexecute_search_queryを実行しておく必要がある。

deleteについて

deleteについても難しいポイントはない。が、ファイルはゴミ箱に入らず完全に消え去るため注意(引数指定すればゴミ箱に入れるようにもできた気がする)。こちらもdownload同様fileIdを事前に取得しておく必要がある。

コマンドラインで使う

Pythonからはめでたく使用できるようになったが、このままだとPythonを通してのみしか使用できないためちょっとしたことに使用するには不便である。下記にコマンドラインから使用できるようにするモジュールのソースコードを示す。これを使えばコマンドラインからも使用できるようになる。

上記コードだが、例えばこのようにして使用できる。

$ python google_drive_cli.py -o search -q 'name="test.txt"' | jq -r .[0].id | xargs -I{} python google_drive_cli.py -o download -f "{}" -d hogefuga.txt

まとめ

3記事にわたってPython3からGoogle Driveを触るための手順を記した。見てもらって分かるように結構道のりは長い。「ちょっと使いたいなぁ~~~~」とか思ってやりだしたらめちゃくちゃハマって苦心した思い出がある。だからまとめたんだけど…。

補足:ソースコードについて

ソースコードはどれもサンプルです。そのうえ「あっ動いたわ」というレベルでしかテストしていません。それでも良ければご自由にご利用いただいて構いません。コピペいただいても自由です。もちろん使った結果何らかの被害をこうむっても責任を取りません。
こう書いた方が綺麗じゃないのか?とかあれば教えてもらえるとありがたいです。あとは一応動作確認はしていますが万が一動かないという場合も教えていただけると幸いです。