共计 1640 个字符,预计需要花费 5 分钟才能阅读完成。
典型应用场景
ChatGPT 对话导出功能广泛应用于知识管理场景,例如将技术讨论记录转化为可检索的文档库。内容创作者也常需要导出对话历史进行二次编辑,形成教程或社交媒体素材。

技术方案选型
官方 API vs 逆向工程
- 官方 API 方案
- 优势:合法合规、文档完善、长期维护
-
劣势:存在调用频率限制(每分钟 3 - 5 次),需要处理分页数据
-
逆向工程方案
- 优势:可绕过部分限制
- 劣势:违反服务条款、存在法律风险、需应对前端变更
- 结论:推荐使用官方 API 保证可持续性
Python+FastAPI 实现步骤
- 环境准备
- 安装依赖:
pip install fastapi openai python-dotenv -
创建
.env文件存储 API 密钥 -
核心代码结构
# app/main.py import os from fastapi import FastAPI from dotenv import load_dotenv load_dotenv() app = FastAPI() @app.get("/export") async def export_conversation(): # 实现代码见下文 pass -
分页获取策略
- 使用
limit和after参数实现游标分页 - 合并策略:维护全局列表,循环请求直到返回空数据
完整代码实现
# 带行号的完整实现(节选)01 import aiohttp
02 from typing import List, Optional
03
04 async def fetch_messages(
05 session: aiohttp.ClientSession,
06 after: Optional[str] = None
07 ) -> List[dict]:
08 params = {"limit": 100}
09 if after:
10 params["after"] = after
11
12 async with session.get(
13 "https://api.openai.com/v1/conversations",
14 headers={"Authorization": f"Bearer {os.getenv('API_KEY')}"},
15 params=params
16 ) as resp:
17 if resp.status != 200:
18 raise ValueError(f"API error: {await resp.text()}")
19 return await resp.json()
20
21 def format_markdown(messages: List[dict]) -> str:
22 return "\n".join(23 f"**{msg['role']}**: {msg['content']}"
24 for msg in messages
25 )
安全注意事项
- 频率限制应对
- 实现指数退避重试机制
- 添加请求间隔延迟(建议≥200ms)
-
使用本地缓存减少重复请求
-
敏感信息过滤
def sanitize_content(text: str) -> str: patterns = [r"\d{4}-\d{4}-\d{4}-\d{4}", # 信用卡号 r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" # 邮箱 ] for pattern in patterns: text = re.sub(pattern, "[REDACTED]", text) return text
性能优化实践
- 异步 IO 优化
- 使用
aiohttp替代requests -
并行处理格式转换与网络请求
-
内存管理
- 分块处理大型对话历史
- 使用生成器替代列表存储
实践任务
- 基础任务
- 扩展支持 Excel 格式导出
-
实现按时间范围过滤对话
-
进阶挑战
- 设计增量导出机制
- 比较同步 / 异步模式在 1000 条对话下的性能差异(测试环境:4 核 CPU/8GB 内存)
经验总结
处理 API 分页时建议始终检查 has_more 字段,部分旧版 API 可能返回next_cursor。实际测试发现,包含图片的对话内容需要特殊处理,否则会导致 Markdown 格式错乱。对于企业级应用,建议增加 Redis 缓存层降低 API 调用压力。
正文完
