---
name: blog-publish-tistory
version: 1.0.0
description: |
  티스토리 블로그 자동 발행 (BlogAuto). 쿠키 기반 인증으로 내부 관리 API를 통해 티스토리 포스트를 발행/임시저장.
  Use when: 티스토리 발행, 티스토리 글 올리기, tistory publish
  NOT for: 블로그 글 작성(→ blog-writer), 블로그 SEO(→ blog-dominance)
triggers:
  - 티스토리 발행
  - 티스토리 포스팅
  - tistory publish
inputs:
  - name: title
    description: 포스트 제목
    required: true
  - name: content
    description: HTML 본문
    required: true
  - name: category
    description: 카테고리 ID (0=미분류)
    default: "0"
  - name: tags
    description: 콤마 구분 태그 (최대 10개)
    required: false
  - name: visibility
    description: 0=비공개, 15=보호, 20=공개
    default: "20"
---

## 프로젝트 경로

```
/home/jay/projects/BlogAuto/
├── config.py            # 환경변수 설정
├── publisher/
│   ├── base.py          # BasePublisher, PublishResult, Category
│   └── tistory.py       # TistoryPublisher
└── .sessions/
    └── tistory-session.json
```

---

## 인증 설정

쿠키 기반 세션 인증을 사용합니다. 티스토리 로그인 후 `TSSESSION` 쿠키를 추출해 JSON 파일로 저장합니다.

**세션 파일 형식** (`.sessions/tistory-session.json`):

```json
{
  "cookies": [
    {"name": "TSSESSION", "value": "쿠키값", "domain": ".tistory.com"}
  ]
}
```

**환경변수**:

| 변수명 | 기본값 | 설명 |
|---|---|---|
| `TISTORY_SESSION_PATH` | `.sessions/tistory-session.json` | 세션 파일 경로 |
| `TISTORY_BLOG_NAME` | (자동 추출) | 블로그 이름 (미설정 시 API로 자동 추출) |

---

## 사용법

### 발행

```python
from publisher.tistory import TistoryPublisher

pub = TistoryPublisher()
result = pub.publish(
    title="포스트 제목",
    content="<p>HTML 본문</p>",
    category=12345,      # 0=미분류, 생략 가능
    tags="태그1,태그2",
    visibility=20,       # 20=공개
)
print(result.url)
```

### 임시저장

```python
result = pub.save_draft(title="제목", content="<p>본문</p>")
```

### 이미지 업로드

```python
with open("image.jpg", "rb") as f:
    info = pub.upload_image(f.read(), filename="image.jpg")
print(info["url"])
```

### 카테고리 / 포스트 조회

```python
categories = pub.get_categories()
posts = pub.get_posts()
```

---

## visibility 값 정리

| 값 | 공개 범위 |
|---|---|
| `0` | 비공개 |
| `15` | 보호 (비밀번호) |
| `20` | 공개 |

---

## 예외 처리

| 예외 | 원인 |
|---|---|
| `SessionExpiredError` | 세션 만료, 쿠키 재발급 필요 |
| `AuthRequiredError` | 환경변수 미설정 |
| `PublishError` | API 오류, 한도 초과 등 |
| `BlogAutoError` | 기타 일반 오류 |

---

## 주의사항

⚠️ **실제 발행은 제이회장님 승인 후에만 실행합니다.**

- 일일 발행 한도: **15회** (Rate Limiter 내장, 초과 시 자동 차단)
- 세션 쿠키는 주기적으로 만료됩니다. `SessionExpiredError` 발생 시 쿠키를 재발급하세요.
- 태그는 최대 10개까지만 허용됩니다.
- `visibility=0`(비공개)으로 먼저 검토 후 공개 전환을 권장합니다.
- 썸네일은 `thumbnail` 파라미터에 이미지 URL을 전달하세요.

---

## 티스토리 Google SEO 체크리스트

> Google SEO 시작 가이드(https://developers.google.com/search/docs/fundamentals/seo-starter-guide) 기반.
> 발행 전 아래 항목을 확인하여 검색엔진 최적화를 보장합니다.

### 발행 전 체크리스트

- [ ] **URL 설정**: 티스토리 기본 URL `/숫자` → 커스텀 URL 설정 (설명적 URL)
- [ ] **제목(title)**: SEO 최적화 제목 (키워드 포함, 60자 이내)
- [ ] **메타 설명**: 티스토리 SEO 설정에서 직접 입력 (155자 이내)
- [ ] **heading 구조**: h2~h4 체계적 사용 (h1은 제목이 자동 할당)
- [ ] **이미지 alt 텍스트**: 모든 이미지에 설명적 alt 텍스트
- [ ] **내부 링크**: 관련 글 2~3개 자연스럽게 링크
- [ ] **외부 링크**: 권위 있는 출처 1~2개 (nofollow 불필요 시 그대로)
- [ ] **canonical 설정**: 네이버 블로그와 동시 발행 시 원본 지정
- [ ] **카테고리/태그**: 주제별 그룹화 (Google 권장 사이트 구조)
- [ ] **고유 콘텐츠**: 복붙/AI 그대로 아님 확인

### 기술 SEO 체크리스트

- [ ] **사이트맵**: 티스토리 자동 생성 sitemap.xml 확인
- [ ] **robots.txt**: 크롤링 차단 항목 없는지 확인
- [ ] **모바일 최적화**: 티스토리 반응형 스킨 사용
- [ ] **HTTPS**: 티스토리 기본 적용 확인
- [ ] **페이지 속도**: 이미지 압축, 불필요한 위젯 제거

### 콘텐츠 SEO 체크리스트

- [ ] **읽기 쉬운 텍스트**: 단락 분리, 불렛 포인트 활용
- [ ] **구체적 수치**: 비라운드 숫자 사용으로 신뢰도 강화
- [ ] **E-E-A-T 신호**: 저자 정보, 전문성 표시, 경험 공유
- [ ] **독자 검색어 예상**: 초보자/전문가 모두 포괄하는 표현
- [ ] **광고 방해 최소화**: 팝업/배너가 콘텐츠 열람 방해 안 하도록

---

## 관련 스킬

- `blog-writer` — 블로그 본문 작성
- `blog-dominance` — 블로그 SEO 전략
- `naver-seo` — 네이버 키워드 분석
