質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1653閲覧

Discord.pyで特定のワードを何度か発したときにBanさせたい

hiroh1112

総合スコア1

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/04 11:34

前提・実現したいこと

Discord.pyを使って自分で荒らし対策Botを作ろうとしていまして、特定の言葉を発言して何回か以上それを発言したらBanするものを作りたいです。特定の言葉を発したメッセージを削除することはできたのですが、Banはなぜかできません。初心者ですので、できれば初心者にもわかりやすいようにお願い致します。

発生している問題

3, 4回以上フィルターした言葉を発しても削除されるだけでBANされない

該当のソースコード

Python

1@bot.event 2async def on_message(message): 3 filtered_words = ["フィルターしたいもの"] 4 for word in filtered_words: 5 if word in message.content.lower(): 6 await message.delete() 7 embed= discord.Embed(color=discord.Color.red()) 8 embed.set_author(name="自動削除") 9 embed.add_field(name="ユーザー:", value=f"{message.author.mention}", inline=False) 10 embed.add_field(name="削除されたワード:", value=f"{word}", inline=False) 11 embed.add_field(name="メッセージ:", value=f"{message.content}", inline=False) 12 embed.set_footer(text=f'ユーザー ID: {message.author.id}') 13 embed.timestamp = datetime.datetime.utcnow() 14 ch_name = "チャンネル名" 15 for channel in bot.get_all_channels(): 16 if channel.name == ch_name: 17 await channel.send(embed=embed) 18 counter = 0 19 counter += 1 20 if counter > 3: 21 user = bot.get_user(message.author.id) 22 await user.ban() 23 print(str(counter)) 24

試したこと

同様な症状やコードの書き方を調べて改善できるか試してみましたがダメでした。

補足情報(FW/ツールのバージョンなど)

Python3.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

例えばon_messageの外で

python

1bot.cache = {}

という辞書を作り、

python

1async def on_message(message): 2 # (省略) 3 # 削除した後にこれを入れる 4 if not message.author.id in bot.cache: 5 bot.cache[message.author.id] = 1 6 else: 7 bot.cache[message.author.id] += 1 8 if bot.cache[message.author.id] > 3: 9 # BAN処理...

といった感じにするとif文は反応すると思います。

そしてもう一つ見ていて気づきましたが、await user.ban()は動きません。サーバーを指定していないので。
これの解決法は簡単です。1行上のuser = bot.get_user(message.author.id)を消して、
await message.author.ban()にするだけです。

投稿2022/05/18 14:46

yaakiyu

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ざっと見て気がついたところを

counter = 0 counter += 1

counter は1にしかなりません

投稿2022/05/04 20:48

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroh1112

2022/05/05 07:16

なるほど? for文を使わないとということでしょうか?
y_waiwai

2022/05/05 07:51

for文がどーたらは知りませんが、 とにかく、その直後のif文が成立することはありえません
hiroh1112

2022/05/05 16:19

なるほど。ありがとうございます。 では、if文が成り立つようにするにはどのようにすればよいでしょうか? 初心者ですので教えていただけますでしょうか。
mimizu_

2022/05/13 08:39

そのコードだとそのif文を成立させることはできません。 dbなどに履歴を保存してその履歴から読み込んで規定の数に到達したかどうか判断してはどうですか
yaakiyu

2022/05/18 14:44 編集

(コメントの方でmarkdownが使えなかったため回答として投稿します。)
hiroh1112

2022/06/02 21:00

なるほど保存ですか!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問