共计 1353 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
手动导出 ChatGPT 对话历史时,开发者常遇到以下问题:

- 效率低下:网页端需逐条复制粘贴,超过 50 条对话时操作耗时
- 格式混乱:代码块和 Markdown 格式在纯文本粘贴后丢失结构
- 速率限制:连续操作可能触发风控机制导致临时封禁
- 数据不全:长对话可能因分页加载遗漏部分内容
技术方案选型
通过对比两种主流实现方式:
- 直接调用官方 API
- 优势:功能全面,支持最新特性
-
劣势:需处理分页、错误重试等底层逻辑
-
使用第三方封装库
- 优势:开发快捷,内置常用功能
- 劣势:灵活性差,版本更新滞后
最终选择 openai 官方库 +requests的组合方案,既保证功能完整性又保持灵活控制。
核心实现步骤
1. 认证与会话初始化
import openai
from datetime import datetime
# 初始化配置
def init_client(api_key):
openai.api_key = api_key
return openai.ChatCompletion
2. 分页获取对话历史
采用递归请求实现自动翻页:
- 首次请求携带默认 limit 参数
- 解析响应头中的
has_more字段 - 通过
after参数指定上一页最后一条记录的 ID
3. 数据清洗关键逻辑
特殊内容处理方案:
- 代码块:用三个反引号包裹并标注语言类型
- 表格:转换为 CSV 兼容的逗号分隔格式
- 数学公式:保留 LaTeX 原始语法
完整代码实现
import csv
import json
from typing import List, Dict
class ChatExporter:
def __init__(self, api_key: str):
self.client = init_client(api_key)
def export_to_json(self, messages: List[Dict], filename: str):
"""导出为带时间戳的 JSON 文件"""
with open(f"{filename}_{datetime.now().timestamp()}.json", 'w') as f:
json.dump({
'meta': {'export_time': datetime.now().isoformat(),
'count': len(messages)
},
'data': messages
}, f, indent=2)
# 其他格式导出方法类似...
生产环境注意事项
API 限速应对策略
- 实现指数退避重试机制
- 监控
x-ratelimit-remaining响应头 - 单线程保持请求间隔≥1 秒
数据安全建议
- 敏感字段过滤:在导出前移除 email/phone 等 PII 信息
- 本地加密:使用
cryptography库对文件进行 AES 加密 - 访问控制:设置导出文件权限为 600
常见问题解决方案
- 超时错误
- 现象:长时间请求无响应
-
修复:设置 requests 超时参数
timeout=(3.05, 27) -
编码异常
- 现象:特殊字符导致文件损坏
-
修复:统一使用
utf-8-sig编码写入文件 -
内存溢出
- 现象:导出超长对话时崩溃
- 修复:采用流式处理分块写入磁盘
优化方向思考
现有方案仍可改进的点:
- 如何实现增量同步只获取新消息?
- 是否应该添加对话内容摘要生成功能?
- 能否通过 CDN 加速大文件导出过程?
通过这个工具,我的团队每周节省约 5 小时人工导出时间。特别提醒:正式环境务必添加 API 调用监控,避免意外超额消耗配额。
正文完
