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

使用Discord.js与discord-fetch-all开发transcript命令格式化导出JSON消息

解决方案

核心实现思路为遍历拉取到的全量消息对象,提取需要的字段拼接为目标格式后,直接写入日志文件即可,无需序列化完整的消息冗余字段。

修改后可直接使用的代码

const Discord = require(`discord.js`);
const fetchAll = require('discord-fetch-all');
const fs = require('fs');
const path = require('path');

module.exports = {
    name: 'transcript',
    description: "logs the ticket transcript!",
    
    async execute(message, args) {
        const channel = message.channel;
        // 拉取全量消息
        const allMessages = await fetchAll.messages(channel, {
            reverseArray: true, 
            userOnly: false, 
            botOnly: false, 
            pinnedOnly: false, 
        });
        // 格式化每条消息为目标格式
        const formattedLogs = allMessages.map(msg => {
            // 时间戳可按需调整格式:直接用msg.createdTimestamp为毫秒数,用toISOString()为国际标准时间,toLocaleString()为本地可读时间
            const timestamp = new Date(msg.createdTimestamp).toLocaleString();
            // 这里AUTHOR字段如果要显示用户名直接替换为msg.author.username,需要保留ID就用msg.author.id
            const author = `${msg.author.username}(${msg.author.id})`;
            // 转义内容里的双引号避免破坏格式
            const content = msg.content.replace(/"/g, '\\"');
            return `${timestamp} | ${author}: "${content}"`;
        });
        // 按行拼接后写入日志文件,建议加.log/.txt后缀方便查看
        fs.writeFileSync(path.resolve(__dirname, `ticket.log`), formattedLogs.join('\n'));
    }
}

可选优化建议

  • 若需要保留附件、embed等特殊消息内容,可以在格式化逻辑中额外判断对应字段,补充到日志行末尾即可
  • 可以添加错误捕获逻辑,避免拉取消息、写入文件失败导致命令报错
  • 后续熟悉分批拉取逻辑后,可直接使用discord.js原生的channel.messages.fetch方法实现全量消息拉取,无需引入第三方依赖,实现逻辑也并不复杂:每次拉取100条,将最后一条消息的ID作为下一次拉取的after参数,直到拉取不到新消息为止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:27:02