Discord同步消息至Minecraft机器人的文件写入问题求助
Discord消息拉取功能故障解决方案
故障核心原因
文件不生成问题基本是以下三类原因导致:
- 命令未实际触发:
copy函数缺少命令装饰器、命令前缀输入错误、机器人未获得基础发言权限,导致函数根本没有执行。 - 路径匹配错误:使用相对路径
file.txt时,文件会生成在执行python命令的终端工作目录,而非main.py文件所在目录,导致找错文件位置。 - 执行过程静默报错:机器人缺少频道历史消息读取权限、未开启消息内容意图,导致拉取消息时抛出异常中断,代码未走到写文件的步骤,且没有抛出可见日志。
可直接复用的实现代码
提供两种实现,分别对应写txt文件、直接存内存变量两种需求:
import os import discord from discord.ext import commands # 自行替换为你的命令前缀、机器人Token bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.command(name="copy") async def copy(ctx): # 强制指定文件存储在main.py同级目录,彻底解决路径错位问题 file_save_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "discord_msg.txt") collected_messages = [] try: # 拉取当前频道最近1000条历史消息 async for msg in ctx.channel.history(limit=1000): # 过滤无正文的消息(纯附件、嵌入卡片类消息) if msg.content: collected_messages.append(f"[{msg.created_at.strftime('%Y-%m-%d %H:%M')}] {msg.author.display_name}: {msg.content}") # 写入txt文件 with open(file_save_path, "w", encoding="utf-8") as f: f.write("\n".join(collected_messages)) # 执行完成后在频道返回提示,确认功能正常运行 await ctx.send(f"执行完成,共收集{len(collected_messages)}条有效消息,文件存储路径:{file_save_path}") except Exception as e: await ctx.send(f"执行失败,错误信息:{str(e)}") raise e @bot.event async def on_ready(): print(f"机器人已登录:{bot.user}") if __name__ == "__main__": bot.run("替换为你自己的机器人Token")
- 如果不需要落地txt文件,直接使用代码中的
collected_messages列表变量即可,该变量已经按顺序存储了所有拉取到的有效消息,可直接对接后续Minecraft聊天转发逻辑。
配置注意事项
- 必须在Discord开发者后台的机器人配置页,开启Message Content Intent、Server Members Intent两个权限开关,否则无法读取到消息正文,拉取到的content字段会是空值。
- 把机器人拉进服务器后,需要给机器人分配对应频道的「查看频道」「查看消息历史」「发送消息」权限,否则会触发权限拦截。
- 运行机器人时建议先cd到main.py所在目录,再执行
python main.py启动,进一步避免相对路径错位问题。
内容的提问来源于stack exchange,提问作者Sasoon
相关产品推荐
相关产品推荐

