优雅导出 DeepSeek 对话记录,支持 JSON 和 Markdown 格式。Elegantly export DeepSeek conversation records, supporting JSON and Markdown formats.
< 脚本 DeepSeek 对话导出器 | DeepSeek Conversation Exporter Plus 的反馈
把原代码中的这个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');
}
大赞!多谢多谢KONG Sanon,完美解决!比心😘
把原代码中的这个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格式的对话内容。
deepseek网页版更新了,不能用了,这个插件真的很好用,离不开了,希望更新一下,期盼……