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

プログラミング

わたすけです。タイトルの通り、いきなりDiscordのBotを作りました。

今回は、Botを作るにあたって躓いた点や、こうしたら楽になるかもというようなことを備忘録みたいに書いていきます。

ちなみに作ったBotはGitHubにおいています。Discord Botよくわからないので各自DiscordのBotアカウントを作成しないといけなくなっているので、いいやり方があればぜひ教えてください。

GitHub - watasuke102/TimeTree-NoticeBot: TimeTreeの予定を確認して通知するDiscord用Botスクリプト
TimeTreeの予定を確認して通知するDiscord用Botスクリプト. Contribute to watasuke102/TimeTree-NoticeBot development by creating an account on GitHub.

Botを作ったきっかけ

なぜコミュニケーションツールはLINEでなくDiscordにすべきか?
かなり昔にこんな記事を書きました。えっなにこれは・・・(大困惑) 自分は長らく(中3冬くらいまで)Discordはボイスチャットツールだと考えており、そのボイスチャットすらLINE通話でよくね?と考えていた時期すらありました。...

この記事でも書いたとおり、個人的に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制作挑戦の備忘録でした。

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

コメント

タイトルとURLをコピーしました