**완벽하게 동작해요!**
```json
{"found": 4, "added": []}
```
- **found: 4** → Wiki에서 코드 4개 정상 파싱됨
- **added: []** → 이미 DB에 있는 코드들 (전부 중복)
Wiki 코드 4개 (`HappyMayDay`, `GW2026JP`, `OFFICIALSTORE`, `gogoWOS`)가 이미 DB에 등록되어 있어서 스킵된 거예요.
---
## 정리된 동작
```mermaid
flowchart LR
A[매 정시 크론] --> B[whiteoutsurvival.wiki 페이지 다운로드]
B --> C[span.code 파싱 - 정규식]
C --> D{DB 중복 체크}
D -->|기존 코드| E[스킵]
D -->|신규 코드| F[addCoupon 호출]
F --> G[전체 유저 자동 지급]
F --> H[Discord Webhook 알림]
```
이제 **매 정시마다 자동으로 Wiki를 확인**하고, 새 쿠폰이 추가되면 자동으로 전체 연맹원에게 지급돼요. Reddit OAuth 같은 복잡한 설정도 필요 없어요!
완료! 추가된 파일 구조는 다음과 같아요:
---
## 추가된 파일
```
autoCoupon/back/src/
├── crawler/
│ ├── crawler.service.ts ← 핵심 크롤러
│ ├── crawler.controller.ts ← 수동 트리거 API
│ └── crawler.module.ts
├── wos/
│ └── wos.module.ts ← WosService export 추가
└── app.module.ts ← CrawlerModule 등록
```
---
## 동작 방식
```mermaid
flowchart LR
A[매 정시 크론] --> B[Reddit JSON API 조회]
B --> C{gift code 언급?}
C -->|No| D[스킵]
C -->|Yes| E[정규식으로 코드 추출]
E --> F{DB 중복?}
F -->|중복| D
F -->|신규| G[addCoupon 호출]
G --> H[전체 유저 자동 지급]
G --> I[Discord Webhook 알림]
```
---
## 배포 후 설정
**1. `.env`에 Discord Webhook URL 추가 (선택)**
```
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/xxx/yyy
```
**2. 수동 크롤링 테스트**
```bash
curl -X POST http://localhost:3000/api/crawler/trigger
```
**Discord Webhook 만들기**: 디스코드 서버 → 채널 설정 → 연동 → 웹후크 → 새 웹후크 → URL 복사
로그에서 `err_code=40011, msg=SAME TYPE EXCHANGE.`가 확인됩니다.
**SAME TYPE EXCHANGE**는 WOS에서 **같은 종류(유형)의 보상을 이미 다른 쿠폰으로 받은 경우** 발생합니다.
예: `gogoWOS`와 `VpqG7dDK7` 둘 다 같은 종류의 아이템을 주는 쿠폰이라면, 하나를 이미 받았을 때 나머지는 이 에러가 납니다.
- `40008 RECEIVED` → **이 쿠폰 자체를** 이미 수령
- `40011 SAME TYPE EXCHANGE` → **다른 쿠폰으로** 같은 유형 보상 이미 수령
두 가지 처리 방법이 있습니다:
1. **성공으로 처리** (40008처럼): 어차피 받을 수 없으니 다음에 재시도 안 함
2. **실패로 처리**: 다음날 다시 시도 (다음날 가능성 있는 경우)
어떻게 처리할까요?
## 수정 내용
- **Sign Error 근본 원인 2가지 수정**:
1. `now()` 함수가 **초** 단위(`Date.now()/1000`)를 반환하고 있었음 → **밀리초**(`Date.now()`)로 수정 (설계서 명시 사항)
2. 세션 쿠키 추출 시 쿠키 이름에 'session'이 없으면 빈 값으로 보내고 있었음 → **모든 쿠키를 전체 전송**으로 수정
- **쿠폰 코드 대소문자 유지**: `toUpperCase()` 제거
- **FID localStorage 저장**: 한번 입력하면 다음 방문 시 자동으로 로드되어 바로 쿠폰 지급 시작
- **쿠폰 추가 시 자동 리딤**: 새 쿠폰 등록하면 DB에 저장된 **모든 유저**에게 백그라운드로 자동 지급
완료됐습니다. 변경 내용 요약:
---
## 변경 사항
### 버그 수정
- TypeORM `upsert` → MySQL 호환 `findOne + update/save` 방식으로 수정 → 500 에러 해결
### 신규 기능
**쿠폰 관리 (관리자)**
- **https://coupon.wageulwageul.com/admin** 에서 쿠폰 추가/삭제/활성화 토글
- 쿠폰 코드 + 이름 저장 (예: `ABC123` / `신년 이벤트`)
**자동 전체 지급 (사용자)**
- FID 입력 → 조회 → **⚡ 전체 쿠폰 자동 지급** 버튼 클릭
- DB에 등록된 활성 쿠폰을 전부 자동으로 시도
- 결과(쿠폰명 + 코드 + 성공/실패)가 바로 표시되고 DB에 영구 저장
- 이력은 FID별로 조회 시 자동 로드
**사용 흐름:**
1. `/admin` 에서 쿠폰 등록
2. 사용자는 `/` 에서 FID 입력 → 버튼 한 번으로 모든 쿠폰 자동 지급
배포 완료됐습니다. 변경 내용 요약:
---
## 변경 사항
**자동화 (캡차 없음)**
- FID 입력 → 조회 버튼 클릭 → 쿠폰 코드 붙여넣기 → ⚡ 자동 입력 클릭
- 백엔드가 캡차 세션을 자동으로 획득해서 처리 (사용자가 캡차를 볼 필요 없음)
- 캡차 세션 만료 시 자동 재시도
**영구 이력 저장**
- 쿠폰 입력할 때마다 DB(`coupon_logs`)에 저장
- FID 조회 시 해당 플레이어의 이력이 하단에 자동 로드
- 날짜/시간 + 결과 (성공/실패) 표시, 최대 100건
**https://coupon.wageulwageul.com** 에서 바로 확인하세요.
완료됐습니다.
- **원인**: WOS API 서버가 `User-Agent`, `Origin`, `Referer` 헤더 없는 요청을 `403`으로 차단
- **해결**: 브라우저 헤더를 모방한 `COMMON_HEADERS` 추가
이제 **https://coupon.wageulwageul.com** 에서 실제 FID로 조회하면 정상 동작합니다.
수정 완료입니다. 결과 확인:
- **이전**: `500 Internal server error` (WOS API가 User-Agent 없어서 403 차단)
- **이후**: `400 오류가 발생했습니다. (40001)` → WOS API 정상 응답 (40001 = 존재하지 않는 FID)
실제 존재하는 FID로 조회하면 정상적으로 유저 정보가 반환됩니다.