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

discord.py编写whois命令无输出无报错 多命令出现相同问题求助

问题原因及修复方案

核心错误点

1. 致命参数覆盖错误

你代码中存在完全错误的赋值语句,直接把传入的有效用户实例覆盖成了类本身:

member = discord.Member # 这行完全多余,直接删掉即可

执行这行后,后续所有调用member.xxx属性的操作都会报错,但因为discord.py默认会吞命令执行的报错,所以你看不到任何输出。

2. "me"参数逻辑完全不生效

你当前把参数类型标注为discord.Member,当用户输入whois me时,类型转换直接失败,命令根本不会触发,判断逻辑永远不会执行。

3. 消息内容意图未开启

discord.py v2.0以上版本要求必须手动开启消息内容意图,否则机器人读不到用户发送的前缀命令,自然不会触发也不会报错:

  • 先到Discord开发者后台对应应用的「Bot」页面,开启Message Content Intent和Server Members Intent两个开关
  • 初始化Bot时添加意图配置:
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True # 必须开启才能读到前缀命令
intents.members = True # 必须开启才能获取成员信息
bot = commands.Bot(command_prefix="你的前缀", intents=intents)

4. 事件覆盖问题

如果你自己重写了on_message事件,必须在事件末尾加上await bot.process_commands(message),否则所有命令都会被拦截不触发。


修复后的代码示例

@commands.command(pass_context=True)
async def whois(self, ctx, *, member: str = None):
    '''
    User Info for basic info on that said User!
    '''
    # 处理me参数和默认参数
    if not member or member.lower() == "me":
        member = ctx.author
    else:
        # 手动转换用户对象
        try:
            member = await commands.MemberConverter().convert(ctx, member)
        except commands.MemberNotFound:
            await ctx.send("未找到对应的用户")
            return

    with open('storage//pp.json', 'r') as f:
        prefixes = json.load(f)

    prefix = prefixes[str(ctx.guild.id)]

    roles = [role for role in member.roles]

    embed = discord.Embed(colour=member.color, timestamp=ctx.message.created_at)
    embed.set_author(name=f'User Info - {member}')
    embed.set_thumbnail(url=member.avatar_url)
    embed.set_footer(text=f"Asked by {ctx.author}", icon_url=ctx.author.avatar_url)

    embed.add_field(name='ID:', value=member.id)
    embed.add_field(name='Guild name:', value=member.display_name)
    embed.add_field(name='Created At:', value=member.created_at.strftime("%a, %#d %B %Y, %I:%M %p "))
    embed.add_field(name='Joined At:', value=member.joined_at.strftime("%a, %#d %B %Y, %I:%M %p "))
    embed.add_field(name=f'Roles ({len(roles)})', value=" ".join([role.mention for role in roles]))
    embed.add_field(name='Top role:', value=member.top_role.mention)
    embed.add_field(name="Platform", value=f"{'Mobile' if member.is_on_mobile() else 'PC'}", inline=False)
    embed.add_field(name="Admin?", value=f"{member.guild_permissions.administrator}", inline=True)
    embed.add_field(name='Bot?', value=f"{'Bot' if member.bot else 'Human'}", inline=True)

    await ctx.send(embed=embed)

通用排查方案

如果还有其他命令也存在无输出无报错的问题,添加全局错误监听把报错打印出来:

@bot.event
async def on_command_error(ctx, error):
    print(f"命令 {ctx.command} 执行出错:{error}")
    # 可选:把报错发到频道方便调试
    await ctx.send(f"命令执行出错:{error}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:54:03