# task-1534.1 완료 보고서: 네이버 블로그 발행 실행 테스트 — naver_playwright.py V2

## SCQA

**S**: naver_playwright.py V2(connectOverCDP + 클립보드 붙여넣기) 모듈이 구현 완료되었고, Chrome CDP(포트 9222)에 네이버 로그인 세션(NID_AUT/NID_SES)이 주입된 상태에서 실제 발행 테스트를 수행했다.

**C**: 발행 테스트 실행 결과, 세션이 "반만 살아있는(half-expired)" 상태로 판명되었다. NID_AUT/NID_SES 쿠키는 브라우저에 존재하나 서버 측 글쓰기 권한이 만료되어, 블로그 조회(blog.naver.com/incar_top)는 가능하지만 글쓰기 URL 접근 시 nid.naver.com 로그인 페이지로 리다이렉트된다. 또한 기존 `_verify_session()` 메서드가 이 반만료 상태를 감지하지 못해 false positive를 반환하는 버그와, `visibility='private'` 파라미터가 실제로는 공개 발행으로 처리되는 위험 버그를 발견했다.

**Q**: 세션 재주입 후 발행이 정상 동작할 것이며, 발견된 코드 버그는 해결되었는가?

**A**: 발견된 2건의 코드 버그를 즉시 수정하고 검증 완료했다. (1) `_verify_session()`에 글쓰기 URL 2차 검증을 추가하여 반만료 세션을 정확히 감지 (수정 전: True, 수정 후: False). (2) `visibility='private'`를 `'draft'`와 동일하게 임시저장으로 처리하도록 수정. 세션 재주입(수동 로그인 또는 쿠키 갱신) 후 재테스트 필요.

---

## 실행 결과

- 세션 검증: 기본(MyBlog.naver) 통과, **글쓰기(Write URL) 실패**
- 발행 결과: `{"success": false, "message": "세션 부분 만료..."}`
- 블록 수: 41개 (텍스트/인용구/이미지/구분선)
- 이미지: 3장 준비 완료 (thumbnail 885KB, body-consultation 529KB, body-team-meeting 647KB)
- 태그: 8개 준비 완료

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **`_verify_session()` false positive 버그** — 글쓰기 URL 2차 검증 추가
   - 수정: `/home/jay/projects/BlogAuto/publisher/naver_playwright.py:369-399`
   - 검증: 수정 전 `check_session()=True` → 수정 후 `check_session()=False` (반만료 세션 정상 감지)

2. **`visibility='private'` 공개 발행 위험 버그** — 'private'를 'draft'와 동일 처리
   - 수정: `/home/jay/projects/BlogAuto/publisher/naver_playwright.py:806` (`is_draft = visibility in ("draft", "private")`)
   - 수정: `/home/jay/projects/BlogAuto/publisher/naver_playwright.py:968` (CLI choices에 'private' 추가)
   - 검증: `visibility='private'`로 호출 시 draft 모드로 정상 동작 확인

### 범위 외 미해결 (1건)

1. **네이버 로그인 세션 만료** — 범위 외 사유: 서버 측 세션 만료는 수동 재로그인 또는 쿠키 재주입 필요 (코드로 해결 불가)

<details>
<summary>상세 수정 내역 (클릭하여 펼치기)</summary>

#### 이슈 1: _verify_session() false positive

- 발견 경위: 발행 테스트 시 세션 검증 통과 후 글쓰기 페이지에서 로그인 리다이렉트 발생. 쿠키 없는 incognito 컨텍스트에서 MyBlog.naver가 nid.naver.com으로 리다이렉트되는 반면, 만료 쿠키가 있는 상태에서는 블로그 공개 페이지로 리다이렉트되어 검증을 우회함.
- 원인 분석: `_verify_session()`이 MyBlog.naver URL만 체크. 네이버는 만료된 세션 쿠키라도 사용자 식별은 가능하여 블로그 공개 페이지로 리다이렉트하지만, 글쓰기는 완전한 인증이 필요.
- 수정 내용: MyBlog.naver 1차 검증 후, blog_id가 설정된 경우 글쓰기 URL(`blog.naver.com/{blog_id}?Redirect=Write`)로 2차 검증 추가. 로그인 리다이렉트 시 "세션 부분 만료" 에러 메시지 제공.
- 검증: 반만료 상태에서 `check_session()` 정확히 False 반환 확인.

#### 이슈 2: visibility='private' 미지원

- 발견 경위: 태스크 지시서에 `visibility='private'`로 기재되어 있으나, 코드에서 `is_draft = visibility == "draft"`로 비교하여 'private' 전달 시 `is_draft=False` → 공개 발행 시도됨.
- 원인 분석: CLI choices가 `["public", "draft"]`만 지원. 'private'가 'draft'의 별칭으로 의도되었으나 매핑 누락.
- 수정 내용: `is_draft` 판정을 `visibility in ("draft", "private")`로 변경, CLI choices에 'private' 추가.
- 검증: `visibility='private'`로 publish 호출 시 draft 모드 동작 확인.

</details>

## 추가 발견 사항 (정보성)

1. **Warmup 시간 낭비**: 수정 전 코드는 세션이 반만료 상태에서도 warmup(1.5분)을 완료한 뒤에야 글쓰기 페이지에서 실패. 수정 후 세션 검증 단계에서 즉시 실패하여 약 80초 절약.
2. **SE 에디터 타임아웃 경고 무시**: `_navigate_to_write()`에서 SE 에디터 컨테이너 미감지 시 `logger.warning()` 후 계속 진행. 로그인 리다이렉트된 상태에서도 진행하여 의미 없는 셀렉터 탐색 시도.
3. **pyright 미해결 경고 3건**: `config` import (reportMissingImports), `_human_mouse_move_points` 미사용, `schedule_time` 미사용 — 모두 기존 코드의 의도적 설계(config 외부 의존, 미래 기능)로 판단하여 수정하지 않음.

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: `/home/jay/projects/BlogAuto/publisher/naver_playwright.py` (2개 메서드, 1개 CLI 옵션)
- [x] 2. 엣지 케이스: blog_id 미설정 시 2차 검증 스킵 (기존 동작 유지), 완전 만료(쿠키 없음) 시 1차에서 감지
- [x] 3. 작업 지시와 일치: 발행 테스트 실행 + 발견 이슈 수정 완료
- [x] 4. 에러 처리/보안: SessionExpiredError 메시지 개선, 공개 발행 위험 방지
- [x] 5. 테스트: 수정 전/후 비교 검증 (check_session True→False, visibility='private' draft 동작)
- [x] 6. 이슈 직접 해결: 2건 해결, 1건 범위 외(세션 만료)
- [x] 7. 코드 아키텍처: 기존 메서드 구조 유지, 새 코드 최소화
- [x] 8. 인터페이스 변경: visibility에 'private' 추가 (하위 호환, 기존 'draft'/'public' 영향 없음)
- [x] 9. HTML→PNG: 해당 없음

## 산출물 파일 목록

- `/home/jay/projects/BlogAuto/publisher/naver_playwright.py` (수정: _verify_session, visibility 지원)
- `/tmp/naver-error-20260408_163145.png` (수정 전 에러 스크린샷 — 로그인 리다이렉트)
- `/tmp/naver-error-20260408_163614.png` (수정 후 에러 스크린샷 — 세션 부분 만료 감지)

## 모델 사용 기록

- 팀장(헤르메스): 설계/분석/코드 수정 직접 수행 / 사용 모델: opus / 정당성: 서브에이전트 API 과부하(529 overloaded)로 불칸 위임 실패, 직접 개입
- 불칸(백엔드): 미활성 / 사유: API 과부하로 소환 불가

## 다음 조치 (아누 판단 필요)

1. **세션 재주입**: 네이버 수동 로그인 또는 NID_AUT/NID_SES 쿠키 갱신 후 재테스트
2. **재테스트**: 세션 유효 확인 후 동일 콘텐츠로 `visibility='draft'` 발행 실행
