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
相关产品推荐
相关产品推荐

