You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py机器人Spam功能:1-30数字输入校验失效问题求助

问题分析与解决方案

核心问题

你的代码存在两个关键错误,导致只有输入1时机器人才会响应:

  1. check函数循环逻辑错误:在for number in NUMBERS_SPAM循环里,第一次迭代就直接return,这意味着程序只会校验第一个元素(也就是"1")。输入其他数字时,第一次判断不匹配就直接返回False,循环根本不会继续检查后面的数字。
  2. 频道判断逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:16:38