DOCS/plan/250906_news_system_integration.md
happybell80 9937d60abe Fix: App-level Token 관련 잘못된 정보 삭제
- App-level Token 불필요 확인
- Bot Token만으로 충분
- HTTP Mode 사용 확정
2025-09-06 17:57:57 +09:00

4.9 KiB

뉴스 시스템 통합 계획

작성일: 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()

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 구조 (250828_slack_message_formatting_guide.md 참조)

3.2 Interactive Endpoint (rb8001)

위치: main.py 또는 slack_endpoint.py

@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

async def publish_to_squarespace(news_data):
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "http://localhost:8511/publish",
            json=news_data
        )

결정: localhost 사용 (rb8001이 모든 스킬을 localhost로 호출 중)

3.4 데이터 저장 전략

현재: JSON 파일 (/app/data/news_state.json) 향후: PostgreSQL rb_news 테이블 결정: JSON 유지 (DB 작업 완료 후 마이그레이션)

4. 환경변수 설정

rb8001 (.env)

# 추가 환경변수 불필요
# Bot Token (xoxb-) 이미 설정됨

skill-publish (.env)

# 이미 설정됨 (포트 8511)

5. Slack App 설정

필요 작업:

  • Interactivity & Shortcuts 활성화 (HTTP Mode)
  • Request URL 설정: https://ro-being.com/api/slack/interactive
  • OAuth Scopes 확인됨: chat:write, chat:write.public (문서 확인)
  • 확인 필요: 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 재설치 필요할 수 있음
  • 통신 실패: 모든 서비스 localhost 사용으로 해결
  • DB 지연: JSON 파일로 충분히 운영 가능

9. 모니터링

# Interactive 이벤트 확인
docker logs rb8001 | grep interactive

# 게시 요청 확인  
docker logs skill-publish | grep publish

# Slack 전송 확인
docker logs rb8001 | grep postMessage

10. 완료 기준

  • 뉴스에 게시 버튼 표시
  • 버튼 클릭시 게시 프로세스 시작
  • Squarespace 게시 완료
  • 사용자에게 결과 알림
  • 상태 저장 및 조회 가능