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

如何让Discord.py机器人在命令后接收输入?附!nuke命令实现疑问

Discord机器人命令后接收用户输入及!nuke命令实现

咱们先解决命令执行后接收用户输入的核心问题——discord.py里可以用client.wait_for()方法监听后续用户消息,通过自定义判断条件,确保只接收触发命令的用户在同一频道发送的内容。

针对你的!nuke命令,我帮你修正代码问题,同时完善权限校验、消息数量获取和批量删除的逻辑:

修正后的完整代码示例

import discord
import random
import time
import asyncio
from discord.ext import commands
from discord.ext.commands import Bot

# 设置命令前缀,新版本推荐用command_prefix参数
client = Bot(command_prefix='!')

@client.event
async def on_ready():
    print(f"Logged in as {client.user}")  # 机器人上线提示,方便调试

@client.event
async def on_message(message):
    if message.author == client.user:  # 忽略机器人自身消息,避免循环触发
        return
    
    if message.content == '!nuke':
        # 权限判断:新版本discord.py已用guild_permissions替代旧版server_permissions
        if message.author.guild_permissions.administrator:
            await message.channel.send('How many messages do you want to remove?')
            
            # 定义消息过滤规则:仅接收触发命令的用户在当前频道的输入
            def check(msg):
                return msg.author == message.author and msg.channel == message.channel
            
            try:
                # 等待用户输入,超时时间设为60秒
                user_input = await client.wait_for('message', check=check, timeout=60.0)
                # 尝试将输入转为整数
                delete_count = int(user_input.content)
                
                # 批量删除限制:一次最多删100条,且不能删除超过14天的消息
                if 1 <= delete_count <= 100:
                    # 包含触发命令的消息和用户输入的消息,所以要多删2条
                    messages = await message.channel.history(limit=delete_count + 2).flatten()
                    await message.channel.delete_messages(messages)
                    await message.channel.send(f'Successfully deleted {delete_count} messages!', delete_after=5.0)
                else:
                    await message.channel.send('Please enter a number between 1 and 100.', delete_after=5.0)
            except ValueError:
                # 用户输入非数字的情况处理
                await message.channel.send('Invalid input! Please enter a number.', delete_after=5.0)
            except asyncio.TimeoutError:
                # 用户超时未输入的情况处理
                await message.channel.send('You took too long to respond!', delete_after=5.0)
        else:
            await message.channel.send('You don\'t have permission to use this command!', delete_after=5.0)
    
    # 必须添加这句,否则其他基于commands框架的命令会失效
    await client.process_commands(message)

# 替换为你的机器人Token
client.run('YOUR_BOT_TOKEN_HERE')

关键细节说明

  • 接收用户输入:通过client.wait_for('message', check=check, timeout=60.0)实现,check函数用来过滤消息,确保只有触发命令的用户在同一频道的输入才会被处理。
  • 权限校验修正:旧版的server_permissions已被弃用,现在统一使用guild_permissions。
  • 批量删除限制:bulk_delete方法一次最多删除100条消息,且仅支持删除14天以内的消息;另外要把触发命令的消息和用户输入的消息一起删掉,所以需要多算2条。
  • 异常处理:加入了输入非数字、超时未输入的异常捕获,让机器人的响应更健壮。

另外,更推荐用commands装饰器写法,代码结构更清晰:

@client.command()
@commands.has_permissions(administrator=True)
async def nuke(ctx):
    await ctx.send('How many messages do you want to remove?')
    
    def check(msg):
        return msg.author == ctx.author and msg.channel == ctx.channel
    
    try:
        user_input = await client.wait_for('message', check=check, timeout=60.0)
        delete_count = int(user_input.content)
        if 1 <= delete_count <= 100:
            messages = await ctx.channel.history(limit=delete_count + 2).flatten()
            await ctx.channel.delete_messages(messages)
            await ctx.send(f'Deleted {delete_count} messages successfully!', delete_after=5)
        else:
            await ctx.send('Please enter a number between 1 and 100.', delete_after=5)
    except ValueError:
        await ctx.send('Please enter a valid number!', delete_after=5)
    except asyncio.TimeoutError:
        await ctx.send('Timeout! You didn\'t respond in time.', delete_after=5)

这种写法用@commands.has_permissions直接做权限校验,代码更简洁,也符合discord.py的最佳实践。

内容的提问来源于stack exchange,提问作者French_bread_gud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:38:11