Repository navigation
Getting Started
한국어 | English
벤더가 준 원본 zip을 압축을 풀지 않고 그대로 아래 위치에 넣습니다 (이미 풀어서 넣어도 동작합니다).
data/
├── chatgpt/ # ChatGPT의 Data export zip을 그대로, 또는 압축을 푼 내용
├── gemini/ # Google Takeout zip을 그대로, 또는 압축을 푼 내용
└── claude/ # Claude(Anthropic)의 데이터 내보내기 zip을 그대로, 또는 압축을 푼 내용
run.py가 각 벤더 폴더에서 필요한 파일을 못 찾으면 그 폴더 안의 *.zip을 자동으로 그
자리에 풀어본 뒤 다시 찾습니다 (common/zip_extract.py). Google Takeout처럼 여러 파트
zip으로 쪼개져 있으면 전부 같은 폴더에 넣으면 됩니다 — 파트별로 순서 상관없이 풀려서
자연스럽게 합쳐집니다. 원본 zip 파일은 지우지 않습니다.
-
ChatGPT ("설정 → 데이터 제어 → 내보내기"로 받는 zip): 보통 폴더로 안 감싸져 있고
conversations.json,chat.html,file_*.dat등이 압축 최상위에 바로 나옵니다. 압축 해제 도구에 따라 폴더 하나로 한 번 더 감싸일 수도 있는데, 그 경우도 재귀 탐색으로 찾으므로 상관없습니다. -
Gemini (Google Takeout에서 "Gemini 앱"만 선택해서 받는 zip): 항상
Takeout/<서비스명>/처럼 한 겹 이상 감싸져 있고, 그 안에내 활동.html과 첨부 미디어 파일들이 나란히 들어있습니다.Takeout/폴더째로data/gemini/에 넣으면 됩니다 (하위 폴더를 직접 뒤져서 꺼낼 필요 없음). -
Claude ("설정 → 계정 → 데이터 내보내기"로 받는 zip): 압축 최상위에
conversations.json(프로젝트에 안 묶인 일반 대화 전체가 배열 하나로),design_chats/(프로젝트에 묶인 대화가 파일 하나당 하나씩),projects/(프로젝트 메타데이터, 있는 경우만) 등이 나옵니다. 계정 데이터가 많으면data-...-batch-0000.zip처럼 여러 파트로 나뉠 수 있는데, 현재는 파트 하나만 지원합니다 — 여러 파트를 같은 폴더에 풀면conversations.json/design_chats/가 파트끼리 서로 덮어써서 일부 대화가 누락될 수 있으므로, 파트가 여러 개라면 각 파트를 따로 처리해야 합니다.
python run.pydata/ 아래 존재가 감지되는 벤더만 자동으로 골라 실행합니다. 특정 벤더만 실행하려면
--vendor chatgpt, --vendor gemini, --vendor claude 중 하나를 지정합니다.
--dry-run을 붙이면 실제 파일을 만들지 않고 파싱 결과(세션 수, 스킵 수, 첨부파일 해석
성공/실패 수)만 콘솔에 출력합니다.
원본을 data/<vendor>/로 옮기고 싶지 않으면(예: 다운로드 폴더에 있는 zip을 그대로 쓰고
싶을 때) --input으로 위치를 직접 지정할 수 있습니다 — 코드 어디에도 실제 경로가
박혀있지 않고 매 실행마다 원하는 곳을 가리킬 수 있습니다:
python run.py --vendor gemini --input "gemini=C:\Users\me\Downloads\takeout.zip"폴더를 넘기면 그 폴더를 그대로 원본으로 쓰고(아무것도 복사/이동 안 함), .zip 파일을
넘기면 원본은 그대로 둔 채 내용만 data/<vendor>/에 풀어서 씁니다.
결과는 result/<vendor>/*.md (+ result/<vendor>/Attachments/)에 생성됩니다. Claude는
예외적으로 프로젝트에 묶인 대화만 result/claude/<프로젝트명>/*.md처럼 프로젝트별 하위
폴더에 생성되고, 프로젝트에 안 묶인 일반 대화는 다른 벤더와 동일하게
result/claude/*.md에 바로 생성됩니다.
검토가 끝났으면 --publish로 실제 Obsidian vault에 반영합니다 (경로 설정은
Configuration 참고).
python run.py --publish변환(2번)과 vault 반영(4번)을 분리해둔 이유는, 실제 PKM 저장소에 파일을 쓰는 건 되돌리기
까다로운 작업이라 result/를 먼저 검토할 수 있게 하기 위함입니다.
-
0: 정상 완료. -
1: 실행된 벤더가 하나도 없음 (data/<vendor>/에 아무것도 없음). -
2: 일부 벤더가 부분적으로만 성공함 (예:conversations-*.json중 하나가 깨져서 파싱 실패) — 콘솔의[경고]/⚠️로그를 확인해야 합니다. 자동화 스크립트에서 이 파이프라인을 호출한다면 반드시 종료 코드를 검사하세요.
런타임 파이프라인 자체는 표준 라이브러리만 사용합니다 (Python 3.10+). 외부 패키지 설치가 필요 없습니다. 테스트를 돌리려면 Development를 참고하세요.