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>
This commit is contained in:
sinmb79
2026-03-25 06:54:43 +09:00
commit 15eb007b5a
20 changed files with 4507 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
{
"fixed_links": [
{
"keyword": "ChatGPT Plus",
"url": "https://chat.openai.com",
"label": "ChatGPT Plus 바로가기",
"type": "external"
},
{
"keyword": "Claude Pro",
"url": "https://claude.ai",
"label": "Claude Pro 바로가기",
"type": "external"
}
],
"coupang_category_map": {
"마이크": "mic",
"웹캠": "webcam",
"키보드": "keyboard",
"마우스": "mouse",
"모니터": "monitor",
"노트북": "laptop",
"이어폰": "earphone",
"헤드셋": "headset",
"외장하드": "external-hdd",
"USB허브": "usb-hub",
"책상": "desk",
"의자": "chair",
"서적": "book",
"스피커": "speaker"
},
"disclaimer_text": "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
}

14
config/blogs.json Normal file
View File

@@ -0,0 +1,14 @@
{
"blogs": [
{
"id": "main",
"blog_id": "${BLOG_MAIN_ID}",
"name": "테크인사이더",
"persona": "tech_insider",
"domain": "",
"active": true,
"phase": 1,
"labels": ["쉬운세상", "숨은보물", "바이브리포트", "팩트체크", "한컷"]
}
]
}

72
config/quality_rules.json Normal file
View File

@@ -0,0 +1,72 @@
{
"min_score": 70,
"scoring": {
"korean_relevance": {
"max": 30,
"description": "한국 독자 관련성",
"keywords": ["한국", "국내", "한글", "카카오", "네이버", "쿠팡", "삼성", "LG", "현대", "기아", "배달", "토스", "당근", "야놀자"]
},
"freshness": {
"max": 20,
"description": "트렌드 신선도",
"hours_full_score": 24,
"hours_zero_score": 168
},
"search_demand": {
"max": 20,
"description": "검색 수요 (Google Trends 상대값)"
},
"source_trust": {
"max": 15,
"description": "출처 신뢰도",
"levels": {
"high": 15,
"medium": 8,
"low": 3
},
"high_sources": ["github.com", "official blog", "공식", "press release"],
"low_sources": ["twitter.com", "x.com", "reddit.com", "개인"]
},
"monetization": {
"max": 15,
"description": "수익 연결 가능성",
"keywords": ["도구", "앱", "서비스", "제품", "장비", "구독", "할인", "추천"]
}
},
"discard_rules": [
{
"id": "no_korean_relevance",
"description": "한국 독자와 무관한 주제",
"condition": "korean_relevance_score == 0"
},
{
"id": "unverified_source",
"description": "출처 불명/미확인 사례",
"condition": "source_trust_level == 'unknown'"
},
{
"id": "duplicate_topic",
"description": "이미 발행한 주제와 유사도 80% 이상",
"similarity_threshold": 0.8
},
{
"id": "stale_trend",
"description": "7일 이상 지난 트렌드 (에버그린 제외)",
"max_age_days": 7,
"except_evergreen": true
},
{
"id": "promotional",
"description": "광고성/홍보성이 명확한 원문",
"keywords": ["광고", "홍보", "스폰서", "협찬", "AD", "sponsored"]
},
{
"id": "clickbait",
"description": "클릭베이트성 주제",
"patterns": ["충격", "경악", "난리", "ㅋㅋ", "ㅠㅠ", "대박", "레전드", "역대급"]
}
],
"evergreen_keywords": [
"가이드", "방법", "사용법", "입문", "튜토리얼", "기초", "완전정복", "총정리"
]
}

View File

@@ -0,0 +1,18 @@
{
"crypto_keywords": [
"스캠", "사기", "폰지", "러그풀", "소송", "코인",
"비트코인", "이더리움", "암호화폐", "가상화폐"
],
"criticism_keywords": [
"고소", "피해", "논란", "비리", "내부고발", "고발"
],
"investment_keywords": [
"수익 보장", "확실한 수익", "반드시 오른다", "무조건", "투자 권유"
],
"legal_keywords": [
"불법", "위법", "처벌", "벌금", "징역", "기소"
],
"always_manual_review": ["팩트체크"],
"min_sources_required": 2,
"min_quality_score_for_auto": 75
}

40
config/schedule.json Normal file
View File

@@ -0,0 +1,40 @@
{
"jobs": [
{
"id": "collector",
"hour": 7,
"minute": 0,
"description": "수집봇 실행"
},
{
"id": "ai_writer",
"hour": 8,
"minute": 0,
"description": "AI 글 작성 트리거"
},
{
"id": "publish_1",
"hour": 9,
"minute": 0,
"description": "첫 번째 글 발행"
},
{
"id": "publish_2",
"hour": 12,
"minute": 0,
"description": "두 번째 글 발행"
},
{
"id": "publish_3",
"hour": 15,
"minute": 0,
"description": "세 번째 글 발행 (있을 경우)"
},
{
"id": "analytics",
"hour": 22,
"minute": 0,
"description": "분석봇 일일 리포트"
}
]
}

49
config/sources.json Normal file
View File

@@ -0,0 +1,49 @@
{
"rss_feeds": [
{
"name": "GeekNews",
"url": "https://feeds.feedburner.com/geeknews-feed",
"category": "tech",
"trust_level": "high"
},
{
"name": "ZDNet Korea",
"url": "https://www.zdnet.co.kr/rss/rss.php",
"category": "tech",
"trust_level": "high"
},
{
"name": "Yonhap IT",
"url": "https://www.yna.co.kr/rss/it.xml",
"category": "tech",
"trust_level": "high"
},
{
"name": "Bloter",
"url": "https://www.bloter.net/feed",
"category": "tech",
"trust_level": "high"
}
],
"x_keywords": [
"바이브코딩",
"vibe coding",
"AI 자동화",
"Claude 사용",
"ChatGPT 활용",
"비개발자 앱",
"노코드 AI"
],
"github_trending": {
"url": "https://github.com/trending",
"languages": ["", "python", "javascript"],
"since": "daily"
},
"hacker_news": {
"url": "https://hacker-news.firebaseio.com/v0/topstories.json",
"top_n": 30
},
"product_hunt": {
"rss_url": "https://www.producthunt.com/feed"
}
}