# 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