如何在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)
关键说明
- 审计日志查询:通过
guild.audit_logs指定动作类型为AuditLogAction.channel_create,限制查询条数为1,确保只获取最新的创建记录。 - 匹配频道:对比日志条目的
target.id和当前频道ID,避免同时创建多个频道时匹配错误。 - 权限处理:捕获
disnake.Forbidden异常,防止机器人无审计日志查看权限时崩溃。 - 容错处理:若无法获取创建者信息,显示默认文本;同时判断日志频道是否存在,避免发送失败。
内容的提问来源于stack exchange,提问作者LoL Cheat
相关产品推荐
相关产品推荐

