discord.pyとGoogle Drive APIを利用して音楽Botを作った（Dockerでテスト→Herokuにデプロイ）


使用したファイルは[ここ](https://github.com/ysk0832/hobby/tree/master/discordbot-citron)に置いてます（認証関連除く）
**2020/08/08追記：[コードはこちらに移植しました](https://github.com/yousukeayada/discord-musicbot-citron)**
基本的に身内で楽しむ用に作りました。

# やりたいこと
1. discord 上でメッセージを送る
2. bot が google drive から曲ファイルを探す
3. 見つかったらダウンロードしてボイチャで再生

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/3ffcfdad-a53a-ee03-2b30-37ce85f05302.png)


また、音楽 bot に対して個人的な要件がいくつかあって、

- 自分以外も好きに曲をリクエストできる
- 曲名を正確に把握していなくても、一部さえ入力すれば再生したり候補を表示したりしてほしい
- bot は常に起動させておきたい

これらを満たすために google drive や heroku を利用することになりました。


# 環境
**2020/08/08追記：環境がアップデートされました**
- macOS Catalina 10.15.6
- Docker 19.03.5
- discord.py 1.4.0
- Google Drive API v3

# ディレクトリ構造
```bash
discord-musicbot
├── Procfile
├── citron.py
├── client_secrets.json
├── commands.py
├── requirements.txt
├── runtime.txt
└── token.pickle
```

各ファイルの説明

- citron.py：bot 本体
- commands.py：bot が反応するコマンドの一覧
- client_secrets.json, token.pickle：google drive 認証関連
- Procfile, runtime.txt, requirements.txt：Heroku デプロイに必要

# テスト環境構築（Docker コンテナ）
**2020/08/08追記：Docker を使わない場合は[GitHub の README](https://github.com/yousukeayada/discord-musicbot-citron) に使い方の手順を書いているので、そちらをご覧ください**

```bash
docker pull python:3.7
docker images
# コンテナ作成
docker run -d -it --name python --mount type=bind,source=path/to/mydir,target=/home/ python:3.7

# コンテナに入る
docker exec -it python bash

# 以下コンテナ内の操作
python3 -m pip install -U discord.py
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
apt update
apt -y upgrade
apt install ffmpeg
```

必要なものは適宜インストールして最終的にはこうなりました．不要なものも含まれてるだろうけど気にしない。
**2020/08/08追記：過不足ないように変更しました**

```text:requirements.txt
aiohttp==3.6.2
async-timeout==3.0.1
attrs==19.3.0
beautifulsoup4==4.9.1
cachetools==4.1.1
certifi==2020.6.20
cffi==1.14.1
chardet==3.0.4
discord==1.0.1
discord.py==1.4.0
google-api-core==1.22.0
google-api-python-client==1.10.0
google-auth==1.20.1
google-auth-httplib2==0.0.4
google-auth-oauthlib==0.4.1
googleapis-common-protos==1.52.0
httplib2==0.18.1
idna==2.10
multidict==4.7.6
mysqlclient==2.0.1
oauthlib==3.1.0
protobuf==3.12.4
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
PyNaCl==1.4.0
pytz==2020.1
requests==2.24.0
requests-oauthlib==1.3.0
rsa==4.6
six==1.15.0
soupsieve==2.0.1
uritemplate==3.0.1
urllib3==1.25.10
yarl==1.5.1
youtube-dl==2020.7.28
```

# Discord Bot
https://discordapp.com/developers/applications/
今回は柚に DJ をやってもらいます．
<img width="827" alt="スクリーンショット 2020-01-28 2.14.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/5e92eeee-3bb1-ec78-deae-67b37d0ea2fe.png">

# 本番環境（Heroku）
```bash
# Heroku CLIをインストール
brew install heroku/brew/heroku

heroku login
# アプリケーション作成
heroku create hoge
heroku open
# デプロイ
git init
heroku git:remote -a <herokuのアプリ名>
git add .
git commit -m "first commit"
git push heroku master
```

[こちら](https://qiita.com/coolwind0202/items/542761a1701c1176bc93)を参考にビルドパックを追加。<img width="799" alt="スクリーンショット 2020-01-28 3.06.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/b3b642c6-6343-3970-6785-222aac9fe2dd.png">

# 詰まったところ
あとは公式のドキュメントを見ながら地道に書いたんですが、google drive の認証で詰まったので、変更点だけ載せておきます。

```python
# 変更前
creds = flow.run_local_server(port=0)

# 変更後
creds = flow.run_console()
```

Docker でテストしてる関係か，ネットワーク関連でうまくいかなかったのかなーと思ったんですが，そちらを解決できず結局変更後のようになりました．もしわかる方がいれば教えていただきたいです．

# 完成
こんな感じで動作します．
<img width="376" alt="スクリーンショット 2020-01-28 22.53.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/b6892b1a-de43-77eb-61e5-ea987302651f.png">

<img width="369" alt="スクリーンショット 2020-01-28 22.54.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/7f3bb39d-4e4b-f8c6-f865-521538a677e7.png">

今後は DB も利用して何かやってみたいですね．（曲の詳細教えてくれるとかリコメンドシステムとか）

# おまけ（ Heroku アドオン）
- Papertrail：ログ監視用
- Process Scheduler：昼間は使わないのでスリープさせます

# 参考
- https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f
- https://developers.google.com/drive/api/v3/quickstart/python?hl=ja
- https://qiita.com/coolwind0202/items/542761a1701c1176bc93
- https://qiita.com/hugashy/items/38c5d53fd3ff55d2b0e3
- https://www.komee.org/entry/2018/10/30/120000