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


使用したファイルはここに置いてます(認証関連除く)
2020/08/08追記:コードはこちらに移植しました
基本的に身内で楽しむ用に作りました。

やりたいこと

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

また、音楽 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

ディレクトリ構造

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 に使い方の手順を書いているので、そちらをご覧ください

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追記:過不足ないように変更しました

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 をやってもらいます.

本番環境(Heroku)

# 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

こちらを参考にビルドパックを追加。

詰まったところ

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

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

# 変更後
creds = flow.run_console()

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

完成

こんな感じで動作します.

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

おまけ( Heroku アドオン)

  • Papertrail:ログ監視用
  • Process Scheduler:昼間は使わないのでスリープさせます

参考