From 8c70714ed649e98758d654784468f86d5f42ac1f Mon Sep 17 00:00:00 2001 From: hyoseung930 <35983843+hyoseung930@users.noreply.github.com> Date: Tue, 19 May 2026 18:19:17 +0900 Subject: [PATCH] New task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배포됩니다. **로직:** - 1차 시도: 캡차 요청 → 지급 - 성공 → 즉시 다음 쿠폰으로 - 40103(OCR 오인식) → **30초 대기** → 2차 재시도 (이때 WOS 레이트 리밋 완전 리셋) - 2차도 실패 → 그냥 실패 처리 --- back/src/wos/wos.service.ts | 53 ++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/back/src/wos/wos.service.ts b/back/src/wos/wos.service.ts index 4112dae..85dffdc 100644 --- a/back/src/wos/wos.service.ts +++ b/back/src/wos/wos.service.ts @@ -113,29 +113,40 @@ export class WosService { fid: string, code: string, ): Promise<{ success: boolean; message: string; err_code?: number }> { - let captchaCode: string; - try { - captchaCode = await this.solveCaptcha(fid); - } catch (err: any) { - return { success: false, message: `캡차 오류: ${err.message}` }; + for (let attempt = 1; attempt <= 2; attempt++) { + if (attempt > 1) { + this.logger.warn(`[${fid}] ${code} 캡차 오인식, 30초 대기 후 재시도`); + await new Promise((r) => setTimeout(r, 30000)); + } + + let captchaCode: string; + try { + captchaCode = await this.solveCaptcha(fid); + } catch (err: any) { + return { success: false, message: `캡차 오류: ${err.message}` }; + } + + const ts = this.now(); + const giftSign = this.makeGiftSign(fid, ts, code, captchaCode); + const response = await axios.post( + `${WOS_API_BASE}/gift_code`, + new URLSearchParams({ fid, time: String(ts), sign: giftSign, cdk: code, captcha_code: captchaCode }), + { headers: { ...COMMON_HEADERS } }, + ); + + const data = response.data; + this.logger.log(`[${fid}] ${code} attempt=${attempt} captcha=${captchaCode} → code=${data.code} err=${data.err_code} msg=${data.msg}`); + + if (data.code === 0) return { success: true, message: SUCCESS_MSG }; + if (data.err_code === 40103 && attempt < 2) continue; + return { + success: false, + message: data.msg || `실패 (${data.err_code})`, + err_code: data.err_code, + }; } - const ts = this.now(); - const giftSign = this.makeGiftSign(fid, ts, code, captchaCode); - const response = await axios.post( - `${WOS_API_BASE}/gift_code`, - new URLSearchParams({ fid, time: String(ts), sign: giftSign, cdk: code, captcha_code: captchaCode }), - { headers: { ...COMMON_HEADERS } }, - ); - - const data = response.data; - this.logger.log(`[${fid}] ${code} captcha=${captchaCode} → code=${data.code} err=${data.err_code} msg=${data.msg}`); - - return { - success: data.code === 0, - message: data.code === 0 ? SUCCESS_MSG : (data.msg || `실패 (${data.err_code})`), - err_code: data.err_code, - }; + return { success: false, message: '알 수 없는 오류' }; } async redeemAll(fid: string) {