Skip to content

Repository files navigation

velog2tistory

License: MIT Python Playwright Platform PRs Welcome Maintenance

Velog 글을 Tistory로 자동 이전하는 스크립트
본문, 이미지, 최신순 발행까지 그대로 서빙합니다 💁‍♂️


Contents (목차)


Overview

Velog에서 Tistory로 블로그를 옮길 때, 글을 하나하나 복붙 하는 번거로운 과정을 자동화하기 위해 시작한 OSS 프로젝트입니다.

  • 본문: Velog GraphQL API로 전체 글을 마크다운으로 추출
  • 이미지: Velog 이미지를 GitHub로 옮겨 jsDelivr CDN으로 서빙
  • 발행: Playwright로 Tistory 에디터를 조작해 마크다운 그대로 발행

왜 브라우저 자동화인가? Tistory Open API가 2024년에 종료되어, 글을 자동으로 발행하는 공식 경로가 없기 때문에 차선책으로 발행 단계는 사람이 에디터를 쓰는 것을 흉내 내는 Playwright 우회 방식으로 동작합니다.

Pipeline

1. 추출              2. 이미지               3. 발행
Velog GraphQL   ->   다운로드 + GitHub    ->  Playwright로
   *.md 저장          + jsDelivr 링크 치환      Tistory 에디터 발행
단계 스크립트 자동화 수준
1. 추출 1_export_velog.py 완전 자동
2. 이미지 재호스팅 2_rehost_images.py 완전 자동
3. 로그인 세션 저장 3_login_tistory.py 최초 1회 수동 로그인 필요
4. 발행 4_publish_tistory.py 반자동 (세션 재사용)

Requirements

  • Python 3.9 이상
  • 기존 본인 Velog 계정
  • 기존 본인 Tistory 계정
  • 이미지 호스팅용 public GitHub 저장소

Installation

git clone https://github.com/yooncandooit/velog2tistory.git
cd velog2tistory

pip install -r requirements.txt
playwright install chromium

Configuration

config.example.py를 복사해 config.py를 만들고 값을 채웁니다. (config.py.gitignore에 포함되어 커밋되지 않고 본인 로컬에만 저장되어 개인정보가 보호됩니다.)

cp config.example.py config.py
항목 설명
VELOG_USERNAME Velog 아이디 (velog.io/@아이디)
TISTORY_BLOG Tistory 서브도메인 (서브도메인.tistory.com)
GH_USER / GH_REPO / GH_BRANCH 이미지 호스팅용 public GitHub 저장소
PUBLISH_DELAY_SEC 글 사이 발행 간격(초). (너무 짧으면 어뷰징으로 오인될 수 있습니다)
HEADLESS True면 브라우저 창 없이 실행. 처음엔 False 권장

!! 주의 !!: 이미지 저장소는 반드시 public이어야 합니다. jsDelivr와 GitHub raw는 private 저장소의 파일을 서빙하지 않습니다.

Usage

아래 순서대로 실행합니다.

# 1) Velog 전체 글 추출 -> velog_export/*.md
python 1_export_velog.py

# 2) 이미지 다운로드 + CDN 링크 치환 + GitHub push
python 2_rehost_images.py

# 3) Tistory 로그인 세션 저장 (최초 1회)
python 3_login_tistory.py

# 4) 발행 전 먼저 하나만 테스트!
python 4_publish_tistory.py --limit 1

# 검증되면 전체 발행 (글마다 확인하며 진행하려면 --confirm 옵션 사용)
python 4_publish_tistory.py --confirm

발행 옵션

옵션 설명
--limit N 앞에서 N개만 발행
--start N N번째 글부터 발행 (0부터 시작)
--confirm 글마다 발행 직전에 멈추고 확인

글은 작성일 기준 오름차순(오래된 글 → 최근 글)으로 발행되어, Tistory에서도 시간 순서가 유지됩니다.

(Updated) 새 글만 이어서 발행하기

발행에 성공한 글은 published.json에 기록되고, 다음 실행 때 자동으로 건너뜁니다. 따라서 Velog에 새 글을 쓴 뒤에는 같은 명령을 다시 실행하기만 하면 새 글만 올라갑니다.

python 1_export_velog.py                # 새 글 포함 재추출
python 2_rehost_images.py               # 새 이미지만 처리
python 4_publish_tistory.py --dry-run   # 어떤 글이 올라갈지 미리 확인
python 4_publish_tistory.py             # 새 글만 발행

기록은 파일명(slug) 기준이며, 발행에 실제로 성공한 글만 추가됩니다. 본문이 비었거나 도중에 실패한 글은 기록되지 않아 다음 실행 때 다시 시도합니다.

published.json은 로컬 발행 상태라 .gitignore에 포함되어 있습니다. 이 파일을 지우면 모든 글이 다시 발행 대상이 되니 주의하세요.

이미 올라갔지만, 이슈가 발생해서 다시 발행하고 싶은 글이 있다면, published.json에서 해당 글의 제목을 삭제한 후 다시 발행(python 4_publish_tistory.py) 해주세요.

이미 수동으로 옮긴 글이 있다면, 아래처럼 현재 글 전체를 발행 완료로 표시한 뒤 새 글부터 이어갈 수 있습니다.

python -c "import json, glob, os; json.dump(sorted(os.path.splitext(os.path.basename(f))[0] for f in glob.glob('velog_export/*.md')), open('published.json','w'), ensure_ascii=False, indent=2)"

Troubleshooting & FAQ

마크다운 문법(#, **)이 그대로 노출돼요

마크다운 모드 전환이 실제로는 안 된 채 발행된 경우입니다. 전환 시 뜨는 네이티브 확인창을 스크립트가 자동 수락하도록 되어 있는데, 에디터 UI가 바뀌면 이 부분이 깨질 수 있습니다. --limit 1로 실행해 로그와 화면을 확인하세요.

발행하면 본문이 비어 있어요

에디터에 값은 들어갔지만 Tistory의 저장 필드에 동기화되지 않은 경우입니다. 해당 프로젝트에서는 프로그래밍 주입 대신 실제 키보드 입력으로 본문을 채워 이를 방지하도록 수정했습니다. 그래도 발생하면 github issues에 등록해주세요!

이미지가 404로 안 떠요

이미지 저장소가 private이면 jsDelivr가 서빙하지 못합니다. 저장소를 public으로 바꿔주세요. 방금 public으로 전환했다면 CDN 캐시가 갱신될 때까지 몇 분 기다린 후 다시 시도해주세요!

셀렉터를 못 찾는다는 에러가 나요

Tistory 에디터 DOM이 바뀌면 셀렉터가 어긋날 수 있습니다. python 4_publish_tistory.py --limit 1 로 실행하면 브라우저가 열린 채 멈추므로, Playwright Inspector의 Pick locator로 실제 셀렉터를 확인해 수정하거나 github issues로 남겨주시면 확인 후 수정하겠습니다!

🌱 Contributing

Known Limitations

  • 공식 자동화 프로그램이 아니고 우회해서 사용한 방식이기 때문에, 이후에 Tistory 에디터 UI가 변경되면 셀렉터가 깨질 수 있습니다.
  • 이미지는 Velog CDN에서 내려받아 GitHub로 재호스팅하며, Tistory 자체 이미지 서버로는 올리지 않습니다.
  • 대량 연속 발행은 어뷰징으로 오인될 수 있으니 PUBLISH_DELAY_SEC를 충분히 둬 주세요.

버그나 개선점을 발견하면 이슈를 남겨주세요! 특히 Tistory 에디터 셀렉터 변경은 재현 환경(브라우저, 날짜)와 함께 알려주시면 빠르게 대응할 수 있으며, PR도 환영합니다. 🙂

Disclaimer

이 도구는 본인 계정에서 본인이 작성한 글을 이전/백업하는 개인 용도로 만들어졌습니다. 브라우저 자동화를 사용하므로, 각 플랫폼의 이용약관 확인과 준수 책임은 사용자에게 있습니다. 본 소프트웨어는 "있는 그대로(as-is)" 제공되며, 사용으로 발생하는 어떤 문제에 대해서도 저작자는 책임지지 않습니다.

License

MIT © 2026 yooncandooit

About

Velog 글을 Tistory로 자동 이전하는 자동화 스크립트

Resources

Contributing

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages