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>
This commit is contained in:
JOUNGWOOK KWON
2026-04-07 13:56:20 +09:00
parent 93b2d3a264
commit 726c593e85
15 changed files with 1357 additions and 190 deletions
+29 -15
View File
@@ -35,13 +35,17 @@ logging.basicConfig(
)
logger = logging.getLogger(__name__)
# 코너별 타입
# 코너별 타입 (공식 9개 코너)
CORNER_TYPES = {
'easy_guide': '쉬운세상',
'hidden_gems': '숨은보물',
'vibe_report': '바이브리포트',
'ai_insight': 'AI인사이트',
'travel_food': '여행맛집',
'startup': '스타트업',
'tv_world': 'TV로보는세상',
'product_review': '제품리뷰',
'life_tips': '생활꿀팁',
'health': '건강정보',
'finance': '재테크',
'fact_check': '팩트체크',
'one_cut': '한컷',
}
# 글감 타입 비율: 에버그린 50%, 트렌드 30%, 개성 20%
@@ -210,16 +214,26 @@ def assign_corner(item: dict, topic_type: str) -> str:
title = item.get('topic', '').lower()
source = item.get('source', 'rss').lower()
if topic_type == 'evergreen':
if any(kw in title for kw in ['가이드', '방법', '사용법', '입문', '튜토리얼', '기초']):
return '쉬운세상'
return '숨은보물'
elif topic_type == 'trending':
if source in ['github', 'product_hunt']:
return '숨은보물'
return '쉬운세상'
else: # personality
return '바이브리포트'
# 키워드 기반 코너 분류
if any(kw in title for kw in ['ai', '인공지능', 'llm', 'gpt', 'claude', 'gemini', '머신러닝', '딥러닝']):
return 'AI인사이트'
if any(kw in title for kw in ['스타트업', '유니콘', 'vc', '시리즈', '인수']):
return '스타트업'
if any(kw in title for kw in ['드라마', '예능', '방송', '넷플릭스', '티빙', '쿠팡플레이', '출연', '시청률']):
return 'TV로보는세상'
if any(kw in title for kw in ['리뷰', '비교', '추천', '제품', '가젯', '아이폰', '갤럭시', 'ios', 'android', '', 'app', '도구', '', 'tool', '서비스', 'saas']):
return '제품리뷰'
if any(kw in title for kw in ['건강', '의료', '병원', '질병', '운동', '다이어트', '영양', '수면']):
return '건강정보'
if any(kw in title for kw in ['절약', '재테크', '투자', '주식', '부동산', '금리', '적금', '연금']):
return '재테크'
if any(kw in title for kw in ['꿀팁', '생활', '방법', '가이드', '사용법', '입문', '튜토리얼']):
return '생활꿀팁'
if any(kw in title for kw in ['팩트체크', '가짜뉴스', '논란', '진실', '검증']):
return '팩트체크'
if source in ['github', 'product_hunt']:
return '제품리뷰'
return 'AI인사이트' # 기본 코너
def calculate_quality_score(item: dict, rules: dict) -> int: