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

使用discord.py实现Discord服务器重复最新消息时self未定义报错如何解决

报错原因

你参考的代码是写在Discord.py Cog类中的写法,Cog类方法的第一个参数self指代类实例,但你用的是client.event注册的全局事件回调,没有定义self变量,所以触发了NameError。同时Discord.py v2.0及以上版本已经移除了flatten()方法,直接await频道历史查询就能拿到消息列表。

修复后的代码(你原本的实现逻辑)

假设你初始化客户端时定义的变量名为client,替换代码中的self为client即可:

@client.event
async def on_message(message):
    # 跳过机器人自身消息,避免循环触发
    if message.author.bot:
        return
    if message.content.startswith("mo.echo"):
        target_channel = client.get_channel(801451745875066950)
        # 直接await获取消息列表,无需调用flatten()
        msg_list = await target_channel.history(limit=1)
        latest_msg = msg_list[0]
        # 发送最新消息内容
        await target_channel.send(latest_msg.content)
        # 删除触发指令的消息
        await message.delete()
    # 如果你同时使用了commands扩展,需要保留这行处理其他指令
    await client.process_commands(message)

更优的echo指令实现

如果你需要的只是重复用户输入在mo.echo后面的文本,完全不需要拉取频道历史,直接从触发消息中提取内容即可,逻辑更简单稳定:

@client.event
async def on_message(message):
    if message.author.bot:
        return
    if message.content.startswith("mo.echo"):
        # 提取指令前缀后的内容,去除前后空格
        echo_content = message.content.removeprefix("mo.echo").strip()
        if echo_content:
            await message.channel.send(echo_content)
        await message.delete()
    await client.process_commands(message)

如果你使用的是discord.ext.commands.Bot实例,还可以直接用指令装饰器注册,代码更简洁:

@bot.command(name="echo")
async def echo(ctx, *, content):
    await ctx.send(content)
    await ctx.message.delete()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:24:04