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

discord.py中为bot.listen事件命名实现日志Embed复用的方法

核心错误说明

你对@bot.listen()的name参数作用理解有误:该参数是用来指定监听的Discord原生事件名,并非用于传递自定义业务标签。你将其设为complexity时,这个监听器根本不会被触发——discord.py仅会在收到对应名称的网关事件时调用监听器,消息事件的固定标识为on_message,随意修改该参数只会导致监听器失效。

正确实现方案

直接给日志函数增加自定义标题的入参即可,不需要修改监听器的原生参数,后续复用时只要给不同监听器传入不同的标题值就能共用一套日志逻辑。

修正后的代码

bot.py

import discord
from discord.ext import commands
import os
from dotenv import load_dotenv
from datetime import datetime
import loging

load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")

bot = commands.Bot(command_prefix=commands.when_mentioned_or("$"), help_command=None)

# 不指定name参数时,会自动根据函数名on_message识别监听消息事件
@bot.listen()
async def on_message(message):
    if any(x in message.content.lower() for x in ["complexity", "complex"]):
        await message.add_reaction(r":complexity:945474998208958517")
        # 传入当前场景要显示的自定义标题
        await loging.meslog(bot, message, event_title="Complexity关键词触发")

# 其他场景可以直接复用日志函数,传入不同标题即可
# 示例:消息删除日志
@bot.listen()
async def on_message_delete(message):
    await loging.meslog(bot, message, event_title="消息删除记录")

bot.run(TOKEN)

loging.py

import discord
from datetime import datetime

async def meslog(bot, message, event_title: str):
    username = message.author
    usernameid = str(message.author.id)
    messagein = str(message.content)
    messageid = str(message.id)
    channel = channelid = channelping = None
    if message.guild:
        channel = message.channel.name
        channelid = str(message.channel.id)
        channelping = message.channel.mention
    
    logingchan = await bot.fetch_channel(983811124929630239)
    # 时间必须在函数内实时生成,写在全局会导致所有日志显示模块加载时的固定时间
    timenow = datetime.now().strftime(r"%x, %X")
    em = discord.Embed(title=event_title, description=timenow, color=0x00FF00)
    # v2+版本discord.py请用avatar.url替代已废弃的avatar_url
    em.set_thumbnail(url=username.avatar.url)
    em.add_field(name="Channel:", value=f"{channelping} \n{channelid}", inline=True)
    em.add_field(name="User:", value=f"{username}\n{usernameid}", inline=True)
    em.add_field(name="Message:", value=f"{messagein}\n{messageid}", inline=False)
    await logingchan.send(embed=em)

额外注意点

  • 原代码中大量冗余导入(未使用的http.client、asyncio、重复导入的time、未用到的时间相关类)可以直接删除,不影响功能。
  • 不要把时间戳生成逻辑写在全局作用域,否则所有日志都会显示bot启动/模块导入时的固定时间,而非事件实际触发时间。
  • 若你使用2.0及以上版本discord.py,原代码的avatar_url属性已被废弃,需替换为avatar.url避免报错。

内容的提问来源于stack exchange,提问作者ΛSUKΛ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:00:56