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, 哈希完整性, 对话历史, 指数退避, 数字取证, 数据备份, 数据导出, 断点续传, 法律科技, 特征检测, 电子数据展示, 网络安全, 自动化脚本, 证据固定, 逆向工具, 逆向工程, 隐私保护