共计 1720 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在日常使用 ChatGPT 时,我们经常需要保存有价值的对话记录。比如技术讨论、学习笔记或是重要的工作沟通。虽然 ChatGPT 网页版提供了历史记录功能,但它有几个明显的不足:

- 只能单条导出,无法批量处理
- 导出的格式是纯文本,丢失了对话的上下文结构
- 没有排版和美化,阅读体验差
- 无法添加自定义元数据(如时间戳、会话标签)
技术方案对比
目前实现对话记录导出主要有三种方式:
- OpenAI 官方 API
- 优点:数据最完整,可获取原始对话结构
-
缺点:需要开发知识,API 调用有次数限制
-
浏览器插件
- 优点:一键操作,用户友好
-
缺点:功能有限,可能存在隐私风险
-
第三方服务
- 优点:开箱即用
- 缺点:需要信任服务提供商,可能收费
对于 PDF 生成库,常见的选择有:
- ReportLab:功能强大但学习曲线陡峭
- PyFPDF:轻量简单,适合基础需求
- WeasyPrint:支持 HTML 转 PDF,排版灵活
核心实现
1. 获取对话历史
import openai
# 配置你的 API 密钥
openai.api_key = 'your-api-key'
# 获取最近的对话记录
def get_chat_history(limit=20):
response = openai.ChatCompletion.list(
limit=limit,
order='desc' # 从最新开始获取
)
return response['data']
# 示例调用
history = get_chat_history(10)
2. 数据清洗
import re
def clean_markdown(text):
# 移除多余的换行符
text = re.sub(r'\n{3,}', '\n\n', text)
# 转义特殊字符
text = re.sub(r'([*_`~])', r'\\\1', text)
return text
3. PDF 生成
from fpdf import FPDF
class PDF(FPDF):
def header(self):
self.set_font('Arial', 'B', 12)
self.cell(0, 10, 'ChatGPT 对话记录', 0, 1, 'C')
def footer(self):
self.set_y(-15)
self.set_font('Arial', 'I', 8)
self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
def generate_pdf(history, filename):
pdf = PDF()
pdf.add_page()
pdf.add_font('NotoSans', '','NotoSansCJKsc-Regular.ttf', uni=True)
pdf.set_font('NotoSans', '', 10)
for chat in history:
role = '用户' if chat['role'] == 'user' else 'AI 助手'
pdf.cell(0, 10, f'{role}:', ln=1)
pdf.multi_cell(0, 8, chat['content'])
pdf.ln(5)
pdf.output(filename)
进阶优化
- 长对话分页
- 计算文本长度,超过阈值自动分页
-
添加连续页码和章节标记
-
元数据添加
# 在 PDF 类中添加 def add_metadata(self, session_id, date): self.set_creator('ChatGPT Exporter') self.set_title(f'Session {session_id}') self.set_subject(f'Chat on {date}') -
安全建议
- 使用环境变量存储 API 密钥
- 实现敏感词过滤功能
避坑指南
中文乱码解决方案
- 使用支持中文的字体(如文中的 Noto Sans)
- 确保文件保存为 UTF- 8 编码
- 在 PDF 生成前验证文本编码
性能优化
- 对大文档使用异步生成
- 实现进度回调函数
- 设置合理的超时时间
API 配额管理
- 实现简单的请求计数
- 添加延迟避免速率限制
- 考虑使用缓存机制
动手挑战
现在你已经掌握了基础导出功能,可以尝试扩展以下功能:
- 按主题自动分类对话记录(如技术、学习、娱乐)
- 添加关键词标记和搜索功能
- 实现定期自动归档
提示:可以考虑使用 NLP 库进行文本分类,或者基于对话元数据实现简单规则。
正文完
