DeepSeek 对话导出器 | DeepSeek Conversation Exporter Plus

优雅导出 DeepSeek 对话记录,支持 JSON 和 Markdown 格式。Elegantly export DeepSeek conversation records, supporting JSON and Markdown formats.

< 脚本 DeepSeek 对话导出器 | DeepSeek Conversation Exporter Plus 的反馈

评价:好评 - 脚本运行良好

§
发布于:2025-09-05

deepseek网页版更新了,不能用了,这个插件真的很好用,离不开了,希望更新一下,期盼……

§
发布于:2025-09-10

把原代码中的这个function convertJsonToMd(data) 函数换成下面的代码:

function convertJsonToMd(data) {
    let mdContent = [];
    // 从新结构中获取对话标题
    const title = data.data.biz_data.chat_session.title || 'Untitled Chat';

    // 根据parent_id模式过滤消息
    const filteredMessages = filterMessagesByParentIdMode(data.data.biz_data.chat_messages);

    // 计算总token使用量
    const totalTokens = filteredMessages.reduce((acc, msg) => acc + msg.accumulated_token_usage, 0);
    mdContent.push(`# DeepSeek - ${title} (Total Tokens: ${totalTokens})\n`);

    filteredMessages.forEach(msg => {
        // 确定消息角色(用户/助手)
        const role = msg.role === 'USER' ? 'Human' : 'Assistant';
        mdContent.push(`### ${role}`);

        // 格式化时间戳(将秒级时间戳转换为ISO格式)
        const timestamp = new Date(msg.inserted_at * 1000).toISOString();
        mdContent.push(`*${timestamp}*\n`);

        // 处理文件信息(如果有)
        if (msg.files && msg.files.length > 0) {
            msg.files.forEach(file => {
                const insertTime = new Date(file.inserted_at * 1000).toISOString();
                const updateTime = new Date(file.updated_at * 1000).toISOString();
                mdContent.push(`### File Information`);
                mdContent.push(`- Name: ${file.file_name}`);
                mdContent.push(`- Size: ${file.file_size} bytes`);
                mdContent.push(`- Token Usage: ${file.token_usage}`);
                mdContent.push(`- Upload Time: ${insertTime}`);
                mdContent.push(`- Last Update: ${updateTime}\n`);
            });
        }

        // 从fragments中提取内容(适配新结构)
        let content = '';
        let thinkingContent = '';
        let thinkingTime = 0;

        if (msg.fragments && msg.fragments.length > 0) {
            msg.fragments.forEach(fragment => {
                // 收集用户请求或助手回复内容
                if (fragment.type === 'RESPONSE' || fragment.type === 'REQUEST') {
                    content += fragment.content + '\n';
                }
                // 收集思考过程内容
                if (fragment.type === 'THINK') {
                    thinkingContent = fragment.content;
                    thinkingTime = fragment.elapsed_secs || 0;
                }
            });
        }

        // 处理引用内容(如果有)
        if (msg.search_results && msg.search_results.length > 0) {
            const citations = {};
            msg.search_results.forEach((result, index) => {
                if (result.cite_index !== null) {
                    citations[result.cite_index] = result.url;
                }
            });
            content = content.replace(/\[citation:(\d+)\]/g, (match, p1) => {
                const url = citations[parseInt(p1)];
                return url ? ` [${p1}](${url})` : match;
            });
            content = content.replace(/\s+,/g, ',').replace(/\s+\./g, '.');
        }

        // 处理思考内容显示(如果启用)
        if (state.includeThinking && thinkingContent) {
            const thinkingTimeText = thinkingTime ? `(${thinkingTime.toFixed(2)}s)` : '';
            content = `\n> **Thinking Process ${thinkingTimeText}:**\n> ${thinkingContent.replace(/\n/g, '\n> ')}\n\n` + content;
        }

        // 处理数学公式格式
        content = content.replace(/\$\$(.*?)\$\$/gs, (match, formula) => {
            return formula.includes('\n') ? `\n$\n${formula}\n$\n` : `$${formula}$`;
        });

        mdContent.push(content + '\n');
    });

    return mdContent.join('\n');
}

§
发布于:2025-09-19

大赞!多谢多谢KONG Sanon,完美解决!比心😘

§
发布于:2025-10-31

把原代码中的这个function convertJsonToMd(data) 函数换成下面的代码:

function convertJsonToMd(data) {
    let mdContent = [];
    // 从新结构中获取对话标题
    const title = data.data.biz_data.chat_session.title || 'Untitled Chat';

    // 根据parent_id模式过滤消息
    const filteredMessages = filterMessagesByParentIdMode(data.data.biz_data.chat_messages);

    // 计算总token使用量
    const totalTokens = filteredMessages.reduce((acc, msg) => acc + msg.accumulated_token_usage, 0);
    mdContent.push(`# DeepSeek - ${title} (Total Tokens: ${totalTokens})\n`);

    filteredMessages.forEach(msg => {
        // 确定消息角色(用户/助手)
        const role = msg.role === 'USER' ? 'Human' : 'Assistant';
        mdContent.push(`### ${role}`);

        // 格式化时间戳(将秒级时间戳转换为ISO格式)
        const timestamp = new Date(msg.inserted_at * 1000).toISOString();
        mdContent.push(`*${timestamp}*\n`);

        // 处理文件信息(如果有)
        if (msg.files && msg.files.length > 0) {
            msg.files.forEach(file => {
                const insertTime = new Date(file.inserted_at * 1000).toISOString();
                const updateTime = new Date(file.updated_at * 1000).toISOString();
                mdContent.push(`### File Information`);
                mdContent.push(`- Name: ${file.file_name}`);
                mdContent.push(`- Size: ${file.file_size} bytes`);
                mdContent.push(`- Token Usage: ${file.token_usage}`);
                mdContent.push(`- Upload Time: ${insertTime}`);
                mdContent.push(`- Last Update: ${updateTime}\n`);
            });
        }

        // 从fragments中提取内容(适配新结构)
        let content = '';
        let thinkingContent = '';
        let thinkingTime = 0;

        if (msg.fragments && msg.fragments.length > 0) {
            msg.fragments.forEach(fragment => {
                // 收集用户请求或助手回复内容
                if (fragment.type === 'RESPONSE' || fragment.type === 'REQUEST') {
                    content += fragment.content + '\n';
                }
                // 收集思考过程内容
                if (fragment.type === 'THINK') {
                    thinkingContent = fragment.content;
                    thinkingTime = fragment.elapsed_secs || 0;
                }
            });
        }

        // 处理引用内容(如果有)
        if (msg.search_results && msg.search_results.length > 0) {
            const citations = {};
            msg.search_results.forEach((result, index) => {
                if (result.cite_index !== null) {
                    citations[result.cite_index] = result.url;
                }
            });
            content = content.replace(/\[citation:(\d+)\]/g, (match, p1) => {
                const url = citations[parseInt(p1)];
                return url ? ` [${p1}](${url})` : match;
            });
            content = content.replace(/\s+,/g, ',').replace(/\s+\./g, '.');
        }

        // 处理思考内容显示(如果启用)
        if (state.includeThinking && thinkingContent) {
            const thinkingTimeText = thinkingTime ? `(${thinkingTime.toFixed(2)}s)` : '';
            content = `\n> **Thinking Process ${thinkingTimeText}:**\n> ${thinkingContent.replace(/\n/g, '\n> ')}\n\n` + content;
        }

        // 处理数学公式格式
        content = content.replace(/\$\$(.*?)\$\$/gs, (match, formula) => {
            return formula.includes('\n') ? `\n$\n${formula}\n$\n` : `$${formula}$`;
        });

        mdContent.push(content + '\n');
    });

    return mdContent.join('\n');
}

确认在V0.0.7版本,按指引,把原始脚本内此函数的代码用这个替换后,正常导出MD格式的对话内容。

发布留言

登录以发布留言。