| 엔드포인트 | 설명 | |-----------|------| | GET /manage/posts.json?category=-3&page=1 | 글 목록 | | GET /manage/category.json | 카테고리 목록 | | GET /manage/post/{id}.json | 글 상세 (수정 시) | | PUT /manage/post/{id}.json | 글 수정 |
주제 선정 — blog_pipeline.py로 Notion 긱뉴스 주제를 1순위로 주제 결정 (트렌드 히스토리는 fallback). 할당량 제한 없음 (무제한 발행, 2026-04-21 변경)
뉴스 검색 — 주제 관련 최신 기사 3-5개 수집
글 작성 — 가이드라인에 따라 1500자+ 블로그 글 작성
SEO 최적화 — blog_seo_optimizer.py로 제목/태그/메타데이터 최적화
품질 관리 — blog_quality_gate.py로 품질 평가
Tistory 발행 — 품질 통과 시 tistory_publisher.py로 발행
주제 소스 (2026-04-20 변경)
1순위: 긱뉴스 (Notion DB) — 매일 13:00 RSS 수집하여 8개 주제를 Notion에 저장
2순위: 트렌드 히스토리 — HN/GitHub/RSS 트렌드 (fallback)
Notion DB ID: 34276f2e-9097-811e-ab69-f8759ecf0be7 (출처=긱뉴스, 상태=활성)
관련 스크립트
scripts/tistory_duplicate_checker.py — 중복 발행 체커 (★ 최우선 실행)
scripts/blog_pipeline.py — 파이프라인 오케스트레이터
scripts/trend_collector.py — 트렌드 수집
scripts/blog_seo_optimizer.py — SEO 최적화
scripts/blog_quality_gate.py — 품질 관리
카테고리별 Tistory 매핑 (할당량 무제한)
| 카테고리 | Tistory ID | 블로그 카테고리명 | |----------|------------|---| | AI/ML | 1219746 | AI 뉴스 | | iOS/Swift | 1219747 | 개발 팁 | | 개발도구 | 1219748 | 자동화&툴 리뷰 | | 투자/경제 | 1219750 | 투자&경제 | | 아이디어 | 1219752 | 아이디어 | | 기타 | 1219751 | 기타 |
시간대별 선호 카테고리
아침(7-10시): AI/ML, 투자/경제 (뉴스 성격)
저녁(19시-새벽2시): AI/ML, iOS/Swift, 개발도구 (기술 심층)
중복 방지 시스템 (5단계)
파이프라인은 5단계로 중복 발행을 방지합니다:
전용 중복 체커 (tistory_duplicate_checker.py) — ★ 최우선
- 크론 잡 발행 전 반드시 실행하여 중복 검증 - SEO 히스토리 50건 + published_topics 해시 + Tistory API 실제 글 확인 - 키워드 유사도 40%+ 또는 고유명사 2개 이상 공유 시 중복 판정 - --title "제목" → is_duplicate: true/false JSON 반환 (exit code 1=중복) - --recent 20 → 최근 발행글 목록 출력
파이프라인 주제 dedup (blog_pipeline.py)
- published_topics.json에 해시 기록 → 같은 주제 재선정 불가 - check_tistory_duplicate()로 SEO 히스토리 전체(7일 lookback)와 비교 - 최근 48시간 발행 주제와 키워드 유사도 50% 초과 시 skip - 모든 카테고리 할당량 소진 시 전체 skip
SEO 중복 체크 (blog_seo_optimizer.py) — 한국어 완벽 지원
- is_duplicate() 4단계 체크: - L1: 해시 매치 (전체 히스토리, 기간 무관) - L2: 의미 단어 오버랩 50%+ (한국어 포함, SEO 불용어 제외) - L3: 핵심 키워드 2개 이상 공유 - L4: 특정 엔티티 매치 (Cloudflare, Wrangler 등 고유명사) - _parse_post_timestamp()로 timestamp/date 필드 모두 지원 - timestamp 없는 게시물은 보수적으로 중복 대상에 포함
크론 프롬프트 가드
- "반드시 1편 발행" 지시 없음 — 중복이면 발행 포기가 최우선 - 발행 전 반드시tistory_duplicate_checker.py로 중복 확인 - 파이프라인 skip 시 다른 카테고리 최대 2회 재시도 후, 그래도 없으면 발행 포기 - 절대 임의 주제를 수동 선정하지 않음 — 중복 발행의 유일한 원인
수동 선정 금지
- 파이프라인이 모든 카테고리에서 skip하면 → 당회 발행 포기 (정상 동작) - 에이전트가 임의로 주제를 골라 발행하는 것을 엄격히 금지
중복 발생 시 대처
# 오늘 할당량 리셋 (주의: 실제 할당량보다 적게 리셋하면 중복 위험) python3 scripts/blog_pipeline.py --reset-daily
발행 이력 확인
python3 -c "import json; data=json.load(open('$HOME/.hermes/memory/blog_seo_history.json')); [print(p['title']) for p in data['posts'][-10:]]"
published_topics.json 초기화 (모든 dedup 리셋 — 긴급 시에만 사용)
rm memory/published_topics.json
시간 신선도 검증 (★ CRITICAL)
과거 자료를 최신 자료로 오인하여 발행하는 것을 반드시 방지해야 합니다.
❌ 절대 하지 말 것
[2026 최신] 같은 연도 하드코딩 사용 → 현재 연도가 바뀌면 오정보가 됨
"Gemini 2.0 완벽가이드 2026년" 같이 구버전 제목에 현재 연도를 붙이는 것
2년 이상 된 기술을 "최신"으로 포장하는 것
✅ 올바른 접근
제목에는 버전/연도 없이 기술명만 사용: "Gemini 완벽 가이드"
본문에서는 반드시 최신 버전을 기준으로 작성
내용에 버전/연도를 명시할 때는 정확한 출시 시점 기재
검증 체크리스트
주제 버전 확인 — 이 기술/모델의 최신 버전이 무엇인지 검색 후 작성
내용 연도 검증 — 본문에 언급된 연도/버전이 현재 유효한지 확인
제목-내용 일치 — "최신/완벽가이드"라고 쓴 제목에 구버전 내용이 없는지 확인
파이프라인 통합
blog_pipeline.py: check_topic_timeliness() — 주제 선택 시 구버전 차단
blog_quality_gate.py: 연도/버전 검증 + 최신 주장 vs 구버전 내용 모순 감지 (페널티 -10~-15점)
blog_seo_optimizer.py: 하드코딩 연도 프리픽스 사용 금지
품질 관리 시스템
발행 전 글 품질을 5차원으로 평가하여, 기준 미달 시 자동 스킵 또는 재작성을 권장합니다.
평가 항목
| 항목 | 가중치 | 평가 내용 | |------|--------|----------| | 내용 품질 | 30% | 본문 길이, 구조, 단락 수, 도입/결론 | | 가독성 | 15% | 문장 길이, 포맷팅, 시각적 구조 | | 독창성 | 20% | 반복/스팸 감지, 어휘 다양성, 기존 글과 유사도 | | SEO | 20% | 제목 최적화, 태그, 링크, 메타 설명 | | 시간 신선도 | 15% | 연도/버전 정확성, 최신 주장과 내용 일치 (CRITICAL) |
등급 기준
| 등급 | 점수 | 결정 | |------|------|------| | S | 85+ | 🌟 최상급 — 즉시 발행 | | A | 70-84 | ✅ 양호 — 발행 | | B | 55-69 | 📝 보통 — 발행 가능 | | C | 40-54 | ⚠️ 재작성 권장 | | D | <40 | 🔁 새 주제로 재시도 (최대 2회) |
사용법
# 글 품질 평가 python3 scripts/blog_quality_gate.py \ --title "글 제목" \ --content "본문 내용" \ --tags "AI,LLM,GPT" \ --category "AI/ML"
if [ "$DECISION" = "retry_with_new_topic" ]; then echo "품질 미달 ($GRADE 등급) — 새 주제로 재시도" # 파이프라인 2단계로 돌아가서 새 주제 선택 python3 scripts/blog_pipeline.py # 새 주제로 3~6단계 재실행 (최대 2회) exit 0 elif [ "$DECISION" = "rewrite" ]; then echo "품질 부족 ($GRADE 등급) — 재작성 권장" # 발행을 진행하지 않고 다음 사이클로 exit 0 fi
스킬 명시적 연결: 크론 잡 설정에 skills: ["tistory-publisher"]가 포함되어야 합니다. skills: []이면 프롬프트에 스킬 로드 지시가 있어도 크론 환경에서 인식되지 않습니다.
terminal 도구 강제 사용: 크론 프롬프트에 "무조건 execute_code 또는 terminal 도구를 사용하여 스크립트를 실행하라"는 명시적 지시가 필요합니다. 일부 모델은 도구가 있다는 것을 인지하면서도 시도하지 않고 [SILENT]로 종료하는 문제가 있습니다 (2026-04-18에 glm-5-turbo에서 확인).
크론 잡 정상 실행 시간
정기 실행: 매일 22:00 KST
수동 실행: hermes cron run
트러블슈팅
| 문제 | 원인 | 해결 | |------|------|------| | HTTP 500 | 쿠키 만료 | 브라우저에서 새 쿠키 복사 | | 세션 만료 메시지 | TSSESSION 만료 | 재로그인 후 쿠키 갱신 | | Content-Type 오류 | 반드시 application/json | form-urlencoded 사용 금지 | | 글 발행 안 됨 | needCaptcha: true | 일정 시간 후 재시도 | | 파이프라인 skip | 주제 소진 (할당량 없음) | 긱뉴스/트렌드 데이터 확인, --reset-daily로 카운터 리셋 | | SEO 등급 C 이하 | 본문 길이 부족 | 1500자 이상으로 수정 | | 중복 발행 | published_topics.json 누락 | 파일 존재 여부 확인 후 record_published_topic() 호출 | | 크론 실행만 되고 발행 안 됨 | skills: [] 또는 프롬프트에 terminal 강제 지시 없음 | 크론 잡에 tistory-publisher 스킬 연결 + 프롬프트 수정 | | 모델이 도구 시도 안 하고 SILENT 종료 | 모델이 스스로 "터미널 안 된다"고 오판 | 프롬프트에 "무조건 execute_code 사용" 명시적 지시 추가 |