Commit Graph

37 Commits

Author SHA1 Message Date
JOUNGWOOK KWON
726c593e85 feat: Reddit 수집, 쇼츠 텔레그램 미리보기, 코너 9개 체계 정비
- Reddit 트렌딩 수집기 추가 (/reddit collect, /pick 명령어)
- 쇼츠 영상 텔레그램 미리보기 후 승인 기반 YouTube 업로드
- 코너 9개로 통합 (앱추천→제품리뷰, 재테크절약→재테크, TV로보는세상/건강정보 추가)
- RSS 피드 73개로 확대 (9개 코너 전체 커버)
- 블로그 중복 검토 알림 수정, 글 잘림 방지 (max_tokens 8192)
- 제품리뷰 다중 이미지 지원, 저품질 이미지 필터링 강화
- HookOptimizer LLM 연동, 인스타/X/틱톡 스케줄러 비활성화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 13:56:20 +09:00
JOUNGWOOK KWON
fb5e6ddbdf feat: YouTube Shorts 파이프라인 완성 및 HJW TV 업로드 연동
- youtube_uploader.py: YOUTUBE_REFRESH_TOKEN/CLIENT_ID/CLIENT_SECRET 환경변수 폴백 추가
  (token.json 없는 Docker 환경에서 브랜드 계정 인증 가능)
- shorts_config.json: corners_eligible를 실제 블로그 코너명으로 수정
- caption_renderer.py: render_captions() 반환값 누락 수정
- get_token.py: web→installed 타입 변환, port 8080 고정, prompt=consent 추가
- get_youtube_token.py: YouTube 전용 OAuth 토큰 발급 스크립트 (별도 클라이언트)
- CLAUDE.md: 프로젝트 개요, 배포 방법, 핵심 파일, YouTube 채널 정보 추가
- publisher_bot.py: 이미지 분산 배치, SEO 검증, 버그 수정
- scheduler.py: 알림 강화, atomic write, 중복 방지, hot reload 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 09:27:48 +09:00
JOUNGWOOK KWON
15dfc39f0f feat: 텔레그램 이미지 첨부 기능 및 이미지 처리 개선
- /idea, /topic 명령어에 최대 3장 이미지 첨부 기능 추가
- 1장: 본문 최상단 배치, 2~3장: 본문 중간 균등 분산 배치
- base64 data URI 임베딩으로 핫링크 차단 문제 해결
- Claude API timeout=120s, max_retries=0 설정 (401 무한대기 방지)
- DuckDuckGo 제목 검색 폴백 및 문화/엔터 섹션 이미지 필터링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 18:28:19 +09:00
JOUNGWOOK KWON
eaff01658c fix: 텔레그램 대화 Claude 클라이언트에 cliproxy base_url 적용 2026-03-31 21:17:55 +09:00
JOUNGWOOK KWON
1bdd212639 fix: 발행 완료된 글감을 /collect, /write 목록에서 제외
- publish() 성공 시 topics/ 에서 해당 topic 파일 자동 삭제
- /write, /collect 목록에 발행 제목 유사도 80% 필터 추가
- _load_published_titles(), _filter_unpublished() 헬퍼 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 08:55:27 +09:00
JOUNGWOOK KWON
8a15148b7b fix: 한국어 조사 제거로 Google News RSS 검색 정확도 개선
_extract_search_keywords()에서 한국어 조사/어미(을, 에서, 에서만 등)를
regex로 제거하고 키워드를 3개로 축소하여 검색 적중률 향상.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 18:32:43 +09:00
JOUNGWOOK KWON
b3ccbba491 fix: Google News og:title 덮어쓰기 방지 - 원본 RSS 제목 보존
_fetch_sources_content()에서 Google News 페이지의 og:title='Google News'로
원래 RSS 기사 제목이 덮어씌워지던 문제 수정.
- 'Google News' 등 플랫폼 이름이면 무시, 원래 RSS 제목 유지
- og:description도 'google news' 포함 시 무시
이로써 DuckDuckGo 원문 기사 이미지 검색이 제대로 작동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 18:28:13 +09:00
JOUNGWOOK KWON
f3526bbcdd fix: source_image에도 플랫폼 로고 필터 적용 (근본 원인 수정)
NAS IP에서 Google News RSS URL이 200 응답하며 og:image에 lh3.googleusercontent.com
썸네일을 반환하는 문제. 두 곳 모두 차단:
- fetch_featured_image(): source_image에 _is_platform_logo() 체크 추가
- _fetch_sources_content(): og:image 저장 전 플랫폼 로고 패턴 필터 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:46:45 +09:00
JOUNGWOOK KWON
07703a0f6b fix: Google 뉴스 URL 리다이렉트 추적 + sources 최종 반영
- requests.head() → requests.get()으로 변경 (Google 뉴스 리다이렉트 정상 추적)
- enriched sources(실제 기사 URL)를 article에 덮어써서 출처 박스에 반영
- source_image도 크롤링된 og:image로 채워짐

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:28:00 +09:00
JOUNGWOOK KWON
3119823128 fix: /idea 긴 문장 검색 시 핵심 키워드 추출
'월드컵을 지상파에서 못보는 상황에 대한 반대의 글' → '월드컵 지상파에서 못보는'
불용어 제거 후 핵심 키워드 3~5개만 추출하여 Google 뉴스 검색.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 17:18:05 +09:00
JOUNGWOOK KWON
45a352c343 fix: feedparser URL 직접 호출 → requests + feedparser 텍스트 파싱
feedparser.parse(URL)이 NAS에서 15초+ 소요되어 타임아웃 발생.
requests.get()으로 1초에 가져온 후 feedparser.parse(text)로 파싱하면 총 1.3초.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 17:16:02 +09:00
JOUNGWOOK KWON
0e72e6de88 feat: pending 글 카테고리 변경 기능 추가
- /setcorner <번호> <카테고리>: 커맨드로 변경
- /pending 버튼에 🏷 카테고리 변경 버튼 추가 → 클릭 시 9개 카테고리 선택 버튼 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 17:13:40 +09:00
JOUNGWOOK KWON
8c66d9b9e0 debug: _fetch_sources_content 로그 추가 2026-03-30 16:24:03 +09:00
JOUNGWOOK KWON
e077b593c9 feat: /idea 글 작성 시 소스 크롤링 → Gemini에 실제 내용 전달
/write 시점에 Google 뉴스 URL → 실제 기사 URL 변환 후 내용 크롤링.
Gemini 프롬프트에 기사 제목+요약+URL 전달 → 실제 소스 기반 글 작성.
출처 박스에 실제 기사 링크 표시.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 16:20:26 +09:00
JOUNGWOOK KWON
6d9cf8d6da feat: /idea sources 배열을 Gemini 프롬프트와 출처 섹션에 반영
- sources 배열의 제목+URL을 참고 자료로 프롬프트에 포함
- SOURCES 섹션에 각 기사 URL·제목·날짜 모두 기재
- 소스 없을 때는 "AI 자체 지식 활용" 명시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 16:17:51 +09:00
JOUNGWOOK KWON
7fd57e61b4 fix: /idea RSS 소스 검색 복원 + 15초 타임아웃 폴백
검색 성공 시 소스 표시, 15초 초과 시 키워드만으로 저장 후 진행.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 15:45:54 +09:00
JOUNGWOOK KWON
b41e8d0ff2 fix: /idea 타임아웃 — 리다이렉트/크롤링 제거하고 RSS만 파싱
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 15:39:57 +09:00
JOUNGWOOK KWON
f25a95440a fix: /idea 타임아웃 — 리다이렉트/크롤링 제거하고 RSS만 파싱
NAS→Google 뉴스 리다이렉트 추적이 매우 느려서 Telegram 타임아웃 발생.
RSS 피드 파싱만으로 제목/설명 수집, URL 변환은 글 작성 시점에 처리.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 15:36:01 +09:00
JOUNGWOOK KWON
c836c720da fix: /idea 명령 타임아웃 — 첫 기사만 크롤링으로 속도 최적화
5개 기사 모두 리다이렉트 추적하면 50초+ 걸려서 Telegram 타임아웃 발생.
첫 번째 기사만 URL 변환+크롤링하고 나머지는 RSS 제목만 저장.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 15:26:15 +09:00
JOUNGWOOK KWON
3d6736503f feat: /idea 명령 추가 — 키워드로 글감 자동 생성
텔레그램에서 /idea <키워드> [카테고리] 로 글감 등록.
- Google 뉴스 RSS로 관련 기사 최대 5개 자동 검색
- 첫 번째 기사에서 설명/이미지 크롤링
- 검색된 기사들을 sources로 저장 → 글 작성 시 참고 자료로 활용
- 카테고리 미지정 시 키워드 기반 자동 추정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 15:14:37 +09:00
JOUNGWOOK KWON
6e92b76077 feat: /topic 명령 추가 — URL을 글감으로 등록
텔레그램에서 /topic <URL> [카테고리] 로 기사 URL을 글감으로 등록.
- 기사 크롤링: 제목, 설명, og:image, 사이트명 자동 추출
- 카테고리 미지정 시 키워드 기반 자동 추정
- Google 뉴스 URL 자동 변환
- 등록 후 /write 번호로 바로 글 작성 가능

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 13:54:51 +09:00
JOUNGWOOK KWON
adc4d252ac feat: /write 명령에 카테고리 오버라이드 기능 추가
/write 7 AI인사이트 형태로 카테고리를 변경하여 발행 가능.
두 번째 인자가 유효한 카테고리명이면 corner 오버라이드, 아니면 기존 direction으로 처리.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 13:17:04 +09:00
JOUNGWOOK KWON
e250126431 fix: 글쓰기 프롬프트에서 자기소개/인사말 제거
매 글마다 "편집자 eli입니다" 반복 → 바로 주제 진입으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:57:03 +09:00
JOUNGWOOK KWON
a3fbed40ec fix: _publish_next 중복 정의 제거 — pending 이동 안 되던 근본 원인
upstream의 drafts/ 기반 _publish_next(520줄)가 수정된 originals→pending
버전(257줄)을 덮어쓰고 있었음. Python은 마지막 정의를 사용하므로
originals/에서 pending_review/로 이동이 전혀 안 되던 것.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:41:06 +09:00
JOUNGWOOK KWON
d85671e6ac fix: pending 파일명 _pending.json 접미사 추가 + 에러 복구 강화
- _publish_next에서 파일명에 _pending 접미사 추가 (get_pending_list 매칭)
- check_safety 실패 시에도 수동 검토로 전환 (무조건 pending 이동)
- safety_keywords.json의 재테크절약 → 재테크 수정
- /write 후 인라인 버튼 callback_data도 _pending 파일명 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:31:00 +09:00
JOUNGWOOK KWON
9280be7e52 feat: 원본 RSS 소스 이미지를 대표 이미지로 우선 사용
- RSS 수집 시 media:thumbnail, media:content, enclosure, <img> 태그에서 이미지 추출
- source_image를 topic → article → publisher로 전달
- 발행 시 우선순위: 원본 소스 이미지 → Pexels → Unsplash

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:22:48 +09:00
JOUNGWOOK KWON
7a03fb984a feat: 텔레그램 인라인 버튼으로 승인/거부 (터치 한 번으로 발행)
- /write 완료 시 미리보기 + [승인 발행] [거부] 인라인 버튼 표시
- /pending 목록도 각 글마다 인라인 버튼 포함
- 버튼 클릭 → 즉시 발행/거부 처리, 메시지 업데이트
- 기존 /approve, /reject 명령어도 유지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:16:14 +09:00
JOUNGWOOK KWON
01f95dbc6b fix: /collect, /topics 전체 글감 표시 (15개 제한 제거)
텔레그램 4096자 제한 고려하여 30개씩 페이지 나눠 전송

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 12:11:24 +09:00
JOUNGWOOK KWON
e3c963a014 feat: 영문 RSS 글감 자동 번역+재작성 지원
- 수집 시 영문 소스 자동 감지 (한국어 비율 5% 미만)
- 영문 글감 글쓰기 프롬프트에 번역+한국맥락 재작성 지시 추가
- 한국 시장 비교, 국내 대안 서비스 언급 유도
- 제목도 한국어로 새로 작성하도록 지시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 11:53:01 +09:00
JOUNGWOOK KWON
9cf1f44a8b fix: /collect, /topics 결과에 글 번호 표시 추가
수집 완료 후 바로 번호 포함 목록을 보여줘서
/write [번호]로 바로 글 작성할 수 있도록 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 11:42:28 +09:00
JOUNGWOOK KWON
9f68133217 feat: /collect, /write 텔레그램 명령어 추가 + eli 페르소나 적용
- cmd_collect: 즉시 글감 수집
- cmd_write [번호] [방향]: 특정 글감 글 작성 + auto pending
- _publish_next(): originals → pending_review 자동 이동
- _call_openclaw: direction 파라미터 지원
- 글쓰기 시스템 프롬프트 eli 블로그 페르소나로 변경
- 기본 코너: 쉬운세상 → AI인사이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 11:27:02 +09:00
JOUNGWOOK KWON
3e2405dff9 feat: upstream v3.2.1 기반으로 업그레이드 + eli 블로그 커스터마이징
- upstream sinmb79/blog-writer v3.2.1 코드 베이스 적용
- config_resolver, CLI, writer_bot, shorts pipeline 등 신규 기능 포함
- load_dotenv Windows 경로 → Docker 호환 load_dotenv() 변경 (25개 파일)
- runtime_guard.py Docker 환경 bypass 추가
- config/blogs.json: eli-ai 블로그 정체성 (8개 카테고리)
- config/sources.json: 38개 RSS 소스 유지
- config/engine.json: writing provider → gemini (2.5-flash)
- config/safety_keywords.json: 모든 글 수동 승인 (score 101)
- bots/scheduler.py: 시스템 프롬프트 eli 블로그 기준으로 업데이트
- bots/publisher_bot.py: .env refresh token OAuth 폴백 로직 추가
- requirements.txt: google-generativeai, groq 활성화
- Dockerfile + docker-compose.yml: NAS Docker 배포 설정
- CLAUDE.md: 프로젝트 메타데이터

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 09:21:14 +09:00
sinmb79
9b44a07a44 feat: v3.2 — YouTube Shorts 봇 + 수동 어시스트 + 보안 개선
주요 추가 기능:
- bots/shorts/ 서브모듈 7개: tts_engine, script_extractor, asset_resolver,
  stock_fetcher, caption_renderer, video_assembler, youtube_uploader
- bots/shorts_bot.py: 6단계 Shorts 파이프라인 오케스트레이터
  (auto/semi_auto 두 가지 생산 모드, CLI 지원)
- bots/writer_bot.py: 독립 실행형 AI 글쓰기 봇 (대시보드 연동)
- bots/assist_bot.py: URL 기반 수동 어시스트 파이프라인
- config/shorts_config.json: Shorts 전체 설정
- templates/shorts/extract_prompt.txt: LLM 스크립트 추출 프롬프트
- scheduler.py에 shorts 잡(10:35/16:00) + /shorts Telegram 명령 추가

보안 개선:
- .env 파일 외부 경로 참조로 변경 (load_dotenv dotenv_path, 24개 파일)
- .gitignore에 민감 파일/내부 문서/런타임 데이터 항목 추가

문서:
- README.md 전면 재작성 (상세 한글 설명, 설치/설정/사용법 포함)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 17:51:02 +09:00
sinmb79
392c2e13f1 feat: v3.2 나머지 미완성 기능 구현
[Instagram Reels] Phase 2 완성
- instagram_bot.py: publish_reels() 추가 (MP4 → Reels API)
  - upload_video_container(), wait_for_video_ready() 구현
  - 로컬 경로 → 공개 URL 자동 변환 (image_host.get_public_video_url())
- scheduler.py: job_distribute_instagram_reels() 추가 (10:30)
- image_host.py: get_public_video_url() + 로컬 비디오 서버 추가
  - VIDEO_HOST_BASE_URL 환경변수 지원 (Tailscale/CDN)

[writer_bot.py] 신규 — 독립 실행형 글쓰기 봇
- api_content.py manual-write 엔드포인트에서 subprocess 호출 가능
- run_pending(): 오늘 날짜 미처리 글감 자동 처리
- run_from_topic(): 직접 주제 지정
- run_from_file(): JSON 파일 지정
- CLI: python bots/writer_bot.py [--topic "..." | --file path.json | --limit N]

[보조 시스템 신규] v3.1 CLI + Assist 모드
- blog.cmd: venv Python 경유 Windows 런처
- blog_runtime.py + runtime_guard.py: 실행 진입점 + venv 검증
- blog_engine_cli.py: 대시보드 API 기반 CLI (blog status, blog review 등)
- bots/assist_bot.py: URL 기반 수동 어시스트 파이프라인
- dashboard/backend/api_assist.py + frontend/Assist.jsx: 수동모드 탭

[engine_loader.py] v3.1 개선
- OpenClawWriter: --json 플래그 + payloads 파싱 + plain text 폴백
- ClaudeWebWriter: Playwright 쿠키 세션 (Cloudflare 차단으로 현재 비활성)
- GeminiWebWriter: gemini-webapi 비공식 클라이언트

[scheduler.py] v3.1 개선
- _call_openclaw(): 플레이스홀더 → EngineLoader 실제 호출
- _build_openclaw_prompt(): 구조화된 HTML 원고 프롬프트
- data/originals/: 원본 article JSON 저장 경로 추가

[설정/환경] 정비
- .env.example: SEEDANCE/ELEVENLABS/GEMINI/RUNWAY 복원
  + VIDEO_HOST_BASE_URL, GEMINI_WEB_* , REMOTE_CLAUDE_POLLING_ENABLED 추가
- scripts/setup.bat: data/originals, outputs, assist, novels, config/novels
  디렉토리 생성 + 폰트 다운로드 + blog.cmd 기반 Task Scheduler 등록
- requirements.txt: fastapi, uvicorn, python-multipart 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 17:12:39 +09:00
sinmb79
8a7a122bb3 feat: v3.0 엔진 추상화 + 소설 파이프라인 추가
[1순위] 엔진 추상화 리팩토링
- config/engine.json: 단일 설정 파일로 writing/tts/image/video/publishing 엔진 제어
- bots/engine_loader.py: EngineLoader 팩토리 클래스 (Claude/OpenClaw/Gemini Writer, gTTS/GoogleCloud/OpenAI/ElevenLabs TTS, DALL-E/External 이미지)

[2순위] VideoEngine 추상화
- bots/converters/video_engine.py: VideoEngine ABC + FFmpegSlidesEngine/SeedanceEngine/SoraEngine/RunwayEngine/VeoEngine 구현
- Seedance 2.0 API 연동 + 실패 시 ffmpeg_slides 자동 fallback

[3순위] 소설 연재 파이프라인
- bots/novel/novel_writer.py: AI 에피소드 자동 생성 (Claude/엔진 추상화)
- bots/novel/novel_blog_converter.py: 에피소드 → 장르별 테마 Blogger HTML
- bots/novel/novel_shorts_converter.py: key_scenes → TTS + Pillow + VideoEngine → MP4
- bots/novel/novel_manager.py: 전체 파이프라인 조율 + Telegram 명령 처리
- config/novels/shadow-protocol.json: 예시 소설 설정 (2040 서울 SF 스릴러)

[스케줄러] 소설 파이프라인 통합
- 매주 월/목 09:00 자동 실행 (job_novel_pipeline)
- Telegram 명령: /novel_list, /novel_gen, /novel_status

[기타 수정]
- collector_bot.py: 한국어 유니코드 감지 + RSS 신뢰도 override 버그 수정
- quality_rules.json: min_score 70→60
- scripts/get_token.py: YouTube OAuth scope 추가
- .env.example: SEEDANCE/ELEVENLABS/GEMINI/RUNWAY API 키 항목 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 09:33:04 +09:00
sinmb79
b54f8e198e feat: v3 멀티플랫폼 자동화 엔진 — 변환/배포 엔진 + 쇼츠 + README
## 변환 엔진 (bots/converters/)
- blog_converter: HTML 자동감지 + Schema.org JSON-LD + AdSense 플레이스홀더
- card_converter: Pillow 1080×1080 인스타그램 카드 이미지
- thread_converter: X 스레드 280자 자동 분할
- newsletter_converter: 주간 HTML 뉴스레터
- shorts_converter: TTS + ffmpeg 뉴스앵커 쇼츠 영상 (1080×1920)

## 배포 엔진 (bots/distributors/)
- image_host: ImgBB 업로드 / 로컬 HTTP 서버
- instagram_bot: Instagram Graph API (컨테이너 → 폴링 → 발행)
- x_bot: X API v2 OAuth1 스레드 게시
- tiktok_bot: TikTok Content Posting API v2 청크 업로드
- youtube_bot: YouTube Data API v3 재개가능 업로드

## 기타
- article_parser: KEY_POINTS 파싱 추가 (SNS/TTS용 핵심 3줄)
- publisher_bot: HTML 본문 직접 발행 지원
- scheduler: 시차 배포 스케줄 + Telegram 변환/배포 명령 추가
- remote_claude: Claude Agent SDK Telegram 연동
- templates/shorts_template.json: 코너별 색상/TTS/트랜지션 설정
- scripts/download_fonts.py: NotoSansKR / 맑은고딕 자동 설치
- .gitignore: .claude/, 기획문서, 생성 미디어 파일 추가
- .env.example: 플레이스홀더 텍스트 (실제 값 없음)
- README: v3 아키텍처 전체 문서화 (설치/API키/상세설명/FAQ)
- requirements.txt: openai, pydub 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 18:15:07 +09:00
sinmb79
15eb007b5a Initial commit: 블로그 자동 수익 엔진 v2
- 수집봇: Google Trends, GitHub Trending, HN, Product Hunt, RSS 수집
  + 품질 점수(0-100) 시스템 + 6가지 폐기 규칙
- 발행봇: Blogger API v3 자동 발행 + 안전장치(팩트체크/위험키워드)
- 링크봇: 쿠팡 파트너스 HMAC 서명 + 자동 링크 삽입
- 분석봇: 색인률/CTR/14일성과 등 5대 핵심 지표 + Telegram 리포트
- 이미지봇: manual/request/auto 3가지 모드
  request 모드 — 주기적 프롬프트 전송 → Telegram으로 이미지 수령
- 스케줄러: APScheduler + Telegram 봇 명령 리스너

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 06:54:43 +09:00