共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在技术文档归档、客服记录分析等场景中,开发者经常需要导出 ChatGPT 的对话记录。现有的方案主要是通过截图或复制粘贴,但这些方法存在明显的缺陷:

- 效率低 :手动操作耗时耗力,不适合批量处理
- 格式混乱 :复制的内容可能丢失原有的结构化信息
- 隐私风险 :敏感信息可能被意外保存在剪贴板或截图中
技术方案对比
| 方案类型 | 优点 | 缺点 |
|---|---|---|
| 浏览器插件方案 | 使用方便 | 功能受限,跨浏览器兼容性差 |
| 服务端方案 | 处理能力强 | 需要服务器资源,延迟高 |
| 本地工具方案 | 隐私性好,性能高 | 需要安装环境 |
我们选择 Node.js+TypeScript 的技术栈,因为:
- 跨平台支持(Windows/macOS/Linux)
- 完善的生态系统和类型安全
- 适合构建本地命令行工具
核心实现
1. 使用 Puppeteer 实现 DOM 解析
import puppeteer from 'puppeteer';
async function exportChats(url: string) {const browser = await puppeteer.launch();
const page = await browser.newPage();
// 使用 XPath 选择器定位对话元素
const chatXPath = '//div[contains(@class,"chat-message")]';
await page.goto(url);
const chats = await page.$x(chatXPath);
// 提取对话内容
const results = await Promise.all(chats.map(async (chat) => {return await chat.evaluate((el) => el.textContent);
})
);
await browser.close();
return results;
}
2. 数据清洗模块
function sanitizeContent(content: string): string {
// 移除邮箱和电话号码
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
const phoneRegex = /\+?\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/g;
return content
.replace(emailRegex, '[REDACTED_EMAIL]')
.replace(phoneRegex, '[REDACTED_PHONE]');
}
3. 本地加密存储
import {createCipheriv, randomBytes} from 'crypto';
import {promises as fs} from 'fs';
const encryptData = (data: string, key: Buffer): string => {const iv = randomBytes(16);
const cipher = createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');
return iv.toString('hex') + ':' + encrypted;
};
async function saveToFile(data: string, path: string) {const key = randomBytes(32); // AES-256 需要 32 字节密钥
const encrypted = encryptData(data, key);
await fs.writeFile(path, encrypted);
}
生产级考量
性能优化
对于万条对话记录,我们进行了分批次处理(每次 500 条),总耗时约 2 分钟。关键优化点:
- 使用 Puppeteer 的并发请求限制
- 实现对话内容的流式处理
- 启用内存缓存减少 DOM 查询
安全防护
function sanitizeHTML(input: string): string {
return input
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g,'"')
.replace(/'/g,''');
}
避坑指南
- 未处理对话分页 :ChatGPT 的对话可能分多页显示,需要检测和自动加载下一页
- 本地存储容量 :建议添加预警机制,当存储超过 50MB 时提醒用户
- API 限制 :注意 ChatGPT 的速率限制,适当添加延迟
开源实现
完整项目已开源在 GitHub:chatgpt-exporter。欢迎通过 PR 提交改进建议,特别是:
- 更多导出格式支持(Markdown/PDF)
- 图形界面版本
- 云存储集成
通过这个项目,开发者可以快速构建自己的对话导出工具,同时确保数据安全和隐私保护。
正文完
