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

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))

问题原因及修复方案

核心问题

  1. 自定义on_message监听器会覆盖discord.py默认的消息处理流程,若不手动调用process_commands方法,Bot不会自动处理命令,导致所有命令被拦截。
  2. fetch_user方法要求传入整数类型的用户ID,原代码传入字符串会引发错误,影响Cog正常运行。

修复步骤

  1. 在IGBan的on_message方法末尾添加命令处理代码:

    await self.bot.process_commands(message)
    

    这行代码让Bot在完成自定义消息逻辑后,继续处理命令请求。

  2. 将fetch_user的参数改为整数:

    user1 = await self.bot.fetch_user(1123271715984769044)
    user2 = await self.bot.fetch_user(847981083625914389)
    
  3. 可选优化:对content.split(":")的结果长度做检查,避免索引越界;添加try-except块捕获异常,防止单个逻辑出错导致整个Cog失效。

验证方法

  • 重启Bot后,发送!igunban命令,确认是否正常触发。
  • 查看控制台输出,检查是否有报错信息,确保所有Cog成功加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:25:54