# task-778.1 완료 보고서: Instagram 인증 및 크로스 포스팅 테스트

**S**: task-777.1에서 Instagram 크로스 포스팅 코드(OAuth, API 클라이언트, Publisher, CLI)가 구현 완료되어 코드 레벨에서는 발행 준비가 갖춰졌다. Threads 계정 `snu_insurance_group`이 활성 상태이며 토큰 유효(2026-05-04 만료).

**C**: 원격 브라우저(100.116.204.95:9222)에서 Facebook 세션이 로그아웃 상태(세션 쿠키 `c_user`/`xs` 부재 확인)이므로, Meta Developer Console 접속·Instagram OAuth 인증·테스트 발행의 전 Phase가 차단된다. Instagram Content Publishing API는 Facebook Login 경유 OAuth가 필수이며, 브라우저 미로그인 상태에서는 자동 인증이 불가능하다.

**Q**: Facebook 브라우저 로그인 없이 Instagram 인증 및 테스트 발행을 완료할 수 있는가?

**A**: Facebook 로그인은 수동 개입이 필수이므로 자동 완료 불가. 대신 인증 전 가능한 모든 준비 작업을 완료했다: (1) .env 환경변수 설정 완료 (INSTAGRAM_APP_ID/SECRET, REDIRECT_URI, CROSS_POST_ENABLED=false), (2) config.py에 `.env` 로더 추가하여 환경변수 로딩 수정, (3) OAuth 서버 라우트 3개 동작 확인, (4) pyright 타입 체크 0 errors/0 warnings, (5) 코드 구조 검증 완료. **Facebook 로그인 후 제이회장님이 직접 또는 재지시를 통해 5단계 후속 작업이 필요하다.**

## 작업 수행 내역

### Phase 1: Meta Developer Console 설정 — 블로커 (Facebook 미로그인)
- 원격 브라우저 접속 시도: `developers.facebook.com/apps/` → `business.facebook.com/business/loginpage/` 리다이렉트
- Facebook 쿠키 확인: 7개 쿠키 중 세션 쿠키 없음 (datr, sb, ps_l, ps_n, dpr만 존재)
- **결론**: Facebook 로그인 필수. 자동화 불가.

### Phase 2: Facebook Page + Instagram 연결 — 블로커 (Phase 1 종속)
- Threads 토큰으로 Facebook Graph API 접근 시도: `Invalid OAuth access token` (Threads 토큰은 graph.threads.net 전용)
- Threads 계정 정보 확인: `snu_insurance_group` (서울대보험그룹), user_id: 26715152761436412

### Phase 3: 환경변수 설정 — 완료
- `.env` 파일에 Instagram 변수 5개 추가 (FACEBOOK_PAGE_ID는 빈값 — 로그인 후 확인 필요)
- `config.py`에 `load_local_env()` 함수 추가 — `.env` 파일에서 환경변수 로드 (기존 `.env.keys`와 비충돌 설계)
- 환경변수 로딩 검증: 모든 변수 정상 로드 확인

### Phase 4: OAuth 인증 — 블로커 (Facebook 미로그인)
- OAuth 콜백 서버 테스트:
  - `/health`: 200 OK (API 전체 상태는 Threads 측 이슈로 critical이나 Instagram 라우트 정상)
  - `/auth/instagram/login`: 307 리다이렉트 → Facebook OAuth URL 정상 생성
  - `/auth/instagram/callback?code=test`: 400 (Facebook API가 invalid code 거부 — 정상 동작)
- CLI `instagram-status`: "토큰이 없습니다" 메시지 정상 출력

### Phase 5: 크로스 포스팅 테스트 — 블로커 (Phase 4 종속)

## 코드 검증 결과

- **pyright**: 5개 파일 0 errors, 0 warnings
- **instagram_oauth.py**: OAuth 플로우 v22.0 스펙 일치. 스코프 `instagram_basic,instagram_content_publish,pages_read_engagement,pages_show_list` 적절
- **instagram_client.py**: Carousel 3단계 발행 플로우 (개별 컨테이너 → 캐러셀 → 발행) 정상. Backoff 재시도 구현
- **cross_publisher.py**: Threads 실패해도 Instagram 발행 영향 없음, overall_success 로직 정상
- **instagram_token_store.py**: 60일 장기 토큰, 7일 전 자동 갱신, 갱신 실패 시 폴백 로직 정상

## 발견 이슈 및 해결

### 자체 해결 (2건)
1. **config.py가 .env 파일을 로드하지 않음** — `load_local_env()` 함수 추가하여 .env 파일에서 Instagram 변수 로드
   - 수정: `config.py:24-45` (신규 함수 추가 + 호출부 추가)
2. **Instagram 환경변수 미설정** — `.env`에 5개 변수 추가 (INSTAGRAM_APP_ID, INSTAGRAM_APP_SECRET, INSTAGRAM_REDIRECT_URI, FACEBOOK_PAGE_ID, CROSS_POST_ENABLED)

### 범위 외 미해결 (1건)
1. **Facebook 브라우저 로그인 필요** — 범위 외 사유: 사용자 인증 정보(이메일/비밀번호) 필요. 보안상 자동 입력 불가. 제이회장님 직접 수행 필요.

## 생성/수정 파일 목록

- `/home/jay/projects/ThreadAuto/.env` — Instagram 환경변수 5개 추가
- `/home/jay/projects/ThreadAuto/config.py` — `load_local_env()` 함수 추가 (24-45행)

## 후속 작업 가이드 (Facebook 로그인 후)

1. 원격 브라우저에서 Facebook 로그인
2. `developers.facebook.com/apps/` 접속 → 기존 앱(ID: 1279010674080497)에 Instagram 제품 추가
3. `facebook.com/settings` → Pages 확인 → Instagram Business 계정 연결 확인
4. Facebook Page ID 확인 → `.env`의 `FACEBOOK_PAGE_ID` 설정
5. `cd /home/jay/projects/ThreadAuto && python3 cli.py instagram-auth` 실행
6. 브라우저에서 인증 URL 열기 → 권한 승인
7. `.tokens/instagram_token.json` 생성 확인
8. `.env`의 `CROSS_POST_ENABLED=true`로 변경
9. 테스트 발행 실행

## QC 자동 검증

**결과: PASS** (5 PASS, 5 SKIP)
- file_check: PASS (config.py 3063B, .env 454B, 보고서 5218B)
- data_integrity: PASS
- pyright_check: PASS (0 errors, 0 warnings)
- style_check: PASS (black OK, isort OK)
- critical_gap: PASS (5건 모두 RESOLVED)
- test_runner: SKIP (관련 테스트 파일 0개 — 정당한 SKIP)
- tdd_check: SKIP (Lv.1 설정/테스트 작업 — .env는 구현 파일 아님)
- api_health: SKIP (서버 작업 아님)
- schema_contract: SKIP (workers 미사용)
- scope_check: SKIP
