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

如何在disnake的on_guild_channel_create事件中获取频道创建者?

如何在disnake的on_guild_channel_create事件中获取频道创建者并@提及

问题描述

我在disnake框架下编写了on_guild_channel_create事件处理代码,想要在Embed的"Responsible Moderator"字段中用member.mention标记频道创建者,但尝试用guild.get_member方法实现失败了。原代码如下:

@bot.event
async def on_guild_channel_create(channel):
    guild = channel.guild
    embed = disnake.Embed(color=disnake.Color.dark_gray(), title = "", description = f'`{channel.name}` **Was created**')
    embed.set_author(name=guild.name, icon_url=guild.icon.url)
    embed.add_field(name="", value=f':house: Created channel: `{channel.name}`', inline=False)
    embed.add_field(name=f"Responsible Moderator: {}", value = '')
    embed.set_footer(text=f"Legione Straniera • Date of creation: {datetime.now(tz=moscow_tz).strftime('%B %d, %Y %H:%M')}")
    await disnake.utils.get(channel.guild.text_channels, id=1240402311147290685).send(embed=embed)

解决方案

disnake的on_guild_channel_create事件参数里的channel对象本身不携带创建者信息,必须通过服务器审计日志查询最近的频道创建记录来获取执行者。以下是修改后的完整代码:

import disnake
from datetime import datetime
# 确保moscow_tz是你已定义的时区对象

@bot.event
async def on_guild_channel_create(channel):
    guild = channel.guild
    creator = None

    # 从审计日志查询频道创建者
    try:
        # 仅查询最近1条频道创建的审计日志
        async for entry in guild.audit_logs(action=disnake.AuditLogAction.channel_create, limit=1):
            # 匹配当前创建的频道,避免同时创建多个频道时出错
            if entry.target.id == channel.id:
                creator = entry.user
                break
    except disnake.Forbidden:
        # 机器人无查看审计日志权限时跳过
        pass

    # 构建Embed
    embed = disnake.Embed(color=disnake.Color.dark_gray(), description=f'`{channel.name}` **Was created**')
    embed.set_author(name=guild.name, icon_url=guild.icon.url)
    embed.add_field(name="", value=f':house: Created channel: `{channel.name}`', inline=False)
    
    # 设置创建者字段
    embed.add_field(
        name="Responsible Moderator:",
        value=creator.mention if creator else "无法获取创建者信息"
    )
    
    embed.set_footer(text=f"Legione Straniera • Date of creation: {datetime.now(tz=moscow_tz).strftime('%B %d, %Y %H:%M')}")
    
    # 发送到指定日志频道
    log_channel = disnake.utils.get(guild.text_channels, id=1240402311147290685)
    if log_channel:
        await log_channel.send(embed=embed)

关键说明

  1. 审计日志查询:通过guild.audit_logs指定动作类型为AuditLogAction.channel_create,限制查询条数为1,确保只获取最新的创建记录。
  2. 匹配频道:对比日志条目的target.id和当前频道ID,避免同时创建多个频道时匹配错误。
  3. 权限处理:捕获disnake.Forbidden异常,防止机器人无审计日志查看权限时崩溃。
  4. 容错处理:若无法获取创建者信息,显示默认文本;同时判断日志频道是否存在,避免发送失败。

内容的提问来源于stack exchange,提问作者LoL Cheat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:52:06