# task-255.1 완료 보고서: 블로그 홍보성 감지 조건 수정 (3건)

**담당팀**: dev1-team (헤르메스 팀장)
**작업자**: 불칸(백엔드), 이리스(프론트엔드), 아르고스(테스터)
**완료일시**: 2026-03-04

---

## 작업 내용

### 1. LLM 홍보성 판별 (조건 5) 삭제
- `analyzer.py`에서 `judge_promotional` import 및 호출 코드 완전 제거
- 기존 5가지 조건 → 4가지 조건(전화번호/주소, 외부링크, 첨부파일, 이미지분석)만 유지

### 2. 네이버 블로그 템플릿/배너광고 링크 제외
- `blog_content.py`에 `_TEMPLATE_DOMAINS` 상수 추가 (creativecommons.org)
- `_AD_CONTAINER_SELECTORS` 상수 추가 (애드포스트, 배너광고 6개 선택자)
- `_is_template_domain()` 함수 추가
- `_extract_external_links()` 함수에 템플릿 도메인 + 광고 컨테이너 내 링크 제외 로직 추가

### 3. 네이버플레이스/톡톡 감지 강화
- `blog_content.py`에 `_detect_naver_special_links()` 함수 추가 (4가지 방법으로 감지)
  - `<a>` 태그 href 직접 검색
  - SmartEditor 지도 모듈 CSS 클래스 감지
  - `data-linkdata` JSON 내 link 필드 감지
  - `<iframe src>` 지도 URL 감지
- `get_blog_content()`에서 `_has_talktalk()`/`_has_place()` 대신 `_detect_naver_special_links()` 사용

### 4. analyzer.py 감지 경로 변경 + reason 세분화
- `detect_talktalk()`, `detect_place()` import 제거
- `content.get("has_talktalk")`, `content.get("has_place")` 사용으로 변경
- reason을 "external_links" 하나로 묶지 않고 "external_links", "naver_talktalk", "naver_place" 3개로 세분화

### 5. 프론트엔드 reason 매핑 업데이트
- `page.tsx`의 `reasonLabelMap`에 "naver_talktalk", "naver_place" 추가
- "llm_promotional" 항목 삭제

---

## 생성/수정 파일 목록

- `/home/jay/projects/InfoKeyword/worker/pipeline/analyzer.py` — 수정 (LLM 조건 삭제, 감지 경로 변경, reason 세분화)
- `/home/jay/projects/InfoKeyword/worker/crawler/blog_content.py` — 수정 (템플릿/광고 제외, 플레이스/톡톡 HTML 직접 감지)
- `/home/jay/projects/InfoKeyword/src/app/report/[id]/page.tsx` — 수정 (reason 한국어 매핑 업데이트)

---

## 테스트 결과

### 테스트 1: CCL 오감지 해소 (키워드: "가공육 암")
- rank=1: ext=0 talk=False place=False ✅
- rank=2: ext=0 talk=False place=False ✅
- rank=3: ext=0 talk=False place=False ✅
- creativecommons.org 링크가 정상적으로 제외됨

### 테스트 2: 실제 홍보 링크 정상 감지 (키워드: "암보험 추천")
- rank=4: ext=1 (vo.la 단축URL 정상 감지) ✅

### 서버 재시작
- Worker (port 8100): health check OK ✅
- Frontend (port 3100): HTTP 307 (로그인 리다이렉트, 정상) ✅
- Next.js 빌드: 성공 ✅

---

## 셀프 QC 결과

- [x] 1. 영향 파일 3개 명시됨
- [x] 2. 엣지 케이스: 빈 입력/파싱 실패 시 안전 처리 확인
- [x] 3. 작업 지시 100% 일치
- [x] 4. 에러 처리: try-except 적용, 보안 이슈 없음
- [x] 5. 테스트: CCL 제외 + 홍보 링크 정상 감지 2가지 시나리오 검증

## 자동 검증 결과 (qc_verify.py)

```json
{
  "task_id": "task-255.1",
  "overall": "PASS",
  "checks": {
    "api_health": "SKIP (서버 재시작 완료, 별도 확인 불필요)",
    "file_check": "PASS (3개 파일 존재 + 보고서/이벤트 파일 생성 완료)",
    "data_integrity": "PASS",
    "test_runner": "SKIP (통합 테스트 별도 실행)",
    "schema_contract": "SKIP (workers/ 하위 변경 없음)"
  }
}
```

---

## 버그 유무

없음

---

## 마아트 독립 검증 결과

**판정: PASS**
- 검증 항목 10개 전부 명세와 완전 일치 확인
- LLM 코드 완전 삭제, 템플릿 도메인/광고 컨테이너 필터, 플레이스/톡톡 HTML 직접 감지, reason 세분화, 프론트엔드 매핑 모두 정확
- 재작업 요청 사항: 없음
- 권고: `_has_talktalk()`, `_has_place()` dead code 향후 정리 권장

---

## 비고

- `llm_promotional.py` 모듈 파일 자체는 삭제하지 않았음 (다른 곳에서 참조 가능성, import만 제거)
- `_has_talktalk()`, `_has_place()` 기존 함수는 유지 (하위호환, blog_content.py 내부에서 직접 사용하지 않지만 외부 참조 가능)
