# task-1494.1 완료 보고서: Meta 광고 크리에이티브 + 광고 생성 스크립트

**팀**: dev5-team (마르둑)
**작업일**: 2026-04-06

---

## SCQA

**S**: task-1491.1에서 Meta 광고 캠페인 2개, 광고세트 6개, 이미지 9장 업로드를 완료했다. 이번 작업은 크리에이티브 9개 + 광고 18개를 생성하여 캠페인 구조를 완성하는 것이다. `.env.keys`에 `META_PAGE_ID_RECRUIT`(110049641647833)과 `META_PAGE_ID_SNU`(104646981521731) 두 페이지 ID가 설정되어 있다.

**C**: 두 Facebook 페이지 모두 Graph API에서 "Object does not exist or cannot be loaded due to missing permissions" 에러를 반환한다. 광고 계정(act_779265741726282)에 연결된 페이지가 0개이며, 현재 토큰에 `pages_manage_ads` 권한이 없다. 이는 task-1491.1에서 식별한 블로커와 동일한 근본 원인이다.

**Q**: 현재 인프라 상태에서 크리에이티브/광고 생성을 자동화할 스크립트를 준비하고, 블로커 해소 후 즉시 실행할 수 있는가?

**A**: 크리에이티브 9개 + 광고 18개 생성 스크립트(`meta_creative_ad_setup.py`)를 완성했다. dry-run으로 매핑 구조(페이지 ID, 이미지 해시, 광고세트 ID)가 정확함을 확인했다. 실제 API 호출은 페이지 접근 권한 블로커로 인해 9/9 크리에이티브 전부 실패(error_subcode=1443120). 블로커 해소 후 `python3 meta_creative_ad_setup.py` 한 번으로 전체 생성 가능하다.

---

## 생성 스크립트 구조

### 크리에이티브 9개 매핑

- Cell1 — 리쿠르팅_Cell1_인카금융서비스_공정보상 → page=RECRUIT, hash=431704f9...
- Cell2 — 리쿠르팅_Cell2_인카금융서비스_리더육성 → page=RECRUIT, hash=860a2df8...
- Cell3 — 리쿠르팅_Cell3_인카금융서비스_지원체계 → page=RECRUIT, hash=2639214e...
- Cell4 — 리쿠르팅_Cell4_GA_공정보상 → page=RECRUIT, hash=b358438a...
- Cell5 — 리쿠르팅_Cell5_GA_리더육성 → page=RECRUIT, hash=d0ed5f2e...
- Cell6 — 리쿠르팅_Cell6_GA_지원체계 → page=RECRUIT, hash=03762a14...
- Cell7 — 리쿠르팅_Cell7_서울대보험쌤_공정보상 → page=SNU, hash=d7b07745...
- Cell8 — 리쿠르팅_Cell8_서울대보험쌤_리더육성 → page=SNU, hash=8e43730b...
- Cell9 — 리쿠르팅_Cell9_서울대보험쌤_지원체계 → page=SNU, hash=0d3c2884...

### 광고 18개 매핑 (각 광고세트에 3개씩)

리드 캠페인:
- 리드_인카금융서비스_Cell1, Cell2, Cell3 → adset 120244493234600104
- 리드_GA_Cell4, Cell5, Cell6 → adset 120244493237840104
- 리드_서울대보험쌤_Cell7, Cell8, Cell9 → adset 120244493238350104

잠재고객 캠페인:
- 잠재고객_인카금융서비스_Cell1, Cell2, Cell3 → adset 120244493218590104
- 잠재고객_GA_Cell4, Cell5, Cell6 → adset 120244493230370104
- 잠재고객_서울대보험쌤_Cell7, Cell8, Cell9 → adset 120244493230950104

---

## 블로커: Facebook 페이지 접근 권한 (범위 외)

### 진단 결과

- 페이지 RECRUIT (110049641647833): Graph API 접근 불가 — "does not exist or missing permissions"
- 페이지 SNU (104646981521731): Graph API 접근 불가 — 동일 에러
- 광고 계정 연결 페이지: 0개 (`promote_pages` 조회 결과 빈 배열)
- 현재 토큰 권한: pages_show_list, pages_read_engagement, ads_management, ads_read, public_profile
- 누락 권한: `pages_manage_ads`

### 해결 방법 (제이회장님 수동 작업 필요)

1. **Meta Business Suite → 비즈니스 설정 → 페이지**: 두 Facebook 페이지를 비즈니스 자산으로 추가
2. **페이지를 광고 계정에 연결**: 비즈니스 설정 → 광고 계정 → act_779265741726282 → 페이지 할당
3. **토큰 재발급**: Graph API Explorer에서 `pages_manage_ads` 권한 추가 후 토큰 재생성
4. **스크립트 실행**: `cd /home/jay/workspace && python3 teams/dev5-team/scripts/meta_creative_ad_setup.py`

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **MetaAdsClient에 create_ad 메서드 부재** — facebook_business SDK의 AdAccount.create_ad 직접 호출하는 `_create_ad` 헬퍼 함수 구현
2. **페이지-브랜드 매핑 로직** — BRAND_TO_PAGE_ENV dict로 Cell 번호에 따라 RECRUIT/SNU 자동 매핑
3. **토큰 유효성 확인 debug_token API 오류** — check_token 실패 시 경고만 출력하고 계속 진행하도록 처리 (토큰이 유효하지만 debug_token 엔드포인트에 대한 제한)

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

1. **Facebook 페이지 연결 + pages_manage_ads 권한** — 범위 외 사유: Meta Business Suite에서 수동 설정 필요 (API 자동화 불가)

---

## 산출물 파일

- `/home/jay/workspace/teams/dev5-team/scripts/meta_creative_ad_setup.py`
- `/home/jay/workspace/teams/dev5-team/output/meta_creative_ad_result.json`

---

## 셀프 QC

- [x] 1. 다른 파일 영향: meta_ads_client.py 수정 없음, 신규 스크립트만 생성
- [x] 2. 엣지 케이스: 페이지 ID 미설정, 크리에이티브 실패 시 광고 스킵, 에러 계속 진행
- [x] 3. 작업 지시 일치: 크리에이티브 9개 + 광고 18개 매핑 구조 정확 (dry-run 검증 완료)
- [x] 4. 에러 처리: 토큰/키 하드코딩 없음, PAUSED 상태 강제
- [x] 5. 테스트: dry-run 모드로 전체 구조 검증 완료 (9 크리에이티브 + 18 광고 매핑 정확)
- [x] 6. 이슈 해결: 3건 자체 해결, 1건 범위 외 미해결 (페이지 권한)
- [x] 7. 코드 아키텍처: SOLID 위반 없음, 기존 스크립트 구조 일관성 유지
- [x] 8. 인터페이스 변경: 없음 (MetaAdsClient 수정 안 함)
- [x] 9. 이미지/배너: 해당 없음 (이미지는 task-1491.1에서 업로드 완료)

---

## 모델 사용 기록

- 엔키(백엔드): 스크립트 작성 (meta_creative_ad_setup.py) - sonnet
- 마르둑(팀장): 설계, 진단, 보고서 - 기본모델
