guardia-itsm/.claude/skills/scraping-orchestrator/SKILL.md
DESKTOP-TKLFCPRython 9514379a96 feat(scraping): 웹 스크랩핑 봇 전체 구현 + 하네스 구성
[하네스]
- agents/scraping-bot.md: 스크랩 봇 에이전트
- skills/scraping-orchestrator/SKILL.md: E2E 워크플로우

[ITSM Backend]
- models.py: ScrapingTarget + ScrapingResult ORM + Pydantic 스키마
- core/scraping_engine.py: BeautifulSoup 기반 비동기 스크래퍼
- routers/scraping.py: 13개 API (타겟 CRUD + run + 게시/삭제/원복 + 통계)
- routers/messenger.py: !scrap 봇 명령어 6종 + scrap_published 이벤트
- main.py: scraping 라우터 등록

[Manager UI]
- ScrapingManager.tsx: 결과 목록/상세/게시/삭제/원복 + 타겟 관리
- Sidebar.tsx: 🕷️ 스크랩핑 봇 메뉴 추가
- App.tsx: /scraping 라우트 추가

[테스트 결과 - 전체 통과]
- T1 타겟 등록 OK
- T2 즉시 스크랩: zioinfo.co.kr → DRAFT
- T3 결과 목록 조회 OK
- T4 게시: DRAFT → PUBLISHED + 메신저 알림
- T5/T6/T7 두번째 스크랩 → 삭제 → 원복 OK
- T8 통계: draft:1, published:1, deleted:0
- T9 !scrap list 봇 명령어 OK
- T10 !scrap status 봇 명령어 OK

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:52:49 +09:00

2.4 KiB

name description
scraping-orchestrator 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 <url> POST /api/scraping/run
!scrap list [n] GET /api/scraping/results?size=n
!scrap publish <id> POST /api/scraping/results/{id}/publish
!scrap del <id> DELETE /api/scraping/results/{id}
!scrap restore <id> POST /api/scraping/results/{id}/restore
!scrap status <id> GET /api/scraping/results/{id}

테스트 시나리오

정상: POST run → DRAFT → publish → PUBLISHED → messenger 수신 오류: 존재하지 않는 URL → status=FAILED, 서비스 무중단