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

Nextcord Cog内事件无响应求助:主文件正常但事件未触发

问题描述

我的Nextcord机器人在Cog中无法响应任何事件,在Cog外(如main.py)一切正常,但Cog内的事件既未注册也未被处理。机器人已拥有管理员权限。

Cog加载脚本

@client.event
async def on_ready():
    for filename in os.listdir('cogs'):
        if filename.endswith('.py'):
            try:
                client.load_extension(f'cogs.{filename[:-3]}')
            except Exception as exception:
                traceback.print_exc()
                log.log(exception)
                channel = client.get_channel(config.ERROR_LOG_CHANNEL_ID)
                embed = nextcord.Embed(title=f"Failed to load {filename[:-3]}.",
                                       description=f"{exception}")
                await channel.send(embed=embed)

Cog代码片段

import traceback
import asyncio
import nextcord
from nextcord.ext import commands
from static import config
from schildi import utils
import datetime
import os
from schildi import log


def user_action_embed(action: str, user: nextcord.Member, color: int, extra: str | None):
    embed = nextcord.Embed(title="Audit Log Eintrag erstellt", description=action,
                           timestamp=datetime.datetime.now(), color=color)
    embed.add_field(name="User", value=f"{user.mention} - {user.name}\n||{user.id}||", inline=False)
    if extra:
        embed.add_field(name="Zusatz", value=extra, inline=False)
    return embed


class log_listener(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_guild_audit_log_entry_create(self, entry: nextcord.AuditLogEntry):
        print(entry.action)
        log_channel = self.client.get_channel(config.AUDIT_LOG_CHANNEL)
        if entry.action == nextcord.AuditLogAction.thread_create:
            await log_channel.send(embed=user_action_embed(
                action="Thread create",
                user=entry.user,
                extra=f"{entry.extra.channel.mention}",
                color=0x3efa5e))
        if entry.action == nextcord.AuditLogAction.thread_delete:
            await log_channel.send(embed=user_action_embed(
                action="Thread delete",
                user=entry.user,
                extra=f"{entry.extra.channel.mention}",
                color=0x3efa5e))
        if entry.action == nextcord.AuditLogAction.thread_update:
            await log_channel.send(embed=user_action_embed(
                action="Thread create",
                user=entry.user,
                extra=f"{entry.extra.channel.mention}",
                color=0x3efa5e))


def setup(client):
    client.add_cog(log_listener(client))
问题排查与解决

1. 补全必要的网关意图

on_guild_audit_log_entry_create事件需要机器人开启两个特权网关意图:

  • 前往Discord开发者门户的机器人页面,找到Privileged Gateway Intents,开启Server Members Intent和Audit Log Intent
  • 初始化机器人时显式声明意图:
intents = nextcord.Intents.default()
intents.members = True
intents.audit_logs = True

client = commands.Bot(command_prefix="你的前缀", intents=intents)

2. 确认Cog已正确加载

在on_ready事件中添加加载日志,验证Cog是否成功加载:

@client.event
async def on_ready():
    print(f"已加载的Cogs: {list(client.cogs.keys())}")
    # 原加载Cogs的代码...

如果输出中没有log_listener,检查cogs文件夹路径是否正确、文件名是否符合Python模块命名规范,以及加载时是否有隐藏报错。

3. 验证事件触发条件

on_guild_audit_log_entry_create只会响应机器人启动后新产生的审核日志条目,测试时需要在机器人上线后,手动执行创建/删除/更新线程的操作,而非之前的历史操作。

4. 修正代码笔误

Cog中thread_update分支的action描述写错为"Thread create",虽然不影响事件触发,但建议修正为"Thread update"以保证日志准确性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:15