--- name: scraping-orchestrator description: "GUARDiA ITSM 웹 스크랩핑 봇 오케스트레이터. URL 스크랩, DB 저장, 상태관리(DRAFT/PUBLISHED/DELETED), 메신저 알림, Manager UI 연동을 조율한다. 다음 상황에서 반드시 사용: (1) '스크랩', '웹 수집', 'URL 수집', '스크랩핑 봇' 요청; (2) '게시', '원복', '스크랩 삭제' 요청; (3) '!scrap' 봇 명령어 처리; (4) 스크랩 결과 조회, 타겟 등록; (5) 다시 실행, 업데이트, 수정, 보완 요청." --- # GUARDiA 스크랩핑 오케스트레이터 ## 에이전트 팀 | 에이전트 | 역할 | |---------|------| | scraping-bot | URL 스크랩 실행, 상태 전환, 메신저 알림 | ## 상태 흐름 ``` URL 등록(ScrapingTarget) → 즉시 또는 스케줄 스크랩 → DRAFT (저장됨) → PUBLISHED (게시 + 메신저 알림) → DELETED (소프트 삭제) → DRAFT (원복) ``` ## Phase 0: 요청 분류 - **타겟 등록** → `POST /api/scraping/targets` - **즉시 스크랩** → `POST /api/scraping/run` - **결과 조회** → `GET /api/scraping/results` - **게시** → `POST /api/scraping/results/{id}/publish` - **삭제** → `DELETE /api/scraping/results/{id}` - **원복** → `POST /api/scraping/results/{id}/restore` ## Phase 1: 스크랩 실행 ``` POST /api/scraping/run { "url": "...", "selector": ".content", "target_id": null } 응답: { id, title, content, status: "DRAFT", scraped_at } ``` ## Phase 2: 게시 ``` POST /api/scraping/results/{id}/publish { "room": "ops", "message": "커스텀 메시지 (선택)" } → status: PUBLISHED → POST /api/messenger/webhook (scrap_published 이벤트) ``` ## Phase 3: 삭제/원복 ``` DELETE /api/scraping/results/{id} → status: DELETED POST /api/scraping/results/{id}/restore → status: DRAFT ``` ## 봇 명령어 (messenger.py) | 명령어 | API 호출 | |--------|---------| | `!scrap ` | POST /api/scraping/run | | `!scrap list [n]` | GET /api/scraping/results?size=n | | `!scrap publish ` | POST /api/scraping/results/{id}/publish | | `!scrap del ` | DELETE /api/scraping/results/{id} | | `!scrap restore ` | POST /api/scraping/results/{id}/restore | | `!scrap status ` | GET /api/scraping/results/{id} | ## 테스트 시나리오 정상: POST run → DRAFT → publish → PUBLISHED → messenger 수신 오류: 존재하지 않는 URL → status=FAILED, 서비스 무중단