feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크 - #1

Merged
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE
Jul 23, 2026
Merged

feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크#1
Kevinlee7250 merged 1206 commits into
latestfrom
claude/blog-automation-system-KAbtE

Conversation

@Kevinlee7250

@Kevinlee7250Kevinlee7250 commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

블로그 자동화 시스템 전체 기능 + 최신 업데이트 포함

최신 추가: 쿠팡파트너스 링크 자동 삽입

  • coupang_affiliate.py 신규 모듈: 글 하단 고정 위치에 파트너스 링크 섹션 삽입
  • 키워드·블로그 ID 기준 매칭 (태그 없으면 전체 글에 표시)
  • AdSense 자동 광고와 겹치지 않도록 본문 HTML 맨 끝 배치
  • 시리즈·일반 생성 양쪽에 적용
  • 대시보드 시스템 관리 ⑨번에 링크 관리 UI (추가/편집/삭제 모달, GitHub 직접 저장)

기존 기능

  • Claude Sonnet 5 adaptive thinking 대응: claude_generate() 이어쓰기 로직
  • AdSense 품질 80점 기준 자동 검증 + pending 저장
  • 멀티블로그 지원 (blog1/2/3), blogs.json 레지스트리
  • Pixabay 이미지 자동 삽입, 관련성 검증
  • 소셜 미디어 자동 발행 (Instagram, Threads)
  • 주간 학습 + 자동 수리 리포트
  • 대시보드 GitHub Pages (https://kevinlee7250.github.io/cli/)

Test plan

  • 쿠팡파트너스 링크를 대시보드에서 추가 → GitHub에 저장 버튼
  • 글 생성 실행 후 글 하단에 추천 상품 섹션 표시 확인
  • 키워드 태그 매칭 (예: ETF 태그 → ETF 관련 글에만 표시)
  • AdSense 자동 광고와 겹치지 않는지 확인

https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev

Kevinlee7250 pushed a commit that referenced this pull request Jun 2, 2026
Keyword Analyzer:
- Trend direction weighting (rising +60pts, risingRate>50% +30pts)
- AdSense CPC estimation by category (금융 $2.5, 법률 $3.2, 부동산 $2.8 etc.)
- analyzeNaverDatalabResults() for MCP-based external data ingestion
Blog Content Generator:
- FAQ section (5 Q&A) targeting Google Featured Snippets
- Article + FAQPage JSON-LD structured data
- 3-slot AdSense injection ([광고슬롯1], [광고슬롯2] markers)
- injectAdSenseSlots() and buildFAQStructuredData() helpers
- Increased max_tokens to 6000 for richer posts (2000+ chars)
Thumbnail Generator (v2):
- 6 color themes (added neon-green, gold-dark)
- Trend rank badge (#1 HOT / 🚀 급상승)
- Rising indicator arrow for trending keywords
- News count badge + category label
- Gradient accent line (two-color gradient)
- Vertical thumbnail: 3-zone layout with CTA button
Social Content Generator (v2):
- Optimal posting time recommendations per platform
- Instagram: save-rate optimization ("저장 필수 🔖"), story highlight title
- Instagram: 3-tier hashtag strategy (popular/medium/niche)
- Threads: engagement question per thread chain
- TikTok: per-scene sound effects + full narration script
- getNextOptimalPostingTime() utility
Blogger Publisher (v2):
- 3-slot AdSense placement (top/mid1/mid2/bottom)
- FAQPage structured data injection
- Article schema with dateModified
- Collapsible FAQ <details> UI
New: analytics.js
- AdSense earnings estimation (CPC × CTR × PV)
- Daily/monthly/yearly revenue projections
- 90-day run history tracking
- printEarningsReport() formatted output
New: preview-report.js
- Full HTML preview report (dark theme)
- Per-post: title, meta, FAQ, SNS previews, earnings estimate
- TikTok scene table, Instagram hashtag preview, Threads chain view
Orchestrator (v2):
- --preview mode: generate all content without publishing
- --draft mode: Blogger draft save only, no SNS
- publishWithRetry() with exponential backoff (3 attempts)
- AdSense earnings report printed after each run
- recordRunStats() for cumulative analytics
https://claude.ai/code/session_0119g48zQT4kK7dKFk9on5Ev
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system for AdSense monetizationfeat: blog automation system v2 — AdSense 최적화 + SNS 자동화Jun 2, 2026
@Kevinlee7250Kevinlee7250 changed the title feat: blog automation system v2 — AdSense 최적화 + SNS 자동화feat: 블로그 자동화 시스템 v2 — 웹 대시보드 + GitHub Pages + 팩트체크Jun 3, 2026
github-actionsBotand others added 30 commits July 22, 2026 12:32
_engagement_block()이 여행/스포츠/드라마·연예/금융 4개 카테고리에
동일한 체류 지침을 쓰던 것을 _detect_content_category()로 분기해
카테고리별 도입부 후킹 방식을 다르게 지시하도록 변경:
- 금융: 숫자·근거로 시작 (신뢰 우선)
- 스포츠: 결과·핵심부터 공개 (속보 읽기 패턴)
- 드라마·연예: 장면·감정으로 시작 + 긴장-전개-해소 곡선
- 여행·일반: 공감 유발 상황 제시
블로그ID 우선, 없으면 키워드 토큰으로 카테고리 판별. 낚시 금지·
모바일 가독성 등 공통 규칙은 유지. 회귀 테스트 7건 추가.
어제 추가한 _detect_content_category() 결과(finance/sports/drama/travel)를
post_data에서 registry(post_manager)·run_history(dashboard_exporter)·
posts.json까지 끊기지 않고 흘려보내도록 연결. pending 검토 저장 경로도 포함.
blog_analytics.py에 contentCategoryBreakdown 집계 추가 — 카테고리별
등급 분포·예상 조회수를 analytics_summary.json에 기록해, 새 도입부
후킹 스타일이 실제로 효과가 있었는지 다음 분석 실행부터 비교 가능.
회귀 테스트 2건 추가 (등록·실행이력 경로 태그 전달 확인).
readability_checker.py: 생성된 본문에서 평균 문장 길이, 긴 문장 비율,
카테고리별 전문용어(금융/스포츠/드라마/여행)가 쉬운 설명 표현
("쉽게 말해" 등) 없이 쓰였는지를 스캔.
content_generator.py의 generate_post()/generate_series_post() 재시도
루프(기존 분량 미달 재시도와 동일한 패턴)에 연결 — 기준 미달 시 같은
요청 안에서 최대 2회 재작성을 요청하고, 재시도 소진 시 경고 로그만
남기고 그대로 진행(발행 차단은 안 함). 결과는 post_data["readability"]
에 기록되어 추후 등급·GSC 지표와 비교 가능.
회귀 테스트 7건 추가.
_inject_mid_article_faq(): 글 끝에 몰려있던 FAQ 카드 중 첫 번째를
복제해 본문 H2 섹션들의 중간 지점(이탈이 가장 잦은 구간)에도 배치.
끝의 전체 FAQ 목록은 SEO·스키마용으로 그대로 유지하고, 중간에는
"잠깐, 이것도 궁금하지 않으세요?" 문구와 함께 카드 1개만 추가.
H2 섹션이 3개 미만이면(끼워 넣을 지점이 마땅치 않음) 건드리지 않음.
_apply_design()의 FAQ 카드 스타일링 직후에 연결. 회귀 테스트 5건 추가.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude