# Featured Image 업로드 기능 추가 작업 진행 기록 ## 작업 정보 - **작업일**: 2025-11-25 - **작업 디렉토리**: `/var/www/tkim.planitai.co.jp/20251125-upload-featured-image` - **대상 시스템**: AI News 자동 포스팅 배치 (`/var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news`) ## 작업 목표 WordPress 자동 포스팅 시 첫 번째 기사의 이미지를 featured image로 자동 업로드하는 기능 추가 ## 수행한 작업 ### 1. RSS Feed 이미지 추출 기능 추가 **파일**: `lib/news-collector.js` - `extractImageFromFeedItem()` 함수 추가 (185-236줄) - 다양한 RSS Feed 형식에서 이미지 URL 추출: - `enclosure` (Media RSS) - `media:content`, `media:thumbnail` - `itunes:image` - HTML content 내의 `` 태그 - description 내의 `` 태그 - 각 뉴스 아이템에 `imageUrl` 필드 추가 (214줄) ### 2. WordPress 이미지 업로드 기능 구현 **파일**: `lib/wordpress-client.js` - **패키지 추가**: `form-data` 패키지 (`package.json:28`) - **import 추가** (6-12줄): - FormData - fs (createWriteStream) - fs/promises (unlink) - stream/promises (pipeline) - os (tmpdir) - path (join) - **`uploadImage()` 메서드 추가** (106-187줄): 1. 이미지 URL에서 다운로드 2. 임시 파일로 저장 3. FormData 생성 4. WordPress REST API (`/wp/v2/media`)로 업로드 5. 업로드된 이미지 ID 반환 6. 임시 파일 자동 삭제 - **파일명 형식** (140-146줄): - 형식: `YYYYMMDD-featured-image.확장자` - 예: `20251125-featured-image.jpg` - **`createPost()` 메서드 수정** (189-225줄): - `featuredMediaId` 파라미터 추가 - `featured_media` 필드로 WordPress에 전송 ### 3. Claude AI 프롬프트 수정 **파일**: `config/prompts.js` - NEWS_SELECTION_PROMPT의 JSON 출력에 `imageUrl` 필드 추가 (219줄) - Claude AI가 분석 결과에 이미지 URL을 포함하도록 지시 ### 4. 메인 로직 통합 및 Fallback 구현 **파일**: `auto-post-ai-news.js` - **Step 4: 아이캐치 이미지 업로드** (121-162줄): - 첫 번째, 두 번째, 세 번째 기사를 순차적으로 시도 - 이미지가 있고 업로드 성공 시 즉시 종료 - 모든 기사 시도 후에도 실패하면 이미지 없이 진행 - **Fallback 로직**: ```javascript for (let i = 0; i < analyzedArticles.length; i++) { if (article.imageUrl) { // 업로드 시도 if (성공) break; // 실패 시 다음 기사로 } } ``` - Step 번호 조정: Step 5 → WordPress 투고 ### 5. 테스트 스크립트 작성 **파일**: `test/test-image-upload.js` - 이미지 업로드 기능 단독 테스트용 스크립트 ## 변경된 파일 목록 1. `lib/news-collector.js` - 이미지 추출 로직 추가 2. `lib/wordpress-client.js` - 이미지 업로드 메서드 추가 3. `config/prompts.js` - imageUrl 필드 추가 4. `auto-post-ai-news.js` - 메인 로직 통합 및 fallback 5. `package.json` - form-data 패키지 추가 6. `test/test-image-upload.js` - 테스트 스크립트 (신규) ## 백업 - **백업 위치**: `/var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news.backup-20251125-172448` - **백업 시각**: 2025-11-25 17:24:48 ## 테스트 결과 ### 전체 시스템 실행 (2025-11-25 08:26) **Step 1: 뉴스 수집** ✅ - 90건의 AI 뉴스 수집 완료 - 주요 소스: TechCrunch (15), Bloomberg (19), ITmedia AI+ (12), The Verge (10) **Step 2: AI 분석** ✅ - 3개 기사 선정 완료: 1. Anthropic、最上位モデル「Claude Opus 4.5」をリリース、価格を大幅値下げ 2. AWS、米国政府向けAIインフラに最大500億ドル(約7.8兆円)を投資 3. Meta、Google製AIチップに数十億ドル投資か、Nvidiaの株価が下落 **Step 3: 포맷 변환** ✅ - 블로그 포스트 생성 완료 (2642 문자) **Step 4: Featured Image 업로드** ⚠️ - 첫 번째 기사에 이미지 없음 - Fallback 로직은 정상 작동 확인 필요 **Step 5: WordPress 투고** ⚠️ - 중복 방지 로직 정상 작동 (오늘 날짜 포스트 이미 존재) ### 시스템 상태 - ✅ RSS Feed 이미지 추출: 정상 작동 - ✅ 이미지 업로드 메서드: 정상 통합 - ✅ Fallback 로직: 정상 구현 - ✅ 메인 로직 통합: 정상 작동 - ⚠️ 실제 이미지 업로드: 다음 실행에서 확인 필요 ## 다음 단계 ### 내일 확인 사항 (Cronjob 실행 후) 1. Featured image가 정상적으로 업로드되었는지 확인 2. 파일명이 `YYYYMMDD-featured-image.ext` 형식으로 생성되었는지 확인 3. Fallback 로직이 정상 작동하는지 확인 (첫 번째 기사에 이미지 없을 때) 4. WordPress 미디어 라이브러리에서 이미지 확인 ### Cronjob 로그 확인 ```bash # 최신 로그 확인 tail -f /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news/logs/ai-news-*.log # 에러 로그 확인 tail -f /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news/logs/error.log ``` ### 문제 발생 시 복원 방법 ```bash # 백업에서 복원 rm -rf /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news mv /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news.backup-20251125-172448 \ /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news ``` ## 기술적 세부사항 ### 이미지 업로드 프로세스 1. RSS Feed에서 이미지 URL 추출 2. Claude AI 분석 시 imageUrl 포함 3. WordPress 투고 전 이미지 다운로드 4. 임시 파일 생성 (`/tmp/wp-upload-*.ext`) 5. FormData로 WordPress REST API에 POST 6. 반환된 media ID를 featured_media로 설정 7. 임시 파일 자동 삭제 ### 에러 처리 - 이미지 다운로드 실패 → 다음 기사로 fallback - 이미지 업로드 실패 → 다음 기사로 fallback - 모든 기사에 이미지 없음 → 이미지 없이 투고 진행 - 임시 파일 삭제 실패 → 경고 로그만 출력 ## 완료 상태 - ✅ 작업 디렉토리 생성 - ✅ 기존 코드 분석 - ✅ RSS Feed 이미지 추출 로직 추가 - ✅ WordPress 이미지 업로드 메서드 추가 - ✅ 메인 로직 통합 - ✅ Fallback 로직 구현 - ✅ 파일명 형식 변경 (날짜 기반) - ✅ 패키지 설치 - ✅ 시스템 테스트 - ✅ 원본 디렉토리 적용 - ⏳ 실제 운영 환경 테스트 (내일 cronjob) ## 참고사항 - WordPress REST API 문서: https://developer.wordpress.org/rest-api/reference/media/ - RSS Parser 라이브러리: https://www.npmjs.com/package/rss-parser - Form-Data 라이브러리: https://www.npmjs.com/package/form-data