pythonanywhereでファイルのバックアップにGoogleドライブを使う方法

#はじめに
pythonでWebサービスを作るのに、デプロイ先として[pythonanywhere](https://www.pythonanywhere.com/)を使っているが、ここで、DBなどのデータのバックアップ先にGoogleドライブを使用したいという希望があり、そのための手順を記載する。

#gdriveのインストール

pythonanywhereにはWebインタフェースのBash consoleがついているので、ここから[gdrive](https://github.com/prasmussen/gdrive)(Google DriveのCLI版クラアント)をインストールする。

インストールといっても実行プログラムをダウンロードするだけ。Linux 64bit環境向けのもの(gdrive-linux-x64)をダウンロードする。ダウンロードしたら実行権を付け、パスの通っているフォルダに移動する。

```bash:(pythonanywhere_console)
~ $ curl -JLO https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download
~ $ chmod +x gdrive-linux-x64
~ $ mv gdrive-linux-x64 ~/.local/bin 
```

使いやすいようにエイリアスを設定する。

```bash:(.bashrc)
alias gdrive=gdrive-linux-x64
```

#googleアカウントへのログイン (アクセストークンの取得)

gdriveでは初回のコマンドの実行時にGoogle認証を行ってトークンを取得するため、とりあえず`gdrive list`を実行する。

```bash:(pythonanywhere_console)
 ~ $ gdrive list
Authentication needed                                                                                                                                                            
Go to the following url in your browser:                                                                                                                                         
https://accounts.google.com/o/oauth2/auth?access_type=offline&...(中略)...state=state                                                                           

Enter verification code:
```

指定されたURLにブラウザでアクセスするとGoogleのログイン画面が表示され、ログインに成功するとgdriveがGoogleアカウントへのアクセスをリクエストしている旨の画面が表示されるため「許可」をクリックする。

すると、コードが表示されるのでこれをコピーし`Enter verification code:`にペーストする。

```bash:(pythonanywhere_console)
Enter verification code: XXXXXX(表示されたコード)
```

これでアクセストークンが取得でき、ログインしたアカウントのGoogleドライブをgdriveコマンドで操作することができる。

アクセストークンは`~/.gdrive/token_v2.json`に保存されている。ログイン(Google認証)をやり直すにはこのファイルを削除する。

#アップロード

Googleドライブにアップロードするためには`gdrive upload`にファイル名を指定して実行する。

```bash:(pythonanywhere_console)
 ~ $ gdrive upload myfile
Uploading myfile
Uploaded 1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz at 101.0 B/s, total 101.0 B
```

Googleドライブにアップロードされたファイルを確認するためには`gdrive list`を実行する。

```bash:(pythonanywhere_console)
 ~ $ gdrive list
Id                                  Name           Type   Size      Created
1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz   myfile         bin    101.0 B   2018-11-18 12:00:00
```

#ダウンロード

Googleドライブからダウンロードするためには、`gdrive download`に`Id`を指定して実行する。
指定するのはファイル名ではなく`Id`であることに注意。`Id`は`gdrive list`実行時に一番左の列に表示されている。

```bash:(pythonanywhere_console)
 ~ $ gdrive download 1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Downloading myfile -> myfile
Downloaded 1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz at 101.0 B/s, total 101.0 B
```

#おわりに

pythonanywhereから、Googleドライブを使ってファイルのバックアップができるようになった。

また、これにより手元のPCとpythonanywhereとのファイルのやりとりもGoogleドライブ経由でできるようになる。手元のPCとのファイルのやりとり自体はpythonanywhereに付いているWebインタフェースのファイルマネージャでもできるが、一つの代替手段として。

#おまけ

URLやコード、ファイルのIDなどは、直接キーボードから入力するよりも、コピー＆ペーストで入力する方が楽だが、pythonanywhereのコンソールでもコピー＆ペーストが使用できる。

コピーは指定範囲をドラッグして`Ctrl+C`(Macでは`Command+C`)、ペーストは`Ctrl+V`(Macでは`Command+V`)でできる。右クリックでメニューが出てきたり、ペーストができたりはしないので念のため。

#参考資料
* [google drive を コマンドから使うgdrive が早くて便利](http://takuya-1st.hatenablog.jp/entry/2016/07/06/034412)
* [Linuxでの gdrive の使い方](https://www.nextdoorwith.info/wp/se/linux-gdrive/)
* [How do I copy and paste from PythonAnywhere consoles?](https://help.pythonanywhere.com/pages/CopyAndPaste/)