使用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
相关产品推荐
相关产品推荐

