loucdg/chatgpt-forensic-exporter
GitHub: loucdg/chatgpt-forensic-exporter
一款专为数字取证设计的 ChatGPT 数据导出工具,通过自动化提取完整对话、项目及图像并提供哈希校验,解决官方导出功能不完整且耗时长的问题。
Stars: 8 | Forks: 0
# chatgpt-forensic-exporter
导出、归档并在法庭取证层面保留您完整的 ChatGPT 历史记录:对话、项目、生成的图像以及格式化的 PDF 记录,提供 SHA-256 完整性哈希和验证。
## 为什么会有这个项目
OpenAI 的内置导出功能需要 24-48 小时,只提供一个单一的 JSON 数据包,并且排除了图像。ChatGPT 侧边栏只显示最近活跃的项目,隐藏了其余的项目。本工具包使用 ChatGPT 的内部后端 API 枚举您账户中的**每一个**对话和项目,下载完整的消息历史记录,并生成带有逐文件完整性哈希的符合取证标准的导出结果。
专为以下人群打造:
- 需要带有监管链文档的证据级收集的**数字取证从业者**
- 需要对 AI 辅助工作产出进行合规导出的**法律和合规团队**
- **任何**想要对其 ChatGPT 数据进行完整、可验证备份的人
## 功能
- 通过多阶段 API 枚举实现**完整项目发现**(侧边栏分页 + 对话扫描回退)
- 从 ChatGPT 的树状对话格式中**完整提取消息**,包括编辑分支
- **团队/工作区支持**,自动检测 ChatGPT Team 和 Enterprise 计划的账户
- 对每个导出文件进行 **SHA-256 哈希处理**,用于完整性验证
- **导出后验证**脚本,用于根据清单验证所有哈希值
- **断点续传支持**:中断后重新运行,仅下载新的对话
- **速率限制处理**:在遇到 429 错误时自动进行指数退避重试
- 将导出的对话进行 **PDF 转换**,用于法律审查
- 包含元数据(时间戳、对话 ID、项目关联)的**单文件 JSON 导出**
- 用于对所有对话进行批量分析的 **CSV 汇总**
- 记录导出范围、时间和任何遗漏的**验证摘要**
- 针对所有 DALL-E 生成图像的**图像库导出**
## 脚本
| 脚本 | 用途 |
|---|---|
| `chatgpt_export_projects_api.py` | 导出所有项目对话,包括项目名称、gizmo ID 和完整消息内容 |
| `chatgpt_export_conversations_api.py` | 导出所有非项目(根)对话 |
| `chatgpt_download_images.py` | 从您的 ChatGPT 图像库下载所有生成的图像 |
| `chatgpt_json_to_pdf.py` | 将导出的 JSON 对话转换为格式化的 PDF,用于法律审查 |
| `verify.py` | 根据哈希清单验证所有导出文件的 SHA-256 完整性 |
## 前置条件
- **Python 3.10+**
- 用于浏览器自动化的 **Playwright**
- 用于生成 PDF 的 **ReportLab**(仅在需要使用 `chatgpt_json_to_pdf.py` 时需要)
- 系统中已安装 **Google Chrome**
## 设置
```
git clone https://github.com/loucdg/chatgpt-forensic-exporter.git
cd chatgpt-forensic-exporter
pip install -r requirements.txt
playwright install chromium
```
## 使用说明
### 步骤 1:启动带有远程调试功能的 Chrome
您必须首先关闭**所有** Chrome 窗口和后台进程。Chrome 仅接受第一个声明用户配置文件的进程上的 `--remote-debugging-port` 标志。如果已有后台实例在运行,该标志将被静默忽略。
**Windows (PowerShell):**
```
# 终止所有 Chrome 进程
taskkill /F /IM chrome.exe /T
Start-Sleep -Seconds 5
# 使用 debug port 启动
Start-Process -FilePath "C:\Program Files\Google\Chrome\Application\chrome.exe" -ArgumentList "--remote-debugging-port=9222"
```
如果 Chrome 仍然没有监听 9222 端口(通常发生在 Chrome 开启了“关闭 Google Chrome 后继续运行后台应用”设置,或者存在另一个配置文件锁时),请使用隔离的配置文件:
```
Start-Process -FilePath "C:\Program Files\Google\Chrome\Application\chrome.exe" -ArgumentList "--remote-debugging-port=9222","--user-data-dir=C:\temp\chrome-debug"
```
**macOS (终端):**
```
# 终止所有 Chrome 进程
pkill -f "Google Chrome"
sleep 3
# 使用 debug port 启动
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222
```
使用隔离配置文件:
```
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug
```
**Linux (终端):**
```
# 终止所有 Chrome 进程
pkill chrome
sleep 3
# 使用 debug port 启动
google-chrome --remote-debugging-port=9222
```
使用隔离配置文件:
```
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug
```
### 步骤 2:验证调试端口
打开一个**单独的**终端(不要关闭 Chrome):
**Windows (PowerShell):**
```
Invoke-WebRequest -Uri "http://127.0.0.1:9222/json/version" -UseBasicParsing
```
**macOS / Linux:**
```
curl http://127.0.0.1:9222/json/version
```
您应该会得到一个包含 Chrome 版本信息的 JSON 响应。如果出现“connection refused”,请参阅下面的故障排除部分。
### 步骤 3:登录 ChatGPT
在打开的 Chrome 窗口中,导航到 [chatgpt.com](https://chatgpt.com) 并登录。确保您能看到包含对话的侧边栏。
### 步骤 4:运行导出脚本
```
# 导出所有项目对话(从之前的运行恢复)
python chatgpt_export_projects_api.py
# 按编号导出特定项目(在发现后显示)
python chatgpt_export_projects_api.py -p 3
# 导出所有非项目对话
python chatgpt_export_conversations_api.py
# 限制为前 50 个对话
python chatgpt_export_conversations_api.py -n 50
# 下载所有生成的图片
python chatgpt_download_images.py
# 仅下载前 100 张图片
python chatgpt_download_images.py -n 100
# 强制重新下载所有内容(忽略之前导出的文件)
python chatgpt_export_projects_api.py --force
python chatgpt_export_conversations_api.py --force
python chatgpt_download_images.py --no-skip
```
### 步骤 5:转换为 PDF (可选)
将导出的 JSON 对话转换为适合法律审查的格式化 PDF:
```
# 转换单个对话
python chatgpt_json_to_pdf.py chatgpt_projects_export_api/00001_Conversation.json
# 使用自定义输出路径转换单个对话
python chatgpt_json_to_pdf.py input.json output.pdf
# 批量转换目录中的所有 JSON 文件
python chatgpt_json_to_pdf.py chatgpt_projects_export_api/
python chatgpt_json_to_pdf.py chatgpt_conversations_export_api/
```
要自定义 PDF 中显示的角色标签(例如,将“User”替换为人名),请编辑脚本顶部的 `ROLE_LABELS` 字典:
```
ROLE_LABELS = {
"user": "Jane Smith", # change to the user's actual name
"assistant": "ChatGPT",
}
```
### 步骤 6:验证完整性
导出后,验证所有文件是否与其记录的 SHA-256 哈希值匹配:
```
# 自动检测并验证当前文件夹中的所有 export 目录
python verify.py
# 验证特定的 export 目录
python verify.py chatgpt_projects_export_api
# Verbose 模式:显示逐个文件的 pass/fail
python verify.py --verbose
```
示例输出:
```
========================================================================
CHATGPT FORENSIC EXPORTER - INTEGRITY VERIFICATION
========================================================================
Verification time: 2026-03-19 14:30:00
Working directory: C:\exports
[2026-03-19 14:30:00] Verifying: chatgpt_projects_export_api (manifest: projects_all_hashes.csv)
[2026-03-19 14:30:02] Result: PASS | Verified: 247 | Failed: 0 | Missing: 0 | Untracked: 0
[2026-03-19 14:30:02] Verifying: chatgpt_conversations_export_api (manifest: chatgpt_conversation_hashes.csv)
[2026-03-19 14:30:05] Result: PASS | Verified: 1040 | Failed: 0 | Missing: 0 | Untracked: 12
------------------------------------------------------------------------
SUMMARY
------------------------------------------------------------------------
Total files verified: 1287
Total hash mismatches: 0
Total missing files: 0
Total untracked files: 12
RESULT: ALL FILES VERIFIED SUCCESSFULLY
Note: 12 JSON file(s) on disk are not tracked in the hash manifest.
These may be from a subsequent run. Use --verbose to list them.
========================================================================
```
退出代码:`0` = 全部验证通过,`1` = 检测到失败,`2` = 未找到导出数据。
## 输出结构
### 项目导出 (`chatgpt_projects_export_api/`)
```
chatgpt_projects_export_api/
00001_Conversation_Title.json # Full conversation with messages
00002_Another_Chat.json
...
projects_all_messages.csv # All messages across all projects (flat)
projects_all_hashes.csv # SHA-256 hash per exported JSON file
project_summary.csv # Per-project conversation and message counts
export_verification_summary.txt # Scope, timing, gaps, and verification report
_debug_api_responses.json # Raw API responses for troubleshooting
_debug_accounts.json # Workspace/account detection results
```
### 对话导出 (`chatgpt_conversations_export_api/`)
```
chatgpt_conversations_export_api/
00001_Conversation_Title.json
...
chatgpt_messages.csv
chatgpt_conversation_hashes.csv
export_verification_summary.txt
```
### 图像导出 (`chatgpt_images_export/`)
```
chatgpt_images_export/
images/
00001_20260315_143022_prompt_snippet.webp
...
image_metadata.csv
image_library_metadata.json
image_export_summary.txt
```
### JSON 文件格式
每个对话 JSON 文件包含:
```
{
"conversation_id": "694c06b8-e784-8329-a41d-e602416c308c",
"project_name": "Work Project",
"gizmo_id": "g-p-69249f5814b481918cde961a71826d53",
"title": "Dashboard Design",
"create_time": 1710500000.0,
"update_time": 1710600000.0,
"scraped_at_utc": "2026-03-19T12:00:00+00:00",
"message_count": 42,
"messages": [
{
"index": 0,
"role": "user",
"text": "Help me design a leading indicators dashboard...",
"message_id": "abc123",
"create_time": 1710500000.0
},
{
"index": 1,
"role": "assistant",
"text": "Here is a structured approach...",
"message_id": "def456",
"create_time": 1710500005.0
}
]
}
```
## 取证考量
### 监管链
出于取证目的,请在导出时记录以下内容:
1. **谁**执行了收集(审查员姓名、凭据)
2. 收集**何时**开始和完成(验证摘要中的时间戳)
3. 收集了**什么**(项目摘要 CSV、对话计数)
4. 收集是**如何**进行的(本工具、版本、Chrome CDP 方法)
5. **完整性**验证结果(运行 `verify.py` 并保留输出)
### 完整性验证
每个导出的 JSON 文件在创建后立即使用 SHA-256 进行哈希处理。哈希值与源 URL 和时间戳一起记录在 `*_hashes.csv` 文件中。
`verify.py` 脚本会重新计算磁盘上所有文件的哈希值,并将它们与清单进行比较。它还会标记:
- 出现在清单中但不在磁盘上的**缺失文件**
- 导出后文件被修改导致的**哈希不匹配**
- 存在于磁盘上但不在清单中的**未跟踪文件**例如,来自后续导出运行)
### 本工具不做的事
- 它不捕获 DOM 截图或可视页面渲染
- 它不在 JSON 中保留 ChatGPT 的渲染格式(代码块、表格、LaTeX);请使用 PDF 转换器获取格式化输出
- 它不捕获已删除的对话(那些已从 OpenAI 的服务器上消失)
- 它不捕获临时的代码解释器沙箱文件(短暂存在的文件)
- 它不独立进行身份验证;它依赖于您现有的浏览器会话
- `create_time` 中的时间戳反映的是 ChatGPT 记录消息的时间,而不是本工具收集它的时间(收集时间在 `scraped_at_utc` 中)
### 团队/企业工作区
该工具通过 `/backend-api/accounts/check` 端点自动检测 ChatGPT Team 和 Enterprise 工作区 ID,并在 API 请求中包含 `ChatGPT-Account-Id` 标头。这是访问团队范围内的项目和对话所必需的。工作区检测结果将保存到 `_debug_accounts.json`。
## 故障排除
### “connect ECONNREFUSED 127.0.0.1:9222”
Chrome 未在调试端口上监听。最常见的原因是:
1. **后台 Chrome 进程占用了配置文件锁。** 结束所有 Chrome 进程(包括后台任务),等待 5 秒,然后使用 `--remote-debugging-port=9222` 重新启动。
2. **“关闭 Google Chrome 后继续运行后台应用”已启用。** 在 Chrome 设置 > 系统中禁用此选项。
3. **配置文件锁争用。** 使用 `--user-data-dir=C:\temp\chrome-debug`(或在 Mac/Linux 上使用 `/tmp/chrome-debug`)完全绕过配置文件锁。
### “Could not extract auth token”
您未在 Chrome 窗口中登录 ChatGPT,或者您的会话已过期。请重新登录并重新运行脚本。
### “API error 429: Too many requests”
脚本通过指数退避(5秒、10秒、20秒、40秒、80秒)自动处理此问题。如果您频繁遇到此错误,请增加脚本顶部的 `REQUEST_DELAY_SEC`。默认值为请求间隔 1.0 秒。
### 项目在发现过程中遗漏
该工具使用多阶段发现:侧边栏分页、多个 API 端点探测以及完整的对话扫描回退。请检查 `_debug_api_responses.json` 中的原始 API 输出。如果项目仍然遗漏,请携带调试输出提交问题(请先隐去任何敏感数据)。
### 崩溃或中断后恢复
所有导出脚本都会通过扫描输出目录中的现有 JSON 文件来自动检测之前下载的对话。只需重新运行相同的命令,它将跳过已导出的对话并继续处理剩余的对话。使用 `--force` 可覆盖此行为并重新下载所有内容。
## 许可证
MIT 许可证。详见 [LICENSE](LICENSE)。
## 免责声明
本工具使用了未经官方文档化的 ChatGPT 后端 API。这些端点不受 OpenAI 官方支持,可能随时更改,恕不另行通知。使用风险由您自行承担。本工具旨在导出您自己的数据,应在遵守 OpenAI 服务条款的前提下使用。
标签:API爬取, ChatGPT, DALL-E图片下载, JSON解析, PDF转换, Promptflow, SHA-256校验, 云资产清单, 合规审查, 后台API, 哈希完整性, 对话历史, 指数退避, 数字取证, 数据备份, 数据导出, 断点续传, 法律科技, 特征检测, 电子数据展示, 网络安全, 自动化脚本, 证据固定, 逆向工具, 逆向工程, 隐私保护