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

Discord.py Kick命令多参数问题求助:带理由踢人报错找不到用户

解决discord.py踢人命令带理由时“找不到用户”的问题

问题分析

你遇到的核心问题有几个可能的诱因:

  1. 缩进语法错误:代码中await member.kick(reason=reason)的缩进层级与其他代码不一致,这会直接中断命令执行流程,表现为“无法踢除用户”。
  2. 私信发送失败中断逻辑:如果目标用户关闭了私信权限,await member.send()会抛出异常,导致后续踢人操作被终止,控制台可能输出混淆性报错。
  3. 参数解析异常:若输入命令时未正确@目标用户(比如只用了昵称而非提及),discord.py无法解析出有效的discord.Member对象,触发“找不到用户”报错。

修复后的完整代码

import asyncio
import discord
from discord.ext import commands

@client.command(aliases=['Kick'])
@commands.has_permissions(administrator=True)
async def kick(ctx, member: discord.Member, *, reason='no reason'):
    # 发送服务器内通知
    await ctx.send(f'{member.name} 已被踢出服务器!我们已尝试向其发送私信告知原因。')
    
    # 尝试发送私信,捕获异常避免中断踢人流程
    try:
        await member.send(f'**你已被从 {ctx.guild.name} 踢出\n理由:{reason}**')
    except discord.Forbidden:
        await ctx.send(f'⚠️ 无法向 {member.name} 发送私信(对方可能关闭了私信权限)')
    
    # 执行踢人操作(核心逻辑放在最后,避免前置操作失败导致无法踢人)
    await member.kick(reason=reason)
    
    # 延迟清理消息
    await asyncio.sleep(5)
    await ctx.channel.purge(limit=2)
    
    # 控制台日志
    print(f"{ctx.author} ----> 执行了 {prefix}kick 命令")

关键修复说明

  • 修正缩进:确保所有同级代码缩进一致,避免Python语法错误。
  • 异常处理私信:用try-except捕获私信发送的权限异常,保证踢人逻辑不受影响。
  • 正确传递理由:将命令传入的reason变量填入私信内容,替换原固定文本。
  • 调整操作顺序:先尝试发送私信,再执行踢人,避免踢人后用户离开服务器导致私信无法送达。

额外排查建议

  • 确认机器人拥有踢出成员的权限,且权限等级高于目标用户。
  • 输入命令时必须正确@目标用户,或使用用户ID、服务器内唯一的完整昵称。
  • 若仍出现“找不到用户”,可尝试将参数类型改为discord.User后再转换为服务器成员:
    async def kick(ctx, user: discord.User, *, reason='no reason'):
        member = ctx.guild.get_member(user.id)
        if not member:
            await ctx.send("该用户不在当前服务器中")
            return
        # 后续逻辑同上
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:18:55