discord.py机器人Spam功能:1-30数字输入校验失效问题求助
问题分析与解决方案
核心问题
你的代码存在两个关键错误,导致只有输入1时机器人才会响应:
- check函数循环逻辑错误:在
for number in NUMBERS_SPAM循环里,第一次迭代就直接return,这意味着程序只会校验第一个元素(也就是"1")。输入其他数字时,第一次判断不匹配就直接返回False,循环根本不会继续检查后面的数字。 - 频道判断逻辑错误:
m.channel.send == message.channel.send是在比较两个方法对象,这永远不会相等,正确的做法是直接比较频道对象m.channel == message.channel。
另外,生成NUMBERS_SPAM的代码有冗余操作,i+1没有赋值给变量,完全是无效代码,可以直接简化。
修正后的代码
import discord import asyncio # 直接生成1-30的字符串数组,简化冗余代码 NUMBERS_SPAM = [str(i) for i in range(1, 31)] print(NUMBERS_SPAM) # 初始化客户端,开启消息内容意图(discord.py v2.x必需) intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 避免机器人响应自己的消息,防止循环触发 if message.author == client.user: return def check(m): # 直接用in判断输入是否在允许的数字列表里,同时校验频道和发送者 return m.content in NUMBERS_SPAM and m.channel == message.channel and m.author == message.author try: # 等待用户输入,设置60秒超时避免无限等待 msg1 = await client.wait_for("message", check=check, timeout=60.0) await message.channel.send(f"准备刷屏 {msg1.content} 次") except asyncio.TimeoutError: await message.channel.send("输入超时,请重新发起指令") # 替换成你的机器人Token client.run("YOUR_BOT_TOKEN")
关键改动说明
- 简化数字数组生成:用列表推导式直接生成1到30的字符串数组,去掉冗余的循环和变量操作。
- 修复check函数:
- 用
m.content in NUMBERS_SPAM替代循环判断,简洁高效,能覆盖所有允许的数字。 - 频道判断改为
m.channel == message.channel,确保消息在同一个频道发送。 - 增加
m.author == message.author校验,确保是发起指令的用户输入,避免其他人干扰。
- 用
- 添加超时处理:给
wait_for设置超时时间,防止机器人一直处于等待状态。 - 开启消息内容意图:discord.py v2.x版本需要手动开启
message_content意图,同时要在Discord开发者后台开启对应的权限,否则机器人无法读取消息内容。
内容的提问来源于stack exchange,提问作者AZZ
相关产品推荐
相关产品推荐

