Pythonを使ってDiscordのBotを作ってみた!やり方や感想まとめ
わたすけです。タイトルの通り、いきなり Discord の Bot を作りました。
今回は、Bot を作るにあたって躓いた点や、こうしたら楽になるかもというようなことを備忘録みたいに書いていきます。
ちなみに作った Bot は GitHub においています。Discord Bot よくわからないので各自 Discord の Bot アカウントを作成しないといけなくなっているので、いいやり方があればぜひ教えてください。
Bot を作ったきっかけ
個人的に LINE に対してものすごい不満があるんですね。最近 Linux を使っていて、Chrome 拡張機能でしか LINE を使えないというのも相まって、スマホがメインとして作られている LINE は相当不便です。
ということで、LINE を使わなくても良いように、まず自分のクラスで Discord を布教しました。いつでも通話できるよ〜みたいな釣り文句で誘い込み、クラスの約 3/8 くらいを誘い込みました。(クラス LINE がすでに過疎っているので通話どころかトークすらされない状態)
とはいえまだ 3/8 であり、誘い込みはまだ不十分です。ということで、誘い文句を一つ追加するとともに、前からほしいな〜と思っていたものを作ろうと思い、制作をはじめました。
どんな Bot を作ったか
弊クラスは TimeTree という劣化版 Google カレンダー予定共有サービスを利用して課題の提出日などを管理しているため、その予定を通知してくれるような Bot が欲しいなと思っていました。
- 毎朝 8:00(ソースコードの編集で変更可)に予定を取得し、予定数とタイトル、開始〜終了時刻をお知らせ
- 予定開始 10 分前にお知らせ
- @everyone で全員に通知(OFF 可 能)
このような機能を持った Bot を作りました。
作るときに躓いたこと
繰り返し実行が出来ない
ここを参考にして作っていたのですが、@tasks.loop()で、ループに入ったものの最後まで進まず、channel.send()(Bot に発言させる文)で止まってしまうという現象が起きて悩んでました。
今のところはおそらく、client.run()される前に await channel.send() を実行されると止まってしまうのだろうと推測しています。たぶん。
ツイートを読み込み中...
ツイートを読み込み中...
API #とは になってしまった
何しろ API も Python も今まで一切触ったことがなく、Python で API を叩くにはどうすればいいんだ〜と悩んでしまいました。いちおうそれっぽい記事は見たものの、どうやら TimeTree は HTML ヘッダにアクセストークンを埋め込んで API を叩かないといけないらしく(?)HTML ヘッダどうやって追加するの〜〜と悩みました。
Twitter のつよいひとに教えてもらい、Requests ではなく urllib を使っ て解決しました。
ツイートを読み込み中...
設定ファイル関連
さすがにアクセストークンやらカレンダー ID やらを GitHub に載せるのはまずいだろうなと思い、設定ファイルを用意してそこにトークンを書き込み、起動時にそこから読み込む仕組みを作りました。これにより、設定ファイル名を.gitignore に記述することでコミット対象から外すことができ、事なきを得ました。
しかし、これのせいで以下のような不具合が起きてしまうことに。
- Bot に発言させたいチャンネルの ID もファイルに記述していたが、関数にチャンネル ID を渡すときに整数型しか渡してはならないことを知らず、エラーが出た
ファイルから読み込んだ時点で変数が文字列型になってしまい、変数型の引数を使用する関数にそれを渡して見事にエラーが出ました。つらいですね。 - チャンネル ID を API 取得 URL に含めないといけなかったが、ファイルの行末にある改行コードを読み込んでしまい、それを URL に入れてしまってうまく取得できなかった
この改行コード、ネットで紹介されている数多の方法を使っても削除できず、かなり難航しました。ネットに書いていない方法を Twitter で教えてもらってなんとかなりました。
これらのような不具合から、C++に親しんでいた自分は「動的型付け・・・ダメだな・・・」とか思いました。そこらへんしっかり定義すればエラーも減るので。