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>
This commit is contained in:
JOUNGWOOK KWON
2026-03-30 09:21:14 +09:00
parent 66be55ba8a
commit 3e2405dff9
36 changed files with 3380 additions and 84 deletions

View File

@@ -3,12 +3,13 @@
{
"id": "main",
"blog_id": "${BLOG_MAIN_ID}",
"name": "테크인사이더",
"persona": "tech_insider",
"domain": "",
"name": "AI? 그게 뭔데?",
"persona": "eli",
"domain": "eli-ai.blogspot.com",
"tagline": "어렵지 않아요, 그냥 읽어봐요",
"active": true,
"phase": 1,
"labels": ["쉬운세상", "숨은보물", "바이브리포트", "팩트체크", "한컷"]
"labels": ["AI인사이트", "여행맛집", "스타트업", "제품리뷰", "생활꿀팁", "앱추천", "재테크절약", "팩트체크"]
}
]
}

View File

@@ -2,7 +2,7 @@
"_comment": "The 4th Path 블로그 자동 수익 엔진 — 엔진 설정 (v3)",
"_updated": "2026-03-29",
"writing": {
"provider": "openclaw",
"provider": "gemini",
"_comment_provider": "openclaw=ChatGPT Pro(OAuth), claude_web=Claude Max(웹쿠키), gemini_web=Gemini Pro(웹쿠키), claude=Anthropic API키, gemini=Google AI API키",
"options": {
"openclaw": {
@@ -26,7 +26,7 @@
},
"gemini": {
"api_key_env": "GEMINI_API_KEY",
"model": "gemini-2.5-pro",
"model": "gemini-2.5-flash",
"max_tokens": 4096,
"temperature": 0.7
}
@@ -78,8 +78,13 @@
"provider": "smart_router",
"options": {
"smart_router": {
"priority": ["kling_free", "veo3", "seedance2", "ffmpeg_slides"],
"daily_cost_limit_usd": 0.50,
"priority": [
"kling_free",
"veo3",
"seedance2",
"ffmpeg_slides"
],
"daily_cost_limit_usd": 0.5,
"prefer_free_first": true,
"fallback": "ffmpeg_slides"
},
@@ -191,11 +196,11 @@
"analytics": "22:00"
},
"brand": {
"name": "The 4th Path",
"sub": "Independent Tech Media",
"by": "by 22B Labs",
"url": "the4thpath.com",
"cta": "팔로우하면 매일 이런 정보를 받습니다"
"name": "AI? 그게 뭔데?",
"sub": "eli의 쉽고 재미있는 이야기",
"by": "by eli",
"url": "eli-ai.blogspot.com",
"cta": "구독하면 매일 쉽고 재미있는 정보를 받습니다"
},
"optional_keys": {
"KLING_API_KEY": "Kling 3.0 AI 영상 생성 (66 무료 크레딧/일)",
@@ -204,4 +209,4 @@
"GEMINI_API_KEY": "Google Gemini 글쓰기 / Veo 영상",
"RUNWAY_API_KEY": "Runway Gen-3 AI 영상 생성"
}
}
}

View File

@@ -12,7 +12,7 @@
"legal_keywords": [
"불법", "위법", "처벌", "벌금", "징역", "기소"
],
"always_manual_review": ["팩트체크"],
"always_manual_review": ["팩트체크", "재테크절약"],
"min_sources_required": 2,
"min_quality_score_for_auto": 75
"min_quality_score_for_auto": 101
}

View File

@@ -1,38 +1,62 @@
{
"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"
}
{ "name": "GeekNews", "url": "https://feeds.feedburner.com/geeknews-feed", "category": "AI인사이트", "trust_level": "high" },
{ "name": "ZDNet Korea", "url": "https://www.zdnet.co.kr/rss/rss.php", "category": "AI인사이트", "trust_level": "high" },
{ "name": "연합뉴스 IT", "url": "https://www.yna.co.kr/rss/it.xml", "category": "AI인사이트", "trust_level": "high" },
{ "name": "AI타임스", "url": "https://www.aitimes.com/rss/allArticle.xml", "category": "AI인사이트", "trust_level": "medium" },
{ "name": "테크크런치 AI", "url": "https://techcrunch.com/category/artificial-intelligence/feed/", "category": "AI인사이트", "trust_level": "high" },
{ "name": "MIT 테크리뷰", "url": "https://www.technologyreview.com/feed/", "category": "AI인사이트", "trust_level": "high" },
{ "name": "전자신문", "url": "https://www.etnews.com/rss/rss.xml", "category": "AI인사이트", "trust_level": "high" },
{ "name": "Bloter", "url": "https://www.bloter.net/feed", "category": "스타트업", "trust_level": "high" },
{ "name": "플래텀", "url": "https://platum.kr/feed", "category": "스타트업", "trust_level": "high" },
{ "name": "벤처스퀘어", "url": "https://www.venturesquare.net/feed", "category": "스타트업", "trust_level": "medium" },
{ "name": "한국경제 IT", "url": "https://www.hankyung.com/feed/it", "category": "스타트업", "trust_level": "high" },
{ "name": "테크크런치 스타트업","url": "https://techcrunch.com/category/startups/feed/", "category": "스타트업", "trust_level": "high" },
{ "name": "IT동아", "url": "https://it.donga.com/rss/", "category": "스타트업", "trust_level": "medium" },
{ "name": "연합뉴스 여행", "url": "https://www.yna.co.kr/rss/travel.xml", "category": "여행맛집", "trust_level": "high" },
{ "name": "경향신문 여행", "url": "https://www.khan.co.kr/rss/rssdata/kh_travel.xml", "category": "여행맛집", "trust_level": "medium" },
{ "name": "한국관광공사", "url": "https://kto.visitkorea.or.kr/rss/rss.kto", "category": "여행맛집", "trust_level": "medium" },
{ "name": "대한항공 뉴스", "url": "https://www.koreanair.com/content/koreanair/global/en/footer/about-korean-air/news-and-pr/press-releases.rss.xml", "category": "여행맛집", "trust_level": "medium" },
{ "name": "론리플래닛", "url": "https://www.lonelyplanet.com/news/feed", "category": "여행맛집", "trust_level": "medium" },
{ "name": "ITWorld Korea", "url": "https://www.itworld.co.kr/rss/feed", "category": "제품리뷰", "trust_level": "medium" },
{ "name": "디지털데일리", "url": "https://www.ddaily.co.kr/rss/rss.xml", "category": "제품리뷰", "trust_level": "medium" },
{ "name": "The Verge", "url": "https://www.theverge.com/rss/index.xml", "category": "제품리뷰", "trust_level": "high" },
{ "name": "Engadget", "url": "https://www.engadget.com/rss.xml", "category": "제품리뷰", "trust_level": "high" },
{ "name": "위키트리", "url": "https://www.wikitree.co.kr/rss/", "category": "생활꿀팁", "trust_level": "medium" },
{ "name": "오마이뉴스 라이프", "url": "https://rss2.ohmynews.com/rss/ohmyrss.xml", "category": "생활꿀팁", "trust_level": "medium" },
{ "name": "헬스조선", "url": "https://health.chosun.com/site/data/rss/rss.xml", "category": "생활꿀팁", "trust_level": "medium" },
{ "name": "조선일보 라이프", "url": "https://www.chosun.com/arc/outboundfeeds/rss/category/life/", "category": "생활꿀팁", "trust_level": "high" },
{ "name": "Product Hunt", "url": "https://www.producthunt.com/feed", "category": "앱추천", "trust_level": "medium" },
{ "name": "테크크런치 앱", "url": "https://techcrunch.com/category/apps/feed/", "category": "앱추천", "trust_level": "high" },
{ "name": "앱스토리", "url": "https://www.appstory.co.kr/rss/rss.xml", "category": "앱추천", "trust_level": "medium" },
{ "name": "매일경제 IT", "url": "https://rss.mk.co.kr/rss/30000001/", "category": "재테크절약", "trust_level": "high" },
{ "name": "머니투데이", "url": "https://rss.mt.co.kr/news/mt_news.xml", "category": "재테크절약", "trust_level": "high" },
{ "name": "한국경제 재테크", "url": "https://www.hankyung.com/feed/finance", "category": "재테크절약", "trust_level": "high" },
{ "name": "뱅크샐러드 블로그", "url": "https://blog.banksalad.com/rss.xml", "category": "재테크절약", "trust_level": "medium" },
{ "name": "서울경제", "url": "https://www.sedaily.com/rss/rss.xml", "category": "재테크절약", "trust_level": "high" },
{ "name": "연합뉴스 팩트체크", "url": "https://www.yna.co.kr/rss/factcheck.xml", "category": "팩트체크", "trust_level": "high" },
{ "name": "SBS 뉴스", "url": "https://news.sbs.co.kr/news/SectionRssFeed.do?sectionId=01&plink=RSSREADER", "category": "팩트체크", "trust_level": "high" },
{ "name": "KBS 뉴스", "url": "https://news.kbs.co.kr/rss/rss.xml", "category": "팩트체크", "trust_level": "high" },
{ "name": "JTBC 뉴스", "url": "https://fs.jtbc.co.kr/RSS/newsflash.xml", "category": "팩트체크", "trust_level": "high" }
],
"x_keywords": [
"바이브코딩",
"vibe coding",
"AI 자동화",
"Claude 사용",
"AI 사용법",
"ChatGPT 활용",
"비개발자 앱",
"노코드 AI"
"Claude 사용",
"인공지능 추천",
"앱 추천",
"생활꿀팁",
"맛집 추천",
"스타트업 소식",
"재테크 방법",
"쇼핑 추천"
],
"github_trending": {
"url": "https://github.com/trending",