🔖

匿名で質問できるDiscord Botを作った話

2021/05/26に公開
18

はじめに

匿名で質問できるDiscord Botを作りました。
リポジトリはこちら

作った動機としては、

  • 質問に対する心理的安全性を確保する
  • 質問が公開されることで、情報共有の機会を増やす
  • 質問が公開されることで、回答できる人を増やす

などがあります。DM会話問題を改善するきっかけになればいいなと考えています。

事前準備

  • VMインスタンスを立てる(GCPなど)
  • Python3の環境を作る
  • Gitのパスを通す

これらは記事が出てくるので、いい感じにググってください。よくわからなかったら質問してください。

Botの作り方はRustで作るdiscord bot入門編 (serenity使用)を参照するとわかるかと思います。

使い方

  1. Botを起動する
  2. DiscordサーバーにBotを招待する
  3. /set コマンドでメッセージを転送したいチャンネルを設定する
  4. DMにメッセージを送信する

起動までのコマンドは

$ git clone https://github.com/t4t5u0/DiscordQuestionBoxBot.git
$ cd question_bot
$ pip install -r requirements.txt
$ vim info.json
$ nohup python main.py &

動作例

20200510_002453.jpg

store.csvにログを吐き出すようにしています。不要であればコメントアウトしてください。
コミュニティ間のコミュニケーションが円滑になる一助となれば幸いです。

おわりに

実際に、サークルのDiscordサーバーに導入しました。その結果、匿名の質問はもちろん、通常の質問も増えました。サークルメンバーが気軽に質問できる環境を用意できたのでよかったです。

Discussion

yomoyomo

サーバー運営にとても助かるbotだと思います。
私も使わせてもらいたいのですが、こちらのソースコードは複製・改変等してもいいのでしょうか。

たつおたつお

大丈夫です。僕の方でLICENCEをつけ忘れていたら後ほどつけておきます。どんどん使ってください

tosewakatosewaka

VMインスタンスでpython3の環境を作ることができなかったです
方法があってもしよければ教えていただきたいです

月

VMインスタンス環境にて、色々あってどうにかディスコード上でオンライン状態にまで持っていく事ができました。
ただ、チャンネルの指定で躓いています。以下の状態です。
・jsonに管理者モードで取得したチャンネルIDを入力して動作させると、対象のチャンネルが無いと出る。
・/set が動作せず、コマンドの一覧にも出ない。
共通してこのメッセージです。「転送対象のテキストチャンネルが見つかりません。転送したいチャンネルで/setと送信してください。」
・上記の通り、ディスコード上でBotから返信が送られて来ている。そのためjsonが読み込まれていないという事は無いと思われる。
よければ教えて頂けると幸いです。

月

追記:Botの再導入も試しましたが、変化なしでした。

月

追記2:Botの動作に成功しました。チャンネルIDの指定方法が原因でした。
✕ "channel_id": 12345678901234567890
○ "channel_id": "12345678901234567890"
このように、ダブルクォーテーションが不足していたため発生していたようです。

ただ、これとは別件で最初に描いたエラーの内容を吐きながら動作しているという問題が発生しましたが・・・
今の所、ひとまず動作しているのでヨシ!としています。

たつおたつお

例えば、Botが対象のチャンネルを見ることができない場合、チャンネルがないというエラーが出る気がします

月

返信感謝!
成程、必要とされる動作は別として。
動作をチェックしているBotの中身がチャンネルを見れていないとエラーが吐かれているのかもですね。
そうなるとうーむ…やっぱり一通り動かしても、ディスコード上を除いてエラーを吐いてる場所が無いんですよね。
勘では、main.pyを生成する時に何か間違った手順を取ってしまってるのかなぁと思うのですがうーむ。
install discordは多分関係ないですし、やっぱり分からないですね…
調べる方法について心当たりありませんか?
初心者故、思うような答えを出せず申し訳なき。

たつおたつお

こちら1年以上前に作ったものなのでメンテナンスも兼ねて調査してみます

月

もしかすると環境的な問題かもしれませんので、程々にお願いします!
こちらの情報についてもう少しお出ししますね。
【手順】
・GCPにてVMインスタンスを作成
・PuTTYgenにてRSAの鍵を作成、VMインスタンスに設定。
 以降、PuTTYの操作でGCPに接続。
・Homebrew、Python3、gitの順にインストール(多分)
・それぞれのパスが通った事を確認。ヨシ!
・こちらにあるコードを入力しつつ環境を設置。
【固有の変更点】
・こちらのサイトにある二行目は以下で実施
 ×cd question_bot
 ○cd DiscordQuestionBoxBot
・info.jsonの内容は以下の入力方法で実施
 ✕ "channel_id": 12345678901234567890
 ○ "channel_id": "12345678901234567890"
・こちらの環境では以下の四行目をPuTTYで入力すると停止するため省略
 →vim info.json
【現在の状況】
・ディスコード上でのみ以下のエラー表示。info.jsonで指定したチャンネルにはBotからメッセージが届いており、必要な動作は行われている。エラーはこの通り、二行表示されている。
(このBot名)
ボット
— 昨日 12:44
転送対象のテキストチャンネルが見つかりません。転送したいチャンネルで/setと送信してください。
転送対象のテキストチャンネルが見つかりません。転送したいチャンネルで/setと送信してください。

月

んー・・・ちょっとinfo.jsonの設定を変えてnohup python3 main.py &を繰り返し実行してるとエラーが増えてる気がします。
今新しい環境で動作確認中ですが、今度はメッセが出なくなった…よく分からない報告で申し訳ないです。

月

複数回エラーについて判明したので、その報告と追加で質問を。
まずはエラーの発生条件について。
・nohup python3 main.py & を実行する度にエラーが増えている。
・新しいBotを作成して導入するとエラーがリセットされた。
 →Bot側で動作が記録されている可能性が高い?

追加の質問について。
新しい環境、新しいBotでやりなおしているのですが、指定したチャンネルに返事を返してくれません。
オンライン状態になっているのに/setも動作せず、エラーだけ出て困っています。
オンラインにはなっているので、info.jsonのtokenは読み込まれている筈なのですが…
この解決方法について心当たりがあるかどうかと、
入力方法について確認したいので、間違っていれば教えて下さい。

現状の入力方法は以下となります。
以下のチャンネルは、カテゴリー内に格納されているチャンネルです。
{
"token":"MTA----------------------------------.-----.----------------",
"channel_id":"1016489197714026628"
}

たつおたつお

nohupはバックグラウンドでタスクを動かすために使っているので、前に走っているのを殺さないと不具合の原因になる可能性があります。ps aux | grep main.py などを叩いて不要なbotを落とす必要がありそうです。

jsonの読み込みなどは調査してみます。時間ができたらDockeriseとv2への移行をするので、また状況が変わりましたら連絡します。

月

バックグラウンドタスク削除の件、確認しました。
教えて頂いたコードを入力して特定し、kill id を使ってbotを落とした所、無事にエラーの個数を1個まで減らす事に成功しました。
ただ、やっぱり指定のチャンネルを見つけてくれませんね・・・

わざとtokenを間違えたらエラーすら出なくなった(Botを見失った)ので、
やっぱりinfo.jsonは読み込まれてるように感じますし、
やはりchannel_idまわりで何かが起こっているのか、あるいは何かの設定不足でディスコードのチャンネルまで到達できずにいるのだと感じています。
[GCP⇔Bot=成功]で
[Bot⇔チャンネル=失敗]なせいで、
ずっとチャンネルIDが原因だと思い込んでいたのでは?という印象を持っています。
だとしても、Botには管理者権限を入れているのでなんでもいける筈なのですが…
うーむ、一度できた事ができなくなるのが少し歯痒い。 調査の程、よろしくお願い致します。

月

申し訳ありません、原因が判明しました。こちらの勘違いでした。
元々書いてあった方法通り、channel_idの表記方法はダブルクォーテーションが不要だったようです。


"token":"MTA----------------------------------.-----.----------------",
"channel_id":"1016489197714026628"


"token":"MTA----------------------------------.-----.----------------",
"channel_id":1016489197714026628

このようにすると、問題なく動作しました。
最初にこうじゃないとダメだった。と言っていたのは勘違いでした。
お手数をおかけしました。