- publish() 성공 시 topics/ 에서 해당 topic 파일 자동 삭제
- /write, /collect 목록에 발행 제목 유사도 80% 필터 추가
- _load_published_titles(), _filter_unpublished() 헬퍼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GroqWriter 클래스 추가 (llama-3.3-70b-versatile)
- FallbackWriter 래퍼: primary 실패/빈응답 → fallback chain 자동 시도
- engine.json에 groq 설정 + fallback_chain: ["groq"] 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
_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>
1. _search_real_article_image(): DuckDuckGo HTML 검색으로 원문 기사 URL 찾기
- Google News 소스 제목 → DDG 검색 → 실제 URL → og:image
- DDG redirect URL(uddg 파라미터)에서 실제 URL 추출
2. build_full_html(): 이미지를 div 래핑 없이 body_html 맨 앞에 직접 삽입
- Blogger가 div class를 제거하는 문제 해결
3. fetch_featured_image() 우선순위 변경:
RSS이미지 → og:image → DDG검색(원문) → Pexels → Wikipedia
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- fetch_featured_image: 태그 전체(최대 8개) 시도, 제목 제외(너무 길어 매칭 안됨)
px 크기 regex로 일괄 800px 교체
- TOC: h2>=3 조건부 표시 복원 (완전제거→스마트 표시)
두 파일(publisher_bot, blog_converter) 동일하게 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1. publisher_bot.py + blog_converter.py: 목차(TOC) 완전 비활성화
2. fetch_featured_image(): Wikipedia REST API로 무료 이미지 fallback
- 제목/태그로 한국어 Wikipedia 검색 → 썸네일 추출
- 실패 시 영문 Wikipedia 시도 (최대 4개 키워드)
- 200px 썸네일 → 800px 고해상도로 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
feedparser.parse(URL)이 NAS에서 15초+ 소요되어 타임아웃 발생.
requests.get()으로 1초에 가져온 후 feedparser.parse(text)로 파싱하면 총 1.3초.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/write 시점에 Google 뉴스 URL → 실제 기사 URL 변환 후 내용 크롤링.
Gemini 프롬프트에 기사 제목+요약+URL 전달 → 실제 소스 기반 글 작성.
출처 박스에 실제 기사 링크 표시.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- sources 배열의 제목+URL을 참고 자료로 프롬프트에 포함
- SOURCES 섹션에 각 기사 URL·제목·날짜 모두 기재
- 소스 없을 때는 "AI 자체 지식 활용" 명시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
텔레그램에서 /idea <키워드> [카테고리] 로 글감 등록.
- Google 뉴스 RSS로 관련 기사 최대 5개 자동 검색
- 첫 번째 기사에서 설명/이미지 크롤링
- 검색된 기사들을 sources로 저장 → 글 작성 시 참고 자료로 활용
- 카테고리 미지정 시 키워드 기반 자동 추정
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
텔레그램에서 /topic <URL> [카테고리] 로 기사 URL을 글감으로 등록.
- 기사 크롤링: 제목, 설명, og:image, 사이트명 자동 추출
- 카테고리 미지정 시 키워드 기반 자동 추정
- Google 뉴스 URL 자동 변환
- 등록 후 /write 번호로 바로 글 작성 가능
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수집 시 news.google.com/rss/articles/CBMi... 형태의 인코딩 URL을
리다이렉트 따라가서 실제 기사 URL로 저장. 출처 링크 클릭 시 원본 기사로 이동 가능.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- _is_platform_logo(): 로고/아이콘/기본이미지 패턴 감지
- Google 뉴스 URL인 경우 실제 기사 URL로 리다이렉트 추적
- 로고 이미지 걸러지면 Pexels 폴백으로 진행
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/write 7 AI인사이트 형태로 카테고리를 변경하여 발행 가능.
두 번째 인자가 유효한 카테고리명이면 corner 오버라이드, 아니면 기존 direction으로 처리.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- blogs.json labels: 앱추천 → 건강정보
- sources.json: 앱추천 RSS 5개 삭제, 건강정보 RSS 7개 추가
(헬스조선, 연합뉴스 건강, 메디게이트뉴스, 하이닥, 코메디닷컴, 메디컬투데이, 건강 구글뉴스)
- x_keywords: 앱 추천 → 건강 정보, 의료 뉴스, 건강 관리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 본문 끝에 출처 박스 추가 (배경색 + 좌측 보더)
- sources 배열과 source_url 모두 표시
- 중복 URL 제거, 새 탭 열기(target=_blank)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
upstream의 drafts/ 기반 _publish_next(520줄)가 수정된 originals→pending
버전(257줄)을 덮어쓰고 있었음. Python은 마지막 정의를 사용하므로
originals/에서 pending_review/로 이동이 전혀 안 되던 것.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Unsplash Source API 중단으로 기존 폴백 작동 안 함
- 원본 기사 URL에서 og:image / twitter:image 크롤링 (가장 확실)
- 우선순위: RSS 이미지 → og:image 크롤링 → Pexels API
- lxml 파서 사용 (이미 Docker에 설치됨)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- RSS 수집 시 media:thumbnail, media:content, enclosure, <img> 태그에서 이미지 추출
- source_image를 topic → article → publisher로 전달
- 발행 시 우선순위: 원본 소스 이미지 → Pexels → Unsplash
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 발행 시 본문에 <img>가 없으면 자동으로 대표 이미지 추가
- Pexels API (PEXELS_API_KEY 있을 때) → Unsplash Source (무료 폴백)
- 글 태그/코너 기반 키워드로 관련 이미지 검색
- Blogger가 첫 번째 <img>를 자동으로 thumbnail로 사용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /write 완료 시 미리보기 + [승인 발행] [거부] 인라인 버튼 표시
- /pending 목록도 각 글마다 인라인 버튼 포함
- 버튼 클릭 → 즉시 발행/거부 처리, 메시지 업데이트
- 기존 /approve, /reject 명령어도 유지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수집 시 영문 소스 자동 감지 (한국어 비율 5% 미만)
- 영문 글감 글쓰기 프롬프트에 번역+한국맥락 재작성 지시 추가
- 한국 시장 비교, 국내 대안 서비스 언급 유도
- 제목도 한국어로 새로 작성하도록 지시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 영문 RSS(카테고리 지정됨)에 한국관련성 기본 10점 부여 (즉시폐기 방지)
- korean_relevance 키워드에 AI/GPT/Apple/Netflix 등 글로벌 키워드 추가
- 키워드 매칭을 case-insensitive로 변경
- RSS 카테고리를 corner로 직접 배정 (쉬운세상 대신 실제 라벨)
- 클릭베이트 필터에서 충격/대박/레전드/역대급 제거 (TV뉴스 과다 필터링)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>