k-skill/docs/features/daiso-product-search.md
Jeffrey (Dongkyu) Kim 1476011e4f Preserve Daiso caller headers through Bearer stock lookup
Keep advanced caller headers on the authenticated stock endpoint while generated Bearer and X-DM-UID values remain authoritative. Document the degraded selPkupStr fallback order in skill and source docs so the public workflow matches the restored API surface.\n\nConstraint: PR #250 review required resilient Bearer-primary stock lookup plus selPkupStr fallback and header/body contract coverage.\nRejected: Replacing caller headers with only auth headers | It regressed tracing/test-control header pass-through.\nConfidence: high\nScope-risk: narrow\nDirective: Keep Authorization and X-DM-UID generated by the auth flow even when callers provide same-named headers.\nTested: node --test packages/daiso-product-search/test/index.test.js; npm test --workspace daiso-product-search; npm run lint --workspace daiso-product-search; node --test scripts/skill-docs.test.js; npm run ci; live lookupStoreProductAvailability smoke for 강남역2호점 / VT 리들샷 100.\nNot-tested: Forced live upstream repeated 403; covered by injected fixture tests.
2026-05-15 16:35:16 +09:00

5 KiB

다이소 상품 조회 가이드

이 기능으로 할 수 있는 일

  • 다이소 매장명으로 공식 매장 후보 찾기
  • 상품명/검색어로 공식 상품 후보 찾기
  • 특정 매장의 매장 픽업 재고 수량 확인 (Bearer 토큰 인증 기반 공식 selStrPkupStck 표면)
  • 필요하면 referenceOnly: true 온라인 재고 참고값 함께 확인

이 기능으로 할 수 없는 일 (스킬 범위 한계)

  • 매장 내 진열 위치(aisle/매대)는 공식 표면이 제공하지 않으므로 답하지 않습니다.
  • 결제·주문·픽업 예약 자동화는 범위가 아닙니다.
  • 비공식 크롤링·헤드리스 브라우저 우회·계정 세션 재사용은 범위가 아닙니다.

먼저 필요한 것

  • 인터넷 연결
  • node 18+

입력값

  • 매장명
    • 예: 강남역2호점
    • 예: 스타필드하남점
  • 상품명 또는 검색어
    • 예: VT 리들샷 100
    • 예: 리들샷 300

공식 표면

  • store search: https://www.daisomall.co.kr/api/ms/msg/selStr
  • store detail: https://www.daisomall.co.kr/api/dl/dla-api/selStrInfo
  • product search list: https://www.daisomall.co.kr/ssn/search/SearchGoods
  • product summary list: https://www.daisomall.co.kr/ssn/search/GoodsMummResult
  • auth (비로그인 JWT 발급): https://www.daisomall.co.kr/api/auth/request
  • store pickup stock: https://www.daisomall.co.kr/api/pd/pdh/selStrPkupStck (Bearer 인증 필요)
  • pickup eligibility fallback: https://www.daisomall.co.kr/api/ms/msg/selPkupStr
  • optional online stock: https://www.daisomall.co.kr/api/pdo/selOnlStck

기본 흐름

  1. 매장명이 없으면 먼저 매장명을 물어봅니다.
  2. 상품명이 없으면 상품명/검색어를 한 번 더 물어봅니다.
  3. selStr 로 매장 후보를 찾고, 필요하면 selStrInfo 로 매장 상세를 확인합니다.
  4. SearchGoods 로 상품 후보를 찾습니다.
  5. GET /api/auth/request 로 비로그인 JWT를 받아 AES-128-CBC / 키 "PRE_AUTH_ENC_KEY" 로 암호화한 뒤 Bearer 헤더를 빌드합니다.
  6. selStrPkupStck 에 Bearer 헤더를 실어 해당 매장의 상품 재고를 확인합니다.
  7. 403 응답이 오면 /api/auth/request 를 재호출해 Bearer를 새로 빌드한 뒤 한 번 재시도합니다.
  8. Bearer 재시도 후에도 401/403이면 pickupStock.retrievalStatus: "blocked" 를 반환하고, 선택적으로 selPkupStr 기반 pickupEligibility 로 픽업 가능 여부를 보조 확인합니다.
  9. 필요하면 SearchGoods 응답의 onldPdNo 를 함께 보존해 selOnlStck 온라인 재고 교차 확인에 사용합니다.
  10. 공식 표면이 매장 내 위치를 주지 않으면 재고 중심으로 답합니다.

예시

const { lookupStoreProductAvailability } = require("daiso-product-search")

async function main() {
  const result = await lookupStoreProductAvailability({
    storeQuery: "강남역2호점",
    productQuery: "VT 리들샷 100"
  })

  console.log({
    store: result.selectedStore,
    product: result.selectedProduct,
    pickupStock: result.pickupStock,
    onlineStock: result.onlineStock
  })
}

main().catch((error) => {
  console.error(error)
  process.exitCode = 1
})

실전 운영 팁

  • 매장 후보가 여러 개면 상위 2~3개만 보여주고 다시 확인받는 편이 안전합니다.
  • 상품 후보가 여러 개면 브랜드, 용량, 호수까지 같이 보여 주는 편이 덜 헷갈립니다.
  • 재고 수량은 실시간 100% 보장값이 아니므로, 필요하면 방문 직전 다시 확인 문구를 같이 줍니다.
  • 공식 표면이 매장 내 위치를 주지 않으면 공식 표면에서는 매장 재고까지만 확인된다고 답합니다.
  • 매장 픽업 재고의 status 는 조회 결과 범주입니다. 상품 재고 여부는 inStock 또는 inventoryStatus 로 설명하고, status: "available" 만으로 재고가 있다고 말하지 않습니다.
  • 인증 키(PRE_AUTH_ENC_KEY)는 JS 번들에 하드코딩되어 있으며 변경될 수 있습니다. 403이 지속되면 키가 교체된 것일 수 있습니다.

라이브 확인 메모

2026-03-27 기준으로 selStrPkupStck 는 실제 매장 픽업 재고를 반환했습니다. 2026-05-15 기준 Bearer 토큰 인증(/api/auth/request + AES-128-CBC)으로 정상 접근 가능합니다.

현재 운영 원칙은 다음과 같습니다.

  • POST /api/ms/msg/selStr → 매장 후보 확인
  • GET /ssn/search/SearchGoods?searchTerm=... → 상품 후보 및 onldPdNo 확인
  • GET /api/auth/request → 비로그인 JWT 발급, 헤더 x-dm-uid 보존 (유효 30초)
  • JWT를 AES-128-CBC / 키 "PRE_AUTH_ENC_KEY" 로 암호화 → bearer = base64(IV) + base64(암호문) 조합
  • POST /api/pd/pdh/selStrPkupStck + Authorization: Bearer <bearer>, X-DM-UID: <uid> → 성공 시 status: "available", retrievalStatus: "resolved". 실제 재고 여부는 inStock / inventoryStatus 로 표시
  • 403 → /api/auth/request 재호출 후 Bearer 재빌드 후 1회 재시도
  • POST /api/pdo/selOnlStck → 가능한 경우 온라인 재고 참고값 표시