From 1de9764aa88bccca0d2ec0e3b3489d6d4ccd10b7 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Sat, 6 Sep 2025 17:34:24 +0900 Subject: [PATCH] =?UTF-8?q?Add:=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=EB=AC=B8?= =?UTF-8?q?=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 현재 구현 상태 명확히 기록 - Slack 인터랙티브 버튼 구현 계획 - rb8001 ↔ skill-publish 연동 방안 - 확인 필요/결정 필요 사항 명시 - 150줄 제한 준수 --- plan/250906_news_system_integration.md | 162 +++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 plan/250906_news_system_integration.md diff --git a/plan/250906_news_system_integration.md b/plan/250906_news_system_integration.md new file mode 100644 index 0000000..49573c2 --- /dev/null +++ b/plan/250906_news_system_integration.md @@ -0,0 +1,162 @@ +# 뉴스 시스템 통합 계획 + +## 작성일: 2025-09-06 +## 작성자: happybell80 +## 목적: skill-news, rb8001, skill-publish 통합 연동 + +## 1. 현재 구현 상태 + +### 구현 완료 (확인됨) +- **skill-news** (포트 8505): 뉴스 수집, 스크래핑, 요약 API 운영 중 +- **skill-publish** (포트 8511): Squarespace 게시 서비스 준비 완료 +- **APScheduler**: rb8001/main.py:207 평일 09:00 자동 실행 +- **DM 전송**: rb8001/app/skills/dm_skill.py:384 텍스트 메시지 전송 +- **Gemini 요약**: gemini-2.5-flash-lite 모델 사용 중 +- **JSON 상태 관리**: /app/data/news_state.json 파일 기반 + +### 미구현 (확인됨) +- **Slack 인터랙티브 버튼**: Block Kit 미적용 +- **Button Callback 처리**: /slack/interactive 엔드포인트 없음 +- **rb8001↔skill-publish 연동**: HTTP 통신 코드 없음 +- **DB 저장**: rb_news 테이블 없음 (DB 작업 대기) +- **게시 결과 알림**: Slack 응답 메시지 미구현 + +## 2. 통합 플로우 + +### 2.1 뉴스 수집 및 DM 전송 (09:00) +``` +APScheduler → skill-news:8505/api/news/search + → rb8001 dm_skill.get_news_content() + → Slack DM 전송 (현재: 텍스트만) +``` + +### 2.2 사용자 인터랙션 (목표) +``` +사용자 버튼 클릭 → rb8001/slack/interactive + → 검증 및 처리 + → skill-publish 호출 +``` + +### 2.3 게시 프로세스 (목표) +``` +rb8001 → POST skill-publish:8511/publish + → Squarespace 자동 게시 + → 결과 반환 + → Slack DM 알림 +``` + +## 3. 필요 구현 사항 + +### 3.1 Slack Block Kit 메시지 (rb8001) +**위치**: dm_skill.py:send_daily_summary_dm() +```python +blocks = [ + { + "type": "section", + "text": {"type": "mrkdwn", "text": f"*{title}*\n{summary}"}, + "accessory": { + "type": "button", + "text": {"type": "plain_text", "text": "게시"}, + "action_id": f"publish_news_{news_id}", + "value": news_id + } + } +] +``` +**확인 필요**: Block Kit 권한, 메시지 구조 + +### 3.2 Interactive Endpoint (rb8001) +**위치**: main.py 또는 slack_endpoint.py +```python +@app.post("/slack/interactive") +async def handle_interaction(request: Request): + # payload 파싱 + # action_id 확인 (publish_news_*) + # skill-publish 호출 + # 결과 응답 +``` +**확인 필요**: Slack App 설정의 Interactive URL + +### 3.3 skill-publish 연동 (rb8001) +**위치**: 새 파일 app/skills/publish_integration.py +```python +async def publish_to_squarespace(news_data): + async with httpx.AsyncClient() as client: + response = await client.post( + "http://skill-publish:8511/publish", + json=news_data + ) +``` +**결정 필요**: 내부 통신 방식 (Docker network vs localhost) + +### 3.4 데이터 저장 전략 +**현재**: JSON 파일 (/app/data/news_state.json) +**향후**: PostgreSQL rb_news 테이블 +**결정 필요**: 마이그레이션 시점, 스키마 설계 + +## 4. 환경변수 설정 + +### rb8001 (.env) +```bash +SKILL_PUBLISH_URL=http://skill-publish:8511 # 확인 필요 +SLACK_APP_TOKEN=xapp-... # Interactive 필요시 +``` + +### skill-publish (.env) +```bash +# 이미 설정됨 (포트 8511) +``` + +## 5. Slack App 설정 +**확인 필요**: +- Interactivity & Shortcuts 활성화 여부 +- Request URL: https://ro-being.com/api/slack/interactive +- OAuth Scopes: chat:write, commands, im:history + +## 6. 구현 우선순위 + +### Phase 1 (즉시) +1. Slack Block Kit 메시지 구현 +2. Interactive endpoint 추가 +3. 테스트 (버튼 클릭 → 로그 확인) + +### Phase 2 (다음 주) +1. skill-publish 연동 코드 +2. 게시 결과 Slack 알림 +3. 상태 추적 (JSON 기반) + +### Phase 3 (DB 준비 후) +1. rb_news 테이블 생성 +2. JSON → DB 마이그레이션 +3. 이력 조회 API + +## 7. 테스트 시나리오 +1. 수동 트리거: POST rb8001:8001/api/cron/daily-summary +2. 버튼 표시 확인 +3. 클릭 이벤트 수신 확인 +4. skill-publish 호출 확인 +5. 게시 완료 확인 + +## 8. 리스크 및 대안 +- **Slack 권한 부족**: App 재설치 필요할 수 있음 +- **Docker 네트워크**: 통신 실패시 localhost 사용 +- **DB 지연**: JSON 파일로 충분히 운영 가능 + +## 9. 모니터링 +```bash +# Interactive 이벤트 확인 +docker logs rb8001 | grep interactive + +# 게시 요청 확인 +docker logs skill-publish | grep publish + +# Slack 전송 확인 +docker logs rb8001 | grep postMessage +``` + +## 10. 완료 기준 +- [ ] 뉴스에 게시 버튼 표시 +- [ ] 버튼 클릭시 게시 프로세스 시작 +- [ ] Squarespace 게시 완료 +- [ ] 사용자에게 결과 알림 +- [ ] 상태 저장 및 조회 가능 \ No newline at end of file