diff --git a/plan/250906_news_skill_publish_separation.md b/plan/250906_news_skill_publish_separation.md index 2e11beb..f81b84b 100644 --- a/plan/250906_news_skill_publish_separation.md +++ b/plan/250906_news_skill_publish_separation.md @@ -13,17 +13,17 @@ ## 3. 구현 계획 -### Phase 1: skill-news (✅ 운영 중) -**기존 코드 재사용 (company-x_hompage/src/)**: -- collectors/google_news_collector.py (100% 재사용) -- collectors/scrape_news_playwright.py (100% 재사용) -- collectors/summarize_news.py (✅ Gemini 2.5-flash-lite 전환) -- utils/process_lock.py (완전 구현됨) -- collectors/thumbnail_manager.py (이미지 처리) +### Phase 1: skill-news (✅ 운영 중 - Company-X 개선) +**2025-09-07 개선사항**: +- ✅ rb8001 → skill-news POST 파라미터 전달 +- ✅ 중복 체크 collector 내부로 이동 (엔드포인트 제거) +- ✅ Company-X 전용 봇 토큰 분리 (COMPANY_X_SLACK_BOT_TOKEN) +- ✅ 뉴스 없을 때 메시지 비활성화 +- [상세: troubleshooting/250907_company_x_news_zero_articles.md] -**새로 구현**: -- Slack 인터랙션 핸들러 (rb8001 DMSkill 참조) -- ~~APScheduler 통합~~ (✅ rb8001에 이미 구현됨) +**기존 구현**: +- collectors/google_news_collector.py (companyx_news_collector로 분리) +- Slack 인터랙션 핸들러 (rb8001 연동) ### Phase 2: skill-publish (✅ 완료) **구현 상세**: [트러블슈팅 문서](../troubleshooting/250906_skill_publish_implementation.md) 참조 diff --git a/troubleshooting/250907_company_x_news_zero_articles.md b/troubleshooting/250907_company_x_news_zero_articles.md new file mode 100644 index 0000000..399d6a9 --- /dev/null +++ b/troubleshooting/250907_company_x_news_zero_articles.md @@ -0,0 +1,91 @@ +# Company-X 뉴스 15개 찾았는데 0개 전달 문제 + +## 작성일: 2025-09-07 +## 작성자: happybell80 +## 환경: rb8001, skill-news, Docker + +## 문제 증상 +- skill-news가 Google에서 15개 뉴스 수집 성공 +- rb8001이 받은 기사는 0개 +- "오늘은 Company-X 관련 뉴스가 없습니다" 메시지 전송 + +## 원인 분석 + +### 1. 잘못된 중복 체크 위치 +```python +# skill-news/app/api/news_endpoints.py (문제 코드) +# 엔드포인트에서 ChromaDB로 중복 체크 +for article in articles: + if not news_manager.check_duplicate(article): # 15개 모두 필터링 + new_articles.append(article) +``` + +### 2. 파라미터 전달 문제 +- rb8001이 GET 요청만 보냄 (파라미터 없음) +- 환경변수 split() 방식 오류 (공백 vs 쉼표) +- exclude_keywords 미처리 + +## 해결 과정 + +### 1. rb8001 → skill-news 파라미터 전달 (POST 변경) +```python +# rb8001/app/skills/news_posting_skill.py +response = await client.post( # GET → POST + f"{self.skill_news_url}/api/news/google/companyx-search", + json={ + "keywords": os.getenv("COMPANY_X_NEWS_KEYWORDS").split(","), + "exclude_keywords": os.getenv("COMPANY_X_EXCLUDE_KEYWORDS").split(","), + "max_items": int(os.getenv("COMPANY_X_NEWS_MAX_ITEMS", "10")), + "days_back": int(os.getenv("COMPANY_X_NEWS_DAYS_BACK", "7")) + } +) +``` + +### 2. 중복 체크 collector로 이동 +```python +# companyx_news_collector.py +- JSON 파일로 히스토리 관리 (/app/data/companyx_history.json) +- 최근 100개 기사 기록 유지 +- collector 내부에서 중복 필터링 +``` + +### 3. 엔드포인트 단순화 +```python +# 삭제된 코드 +- news_manager.check_duplicate() 제거 +- news_manager.save_articles() 제거 +- new_articles → articles 직접 사용 +``` + +### 4. Company-X 전용 봇 토큰 +```python +# COMPANY_X_SLACK_BOT_TOKEN 사용 +self.slack_client = WebClient(token=os.getenv("COMPANY_X_SLACK_BOT_TOKEN")) +``` + +### 5. 뉴스 없을 때 메시지 비활성화 +```python +if not articles: + return {"success": True, "articles_count": 0, "messages_sent": 0} +``` + +## 환경변수 정리 +```bash +# rb8001 +COMPANY_X_NEWS_KEYWORDS=컴퍼니 엑스,컴퍼니엑스,Company X +COMPANY_X_EXCLUDE_KEYWORDS=광고,채용,구인 +COMPANY_X_NEWS_MAX_ITEMS=10 +COMPANY_X_NEWS_DAYS_BACK=7 +COMPANY_X_SLACK_BOT_TOKEN=xoxb-9417291383105-... +``` + +## 핵심 교훈 +1. **중복 체크는 collector 책임** - 엔드포인트는 전달만 +2. **파라미터 명시적 전달** - 환경변수 의존 대신 POST로 전송 +3. **서비스 간 독립성** - skill-news는 rb8001 환경변수 모름 +4. **적절한 계층 분리** - Controller/Service/Collector 역할 명확히 + +## 결과 +- 새로운 Company-X 뉴스만 전달 +- 중복 뉴스 자동 필터링 +- 뉴스 없을 때 조용히 종료 \ No newline at end of file