如何编写代码将指定频道内的所有消息记录到本地文本文件中
原代码问题排查
- 单次仅拉取1条消息,无法获取全量频道记录
- Discord API单次拉取消息上限为100条,需循环分页拉取才能获取全部历史消息
- 调用
writeFile时未传入待写入的消息内容,路径转义错误,也未处理异步写入的错误逻辑 - 未引入Node.js内置
fs模块的相关方法,无法完成文件写入操作
适配discord.js v12的可用代码
const { writeFile } = require('fs').promises; module.exports = { name: 'log', description: "拉取指定频道所有消息并写入本地文本文件", async execute(message, args) { const targetChannelId = "907278968212824164"; const targetChannel = await client.channels.get(targetChannelId); if (!targetChannel) return console.error("未找到指定频道"); let allMessages = []; let lastMessageId = null; // 循环分页拉取所有消息,单次最多拉100条 while (true) { const fetchOptions = { limit: 100 }; if (lastMessageId) fetchOptions.before = lastMessageId; const fetchedMessages = await targetChannel.fetchMessages(fetchOptions); if (fetchedMessages.size === 0) break; allMessages = allMessages.concat(Array.from(fetchedMessages.values())); lastMessageId = fetchedMessages.last().id; } // 格式化消息内容,可根据需求调整格式 const logContent = allMessages.map(msg => `[${msg.createdAt.toLocaleString()}] ${msg.author.tag}: ${msg.content}\n` ).join(''); // 写入文件 await writeFile('./MessageLog.txt', logContent, 'utf-8'); console.log(`已成功写入${allMessages.length}条消息到MessageLog.txt`); } }
适配说明
- 如果使用discord.js v13及以上版本,将
fetchMessages替换为messages.fetch即可,其余逻辑通用 - 确保机器人拥有目标频道的「查看消息」「读取消息历史」权限
- 消息数量过多时拉取耗时较长,可按需添加进度提示逻辑
- 如需保存消息中的附件、嵌入内容等,可自行拓展
logContent的格式化逻辑
内容的提问来源于stack exchange,提问作者n0c7ur
相关产品推荐
相关产品推荐

