From 0aa1393058982cc7fa28065d49f938c6c942be17 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Sun, 7 Sep 2025 00:40:46 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=89=B4=EC=8A=A4=20=EC=8B=9C=EC=8A=A4?= =?UTF-8?q?=ED=85=9C=20=ED=86=B5=ED=95=A9=20=EA=B3=84=ED=9A=8D=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20-=20companyx-search=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plan/250906_news_system_integration.md | 40 +++++++++++++++----------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/plan/250906_news_system_integration.md b/plan/250906_news_system_integration.md index 3e42355..c286cb6 100644 --- a/plan/250906_news_system_integration.md +++ b/plan/250906_news_system_integration.md @@ -31,11 +31,11 @@ ### 2.1 뉴스 수집 및 채널 전송 ``` -APScheduler → skill-news:8505/api/news/search +APScheduler → skill-news:8505/api/news/google/companyx-search → rb8001/app/skills/news_posting_skill.py → Slack 채널 전송 ``` -**참고**: 고급 검색 기능 company-x_hompage에 구현됨 +**구현**: companyx_news_collector.py (OR 연산자, 제외 키워드 적용) ### 2.2 사용자 인터랙션 (목표) ``` @@ -54,10 +54,18 @@ rb8001 → POST skill-publish:8511/publish ## 3. 필요 구현 사항 +### 3.0 컴퍼니엑스 전용 검색 (skill-news) +**파일**: app/services/companyx_news_collector.py (신규) +**엔드포인트**: /api/news/google/companyx-search (news_endpoints.py:63) +**검색식**: `"컴퍼니엑스" OR "Company X" -광고 -채용 -구인` +**환경변수**: COMPANY_X_NEWS_KEYWORDS (기본값 내장) + ### 3.1 Slack Block Kit 메시지 (rb8001) -**위치**: app/skills/news_posting_skill.py (신규) -**함수**: send_news_for_posting(), create_news_blocks() -**참고**: naver_startup_news_service.py +**위치**: app/skills/news_posting_skill.py (신규 생성) +**함수**: +- `send_news_for_posting()`: 채널에 뉴스 전송 +- `create_news_blocks()`: Block Kit 메시지 생성 +- `process_news_batch()`: APScheduler에서 호출 ```python blocks = [ { @@ -72,20 +80,18 @@ blocks = [ } ] ``` -**확인됨**: Block Kit 구조 (250828_slack_message_formatting_guide.md 참조) +**참고**: naver_startup_news_service.py, dm_skill.py:384 (DM 전송 로직) ### 3.2 Interactive Endpoint (rb8001) -**위치**: main.py 또는 slack_endpoint.py +**위치**: main.py:248 (slack_events 아래 추가) ```python -@app.post("/slack/interactive") -async def handle_interaction(request: Request): - # payload 파싱 - # action_id 확인 (publish_news_*) - # skill-publish 호출 - # 결과 응답 +@app.post("/api/slack/interactive") +async def slack_interactive(request: Request): + return await handle_interactive(request) # slack_handler.py ``` -**구현 필요**: 엔드포인트 없음 (새로 구현 필요) -**확인 필요**: Slack App 설정의 Interactive URL +**핸들러**: slack_handler.py에 handle_interactive() 추가 +**구현 방식**: 기존 handle() 패턴 따라 payload 파싱, action_id 확인 +**URL 설정**: Slack App에 https://ro-being.com/api/slack/interactive 등록 ### 3.3 skill-publish 연동 (rb8001) **위치**: news_posting_skill.py 내부 함수 @@ -97,6 +103,7 @@ async def publish_to_squarespace(news_data): json=news_data ) ``` +**호출 위치**: slack_handler.handle_interactive() → publish_to_squarespace() **결정**: localhost 사용 (rb8001이 모든 스킬을 localhost로 호출 중) ### 3.4 데이터 저장 전략 @@ -109,9 +116,10 @@ async def publish_to_squarespace(news_data): ### rb8001 (.env) ```bash COMPANY_X_NEWS_CHANNEL_ID=C09CP4MDX71 -COMPANY_X_NEWS_KEYWORDS=컴퍼니엑스,COMPANY X,Company-X +COMPANY_X_NEWS_KEYWORDS=컴퍼니엑스,컴퍼니 엑스,Company X COMPANY_X_NEWS_SCHEDULE=0 10 * * 1-5 # cron SKILL_PUBLISH_URL=http://localhost:8511 +SKILL_NEWS_URL=http://localhost:8505 ``` ### skill-publish (.env)