Tistory Publish
티스토리 블로그 범용 자동 발행 스킬. 어떤 형식의 글이든 자동 발행할 수 있습니다.
Tistory Open API 종료(2024.02) 이후 유일한 자동화 경로인 브라우저 자동화를 제공합니다.
전제 조건
- - OpenClaw 브라우저 서비스 (Chrome CDP, 기본 port 18800)
- 티스토리 카카오 로그인 완료 (OpenClaw Chrome에서)
- Python 3 + Playwright (
pip install playwright) - Node.js 18+ (배너 생성 시, 선택)
- (선택) 카카오 자격증명 파일 — 로그인 세션 만료 시 복구용 (
scripts/login.sh --cred-file <경로>)
- JSON 형식:
{"email": "...", "password": "..."}
- 또는 key-value 형식:
email: ...\npassword: ...
-
publish.sh는 자격증명을 읽지 않음 (로그인은
login.sh에서만 처리)
구조
CODEBLOCK0
빠른 시작
CODEBLOCK1
발행 스크립트 옵션 (publish.sh)
| 옵션 | 필수 | 설명 |
|---|
| INLINECODE7 | ✅ | 글 제목 |
| INLINECODE8 |
✅ | 본문 HTML 파일 경로 |
|
--category | ✅ | 카테고리 이름 (에디터에 표시되는 이름 그대로) |
|
--template | | 템플릿 preset (mk-review, simple-post) |
|
--article-title | | mk-review용 기사 제목 (자동 날짜 접두사) |
|
--tags | | 쉼표 구분 태그 목록 |
|
--banner | | 배너 이미지 파일 경로 |
|
--blog | | 블로그 도메인 (기본: tistory.com 첫 번째 블로그) |
|
--cdp-port | | OpenClaw Chrome CDP 포트 (기본: 18800) |
|
--helper | | tistory-publish.js 경로 (기본: scripts/ 내) |
|
--private | | 비공개 발행 |
템플릿 preset
| 이름 | 카테고리 | 블로그 | 제목 형식 | 배너 |
|---|
| INLINECODE18 | (직접 지정) | (직접 지정) | (직접 지정) | 선택 |
자신만의 preset을 추가하려면 templates/ 아래에 폴더를 만들고 publish.sh --template <이름> 으로 사용하세요.
자동 처리 항목
스크립트가 순서대로 처리:
- 1. 새 글 페이지 열기
- JS 헬퍼 함수 주입
- 카테고리 선택 (ARIA combobox → Playwright click)
- 제목 입력 (base64 디코딩으로 한글 처리)
- 본문 HTML 삽입
- 배너 이미지 업로드 (첨부→사진 메뉴 → file input)
- OG 카드 생성 (placeholder URL → Enter 키 → 카드 렌더링)
- 대표이미지 설정
- 태그 등록
- 발행 (공개/비공개)
본문 HTML 작성 규칙
- -
<p data-ke-size="size16"> 태그 사용 - 단락 = 여러 문장 묶음 (
<p> 하나에 2~4문장) - OG 카드 위치: INLINECODE23
- 구분선: INLINECODE24
템플릿 추가하기
INLINECODE25 디렉토리에 새 폴더를 만들어 자신만의 워크플로우를 추가할 수 있습니다:
CODEBLOCK2
주요 JS 함수 (tistory-publish.js)
콘텐츠
- -
insertContent(html) — TinyMCE에 HTML 삽입 - INLINECODE28 — 구조화된 데이터 → HTML 변환
OG 카드
- -
getOGPlaceholders() — placeholder URL 목록 - INLINECODE30 — placeholder → URL 텍스트 교체
- INLINECODE31 — 카드 렌더링 확인
메타데이터
- -
setTags(tags[]) — 태그 등록 - INLINECODE33 — 대표이미지 설정
배너
- -
verifyBannerUpload() — 업로드 확인
알려진 제약
- -
isTrusted=false 이벤트 무시 → OG/태그에 우회 로직 필요 - 카테고리가 ARIA combobox → Playwright click 필요
- 대표이미지 셀렉터가 Tistory 업데이트마다 변경 가능
변경 이력
CHANGELOG.md 참조
Tistory 发布
Tistory 博客通用自动发布技能。可以自动发布任何格式的文章。
自 Tistory Open API 终止(2024年2月)以来,提供唯一的自动化路径——浏览器自动化。
前提条件
- - OpenClaw 浏览器服务(Chrome CDP,默认端口 18800)
- Tistory Kakao 登录完成(在 OpenClaw Chrome 中)
- Python 3 + Playwright(pip install playwright)
- Node.js 18+(生成横幅时,可选)
- (可选)Kakao 凭证文件 — 用于登录会话过期时恢复(scripts/login.sh --cred-file <路径>)
- JSON 格式:{email: ..., password: ...}
- 或键值格式:email: ...\npassword: ...
- publish.sh 不读取凭证(登录仅由 login.sh 处理)
结构
tistory-publish/
├── SKILL.md # 本文件
├── scripts/
│ ├── tistory-publish.js # 核心 — 编辑器操作函数集合
│ ├── publish.sh # 通用发布脚本
│ └── login.sh # Kakao 登录会话恢复
└── templates/
└── simple-post/ # 示例:简单文章发布
└── RUNBOOK.md
快速开始
bash
最简单的发布
bash scripts/publish.sh \
--title 文章标题 \
--body-file body.html \
--category 分类名称 \
--blog your-blog.tistory.com
每日经济评论(使用模板)
bash scripts/publish.sh \
--template mk-review \
--article-title 文章标题 \
--body-file body.html \
--banner /tmp/banner.jpg \
--tags 每日经济,经济新闻
横幅 + 标签 + 私密
bash scripts/publish.sh \
--title 文章标题 \
--body-file body.html \
--category 分类名称 \
--banner /tmp/banner.jpg \
--tags 标签1,标签2,标签3 \
--private
发布脚本选项(publish.sh)
| 选项 | 必需 | 说明 |
|---|
| --title | ✅ | 文章标题 |
| --body-file |
✅ | 正文 HTML 文件路径 |
| --category | ✅ | 分类名称(与编辑器中显示的名称一致) |
| --template | | 模板预设(mk-review, simple-post) |
| --article-title | | 用于 mk-review 的文章标题(自动添加日期前缀) |
| --tags | | 逗号分隔的标签列表 |
| --banner | | 横幅图片文件路径 |
| --blog | | 博客域名(默认:tistory.com 第一个博客) |
| --cdp-port | | OpenClaw Chrome CDP 端口(默认:18800) |
| --helper | | tistory-publish.js 路径(默认:scripts/ 目录内) |
| --private | | 私密发布 |
模板预设
| 名称 | 分类 | 博客 | 标题格式 | 横幅 |
|---|
| simple-post | (直接指定) | (直接指定) | (直接指定) | 可选 |
要添加自己的预设,请在 templates/ 下创建文件夹,并使用 publish.sh --template <名称>。
自动处理项目
脚本按顺序处理:
- 1. 打开新文章页面
- 注入 JS 辅助函数
- 选择分类(ARIA 组合框 → Playwright 点击)
- 输入标题(通过 base64 解码处理韩文)
- 插入正文 HTML
- 上传横幅图片(附件→照片菜单 → 文件输入)
- 生成 OG 卡片(占位符 URL → Enter 键 → 卡片渲染)
- 设置代表图片
- 注册标签
- 发布(公开/私密)
正文 HTML 编写规则
- - 使用
标签
- 段落 = 多个句子组合(一个
包含 2~4 个句子)
- OG 卡片位置:
- 分隔线:
添加模板
可以在 templates/ 目录下创建新文件夹,添加自己的工作流程:
templates/my-template/
├── RUNBOOK.md # 发布顺序
├── TEMPLATE.md # 稿件编写模板
└── banner.js # 横幅生成脚本(可选)
主要 JS 函数(tistory-publish.js)
内容
- - insertContent(html) — 将 HTML 插入 TinyMCE
- buildBlogHTML({intro, articles}) — 结构化数据 → HTML 转换
OG 卡片
- - getOGPlaceholders() — 占位符 URL 列表
- prepareOGPlaceholder(url) — 占位符 → URL 文本替换
- verifyOGCard(url) — 确认卡片渲染
元数据
- - setTags(tags[]) — 注册标签
- setRepresentImageFromEditor() — 设置代表图片
横幅
- - verifyBannerUpload() — 确认上传
已知限制
- - 忽略 isTrusted=false 事件 → OG/标签需要绕过逻辑
- 分类为 ARIA 组合框 → 需要 Playwright 点击
- 代表图片选择器可能随 Tistory 更新而改变
变更历史
请参考 CHANGELOG.md