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

如何在discord.py中实现命令执行前的Yes/No确认功能?

实现Discord机器人命令的Yes/No确认机制(以Ban命令为例)

我来帮你搞定这个确认逻辑!在discord.py里没有现成的get_confirmation()函数,但我们可以用client.wait_for()方法监听用户的后续回复,完美适配你的需求。下面是完整的可运行代码,带详细注释:

import discord
import asyncio
from discord.ext import commands

# 初始化机器人,根据你的实际需求调整前缀和权限
client = commands.Bot(command_prefix='!', intents=discord.Intents.all())

@client.command()
@commands.is_owner()  # 仅机器人所有者可用,若要开放给管理员可替换为@commands.has_permissions(ban_members=True)
async def ban(ctx, member: discord.Member, *, reason=None):
    # 发送确认提示,用member.mention正确提及目标用户
    await ctx.send(f"Ban {member.mention}?(y/n)")

    def check(message):
        # 只响应命令发起者的消息,且消息在同一频道
        return message.author == ctx.author and message.channel == ctx.channel

    try:
        # 等待用户回复,超时时间设为60秒(可按需调整)
        msg = await client.wait_for('message', check=check, timeout=60.0)
        
        # 忽略大小写处理用户回复
        if msg.content.lower() == 'y':
            await member.ban(reason=reason)
            await ctx.send(f"已封禁 {member.mention},原因:{reason if reason else '无'}")
        else:
            await ctx.send("Ban操作已取消")
    except asyncio.TimeoutError:
        # 处理超时未回复的情况
        await ctx.send("超时未确认,Ban操作已取消")

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

关键细节说明:

  • check过滤函数:确保只有发起命令的管理员/所有者的回复才会被处理,避免其他用户误操作干扰。
  • 超时机制:通过try-except捕获TimeoutError,防止机器人无限等待用户回复。
  • 正确提及用户:用member.mention替代硬编码的@member,能在频道里生成可点击的用户链接,体验更友好。
  • 权限灵活调整:如果需要让所有具备封禁权限的管理员使用该命令,把@commands.is_owner()换成@commands.has_permissions(ban_members=True)即可。

额外优化小建议:

  • 可以在确认提示里明确标注超时时间(比如“请在60秒内回复y/n”),让用户更清晰规则。
  • 也可以改成用表情反应(👍/👎)来确认,比打字更便捷,但你的需求是文字回复,上面的代码已经完全满足要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:23:58