Repository navigation
feat: 올리브영 다음 오특 예고와 오특 웹 조회 추가 - #362
chuuminggg wants to merge 3 commits into
Conversation
실데이터 확인 결과 (2026-11-03)로컬 서버 → 로컬 브라우저 릴레이(headed Playwright, 보안 확인은 사람이 직접 통과) → 올리브영 원본 경로로 조회했습니다.
상세 페이지 직접 확인은 올리브영 보안 확인 화면에서 멈춰 우회하지 않고, 상품 검색 결과로 대신 대조했습니다. 11-03 예고 상품 31개
남은 확인coming soon 배너는 화면에 대략 한국 시간 오후 9시(21시)부터 공개됩니다. 이번 조회(20:27)는 공개 전이라 HTML에 들어 있던 배너를 읽은 것이므로, 공개 이후 배너가 다음 날 오특과 일치하는지는 21시 이후 조회와 다음 날 오특을 비교해 이어서 확인하겠습니다. |
coming soon 매일 대조 cron 추가와 21시 이후 확인 (2026-11-03)coming soon 배너는 화면에 대략 한국 시간 오후 9시(21시)부터 공개됩니다. 그래서 공개 이후 예고가 다음 날 오특과 같은지 매일 확인하도록 Oliveyoung Coming Soon workflow
21시 이후 실제 경로 확인 (22:33 KST)로컬 Worker를 HTTP로 띄우고(로컬 브라우저 릴레이 → 올리브영 원본
8000
) 위
다음 확인이 22:33 저장본(대상 2026-11-04)과 11-04 실제 오특의 대조 결과는 11-04 오후 9시 이후 후속 코멘트로 남기겠습니다. |
coming soon 다음 날 대조 결과 (2026-11-03 예고 → 11-04 오특)어제 코멘트에서 이어서 확인했습니다. workflow와 같은 1. 11-03 22:33 저장본과 11-04 실제 오특 대조 (11-04 21:16 KST)
10-26 → 10-27 관측(31/31)에 이어 이번에도 coming soon 예고가 다음 날 오특 전체와 상품번호까지 일치했습니다. 2. 11-05 대상 예고 저장 (11-04 21:17 KST)
PR이 배포되면 이 대조는 |
변경 요약
#331에서 후속으로 제안했던 오특 coming soon(다음 오특 예고)을 구현하고,
/browse/quick에서 오특을 웹으로 조회할 수 있게 했습니다.get_catalog(service=oliveyoung, operation=today_deals)응답에upcomingDeals,upcomingDealCount를 추가했습니다. 오특 페이지를 한 번 더 요청하지 않고, 이미 받은 페이지 HTML의 coming soon 배너를 파싱합니다.GET /api/oliveyoung/today-deals를 추가했습니다. MCP와 같은 본문을 반환하며(buildTodayDealsBody공유), Actions 정의에 등록되어/browse/oliveyoung/today-deals웹 조회가 자동으로 생깁니다./browse/quick첫 화면에 "오늘의 올리브영 오특 보기" 링크를 추가했습니다. 읽기 세션 링크(/browse/read/{id}/oliveyoung/today-deals)로 이어지고, 결과는 브랜드 특가·오늘의 특가·다음 오특 예고가 상품명과 원본 이미지 카드로 보입니다.core.autocrlf=true)에서 README가 CRLF로 체크아웃되면tests/pages/discoveryEntry.test.ts가 실패하던 정규식을\r?\n으로 고쳤습니다. Linux CI 동작은 같습니다.관련 이슈
동작 방식
다음 오특 예고 (
upcomingDeals)배너(
.comingSoonBan .slideItem)는 화면에서 숨겨져 있어도 페이지 HTML에 항상 들어 있습니다. 배너에는 상품명과 이미지만 있어 가격은 반환하지 않습니다.name<span>텍스트imageUrlbackground-imagegoodsNoA00000020241475ko.jpg→A000000202414), 없으면nullproductUrlgoodsNo가 있을 때만 상세 링크, 없으면nullupcomingDeals는 예고일 뿐이라 예고 파싱 실패가 오특 본 조회를 실패시키지 않습니다. 대신null(예고 미확인)과[](예고 상품 없음)를 구분합니다.null입니다.오특 웹 조회
stale-while-revalidate60초), 캐시 키에 한국 날짜를 넣어 자정 전후 응답이 섞이지 않게 했습니다. 오류 응답은 캐시하지 않습니다.OLIVEYOUNG_TODAY_DEALS_PARSE_FAILED, 오특이 아닌 페이지 500)./prompt안내(8번 항목),docs/service-reference.md,docs/mcp-tools.md를 함께 갱신했습니다.실데이터 확인
로컬 서버 → 로컬 브라우저 릴레이(headed Playwright, 보안 확인은 사람이 직접 통과) → 올리브영 원본 경로로 2026-11-03 20시대에 확인했습니다.
get_catalog오특goodsNo/browse/quick→ 오특 링크/api/oliveyoung/today-deals과거 관측: 2026-10-26 21:17 배너 31개는 10-27 오특 31개와 상품번호까지 모두 일치했습니다 (
docs/oliveyoung-today-deals-analysis.md).체크리스트
npm run lint,npm run lint:biome통과npm run typecheck통과npm run check:source-lines통과참고 사항
upcomingDeals는 가격이 없는 예고입니다. 화면 표시 시간(대략 한국 시간 9시~자정)과 무관하게 HTML에 있으면 반환합니다.tests/relay/*,cli-output-drain,health-runner는main과 목록이 같아 이 PR과 무관합니다.