mirror of
https://github.com/NomaDamas/k-skill.git
synced 2026-06-24 02:04:11 +00:00
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.
5 KiB
5 KiB
다이소 상품 조회 가이드
이 기능으로 할 수 있는 일
- 다이소 매장명으로 공식 매장 후보 찾기
- 상품명/검색어로 공식 상품 후보 찾기
- 특정 매장의 매장 픽업 재고 수량 확인 (Bearer 토큰 인증 기반 공식
selStrPkupStck표면) - 필요하면
referenceOnly: true온라인 재고 참고값 함께 확인
이 기능으로 할 수 없는 일 (스킬 범위 한계)
- 매장 내 진열 위치(aisle/매대)는 공식 표면이 제공하지 않으므로 답하지 않습니다.
- 결제·주문·픽업 예약 자동화는 범위가 아닙니다.
- 비공식 크롤링·헤드리스 브라우저 우회·계정 세션 재사용은 범위가 아닙니다.
먼저 필요한 것
- 인터넷 연결
node18+
입력값
- 매장명
- 예:
강남역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
기본 흐름
- 매장명이 없으면 먼저 매장명을 물어봅니다.
- 상품명이 없으면 상품명/검색어를 한 번 더 물어봅니다.
selStr로 매장 후보를 찾고, 필요하면selStrInfo로 매장 상세를 확인합니다.SearchGoods로 상품 후보를 찾습니다.GET /api/auth/request로 비로그인 JWT를 받아 AES-128-CBC / 키"PRE_AUTH_ENC_KEY"로 암호화한 뒤 Bearer 헤더를 빌드합니다.selStrPkupStck에 Bearer 헤더를 실어 해당 매장의 상품 재고를 확인합니다.- 403 응답이 오면
/api/auth/request를 재호출해 Bearer를 새로 빌드한 뒤 한 번 재시도합니다. - Bearer 재시도 후에도 401/403이면
pickupStock.retrievalStatus: "blocked"를 반환하고, 선택적으로selPkupStr기반pickupEligibility로 픽업 가능 여부를 보조 확인합니다. - 필요하면
SearchGoods응답의onldPdNo를 함께 보존해selOnlStck온라인 재고 교차 확인에 사용합니다. - 공식 표면이 매장 내 위치를 주지 않으면 재고 중심으로 답합니다.
예시
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→ 가능한 경우 온라인 재고 참고값 표시