記事一覧ページへ移動

Pythonを使ってDiscordのBotを作ってみた!やり方や感想まとめ

2024-10-16
2020-06-18

わたすけです。タイトルの通り、いきなり 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++に親しんでいた自分は「動的型付け・・・ダメだな・・・」とか思いました。そこらへんしっかり定義すればエラーも減るので。

いきなり取得した予定の時刻関連がおかしくなった

今朝、予定の開始 10 分前に通知する機能を作っていた時、なぜか API から取得した予定の開始時刻と終了時刻が UTC になっていました。例えば TimeTree では 9:00〜10:00 と表示されている予定が 0:00〜1:00 の予定になっていました。

完全に原因不明です。だれかたすけて

この Bot の欠点

導入するために Discord Bot アカウント、TimeTree のパーソナルアクセストークンを取得する必要がある

Discord Bot なにもわからないので配布方法がわからず、このような現状になっております。どうか配布方法教えてください。

常にスクリプトを動かしてなければならない

いちおう 24 時間起動してくれるサービスもあるっぽいですが、登録が面倒なのでやってません(???)
ラズパイがほしくなりますね。

感想

とりあえず思ったより Python 難しくないし楽しいなと感じました。with〜as のような便利な構文、{}を気にする必要のないタブによるブロック判定、;不要などなど。そこそこ便利に感じました。
ただ、with as はまだしも残り 2 つはデメリットもあり、動的型付けの不便さもあってやはりC++が最強と実感しました。

また、API 思ったより難しくないとも感じました。それっぽい関数と URL を使うだけで json ファイルを受け取ることが出来、その json ファイルも Python ライブラリのおかげでけっこう読み込みやすく、余り難しいことを考えずにできてよかったです。

まとめ

  • Python そこそこいいね
  • API 思ってるほど難解じゃないね
  • だれか良い Discord Bot 配布方法おしえて

ということで、Bot 制作挑戦の備忘録でした。

夏休みの自由研究レポートみたいになってしまった


Comments

Powered by Giscus