discord.py Bot加载Cog异常:命令失效且未显示在help命令中求助
Discord.py Cog加载问题:部分命令无法使用
运行discord.py Bot时发现,cogs文件夹中仅ping.py的Cog能完全正常工作,另一个IGBan的Cog虽然@commands.Cog.listener()的消息处理逻辑可以触发,但其中的igunban命令无法使用,也不会出现在默认的help命令中。以下是相关代码及解决方案:
相关代码
main.py
import asyncio import discord import os from discord.ext import commands intents = discord.Intents.all() bot = commands.Bot(command_prefix="!", intents=intents) async def loadext(): for filename in os.listdir("./cogs"): if filename.endswith(".py"): await bot.load_extension(f"cogs.{filename[:-3]}") async def main(): await loadext() await bot.start("TOKEN") asyncio.run(main())
cogs/ping.py
from discord.ext import commands class Ping(commands.Cog): def __init__(self, bot): self.bot = bot @commands.command() async def ping(self, ctx): await ctx.send(f"Pong! {round(self.bot.latency * 1000)}ms!") print(f"Bot latency is {round(self.bot.latency * 1000)}ms!") async def setup(bot): await bot.add_cog(Ping(bot))
cogs/IGBan.py
import discord from stuff import * from discord.ext import commands class IGBan(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_message(self, message): user = message.author guild = message.guild channel = message.channel content = message.content # 注意:fetch_user需要传入整数ID,不是字符串 user1 = await self.bot.fetch_user(1123271715984769044) user2 = await self.bot.fetch_user(847981083625914389) if content.startswith("!1"): reason = reason1 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!2"): reason = reason2 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!3"): reason = reason3 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!4"): reason = reason4 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!5"): reason = reason5 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!6"): reason = reason6 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) elif content.startswith("!7"): reason = reason7 if ":" in content: parts = content.split(":") username = parts[1] name = parts[2] email = parts[3] print( f"Mode: {reason} \n Username: {username} \n Name: {name} \n Email: {email}" ) embed = discord.Embed(title=f"⚡ Unban Mode: {reason}", color=0x8A3AB9) embed.set_author(name="Unban Request Sent Successfully!") embed.add_field(name="Username", value=f"{username}", inline=False) embed.add_field(name="Name", value=f"{name}", inline=False) embed.add_field(name="Email", value=f"{email}", inline=False) await channel.send(embed=embed) await user1.send(embed=embed) await user2.send(embed=embed) # 关键:添加这行代码让Bot处理命令 await self.bot.process_commands(message) @commands.command() @commands.has_role('Blue') async def igunban(self, ctx): embed = discord.Embed(title="Use for Following Reasons:", color=0x8A3AB9) embed.set_author(name="IG Unbanner") embed.add_field(name=f"[1] {reason1}", value="", inline=False) embed.add_field(name=f"[2] {reason2}", value="", inline=False) embed.add_field(name=f"[3] {reason3}", value="", inline=False) embed.add_field(name=f"[4] {reason4}", value="", inline=False) embed.add_field(name=f"[5] {reason5}", value="", inline=False) embed.add_field(name=f"[6] {reason6}", value="", inline=False) embed.add_field(name=f"[7] {reason7}", value="", inline=False) embed.add_field(name="** **", value="```Usage```", inline=False) embed.add_field( name="", value="```!reason:username:name:email```", inline=False ) embed.add_field(name="** **", value="```Example```", inline=False) embed.add_field( name="", value="```!7:John_doe:JohnDoe:JohnDoe@example.com```", inline=False ) await ctx.send(embed=embed) async def setup(bot): await bot.add_cog(IGBan(bot))
问题原因及修复方案
核心问题
- 自定义
on_message监听器会覆盖discord.py默认的消息处理流程,若不手动调用process_commands方法,Bot不会自动处理命令,导致所有命令被拦截。 fetch_user方法要求传入整数类型的用户ID,原代码传入字符串会引发错误,影响Cog正常运行。
修复步骤
在
IGBan的on_message方法末尾添加命令处理代码:await self.bot.process_commands(message)这行代码让Bot在完成自定义消息逻辑后,继续处理命令请求。
将
fetch_user的参数改为整数:user1 = await self.bot.fetch_user(1123271715984769044) user2 = await self.bot.fetch_user(847981083625914389)可选优化:对
content.split(":")的结果长度做检查,避免索引越界;添加try-except块捕获异常,防止单个逻辑出错导致整个Cog失效。
验证方法
- 重启Bot后,发送
!igunban命令,确认是否正常触发。 - 查看控制台输出,检查是否有报错信息,确保所有Cog成功加载。
内容的提问来源于stack exchange,提问作者Zeke Petherick
相关产品推荐
相关产品推荐

