| name | daiso-product-search |
| description | Look up Daiso products by store name and product keyword using official Daiso Mall store/search/stock surfaces. Use when the user wants to know whether a product is available at a specific Daiso store. |
| license | MIT |
| metadata | {"category":"retail","locale":"ko-KR","phase":"v1"} |
Daiso Product Search
What this skill does
๋ค์ด์๋ชฐ ๊ณต์ ๊ฒ์/๋งค์ฅ/์ฌ๊ณ ํ๋ฉด์ ์ฌ์ฉํด ํน์ ๋ค์ด์ ๋งค์ฅ์ ์ํ ์ฌ๊ณ ๋ฅผ ํ์ธํ๋ค.
- ๊ณต์ ๋งค์ฅ ๊ฒ์์ผ๋ก ๋งค์ฅ ์ฝ๋๋ฅผ ์ฐพ๋๋ค.
- ๊ณต์ ์ํ ๊ฒ์์ผ๋ก ์ํ ํ๋ณด๋ฅผ ์ฐพ๋๋ค.
- ๊ณต์ ๋งค์ฅ ํฝ์
์ฌ๊ณ ํ๋ฉด์ผ๋ก ํด๋น ๋งค์ฅ์ ์ฌ๊ณ ๋ฅผ ํ์ธํ๋ค.
- ๊ณต์ ํ๋ฉด์ด ๋งค์ฅ ๋ด ์ง์ด ์์น๋ฅผ ์ฃผ์ง ์์ผ๋ฉด ์ฌ๊ณ ์ค์ฌ์ผ๋ก๋ง ๋ตํ๋ค.
When to use
- "๊ฐ๋จ์ญ2ํธ์ ์ ๋ฆฌ๋ค์ท ์์ด?"
- "๋ค์ด์ ํน์ ๋งค์ฅ ์ฌ๊ณ ํ์ธํด์ค"
- "์ด ์ํ ์ด๋ ๋งค์ฅ์ ์๋์ง ํ์ธํด์ค"
- "๋ค์ด์ ๋งค์ฅ๋ช
์ฃผ๋ฉด ๊ทธ ๋งค์ฅ ์ฌ๊ณ ๋ด์ค"
When not to use
- ๋งค์ฅ๋ช
๋ ์ํ๋ช
๋ ์ ํ ์๋ ์ํ์์ ๋ฐ๋ก ์ฌ๊ณ ๋ฅผ ๋จ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๊ฒฐ์ /์ฃผ๋ฌธ/ํฝ์
์์ฝ๊น์ง ์๋ํํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋น๊ณต์ ํฌ๋กค๋ง ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ
Prerequisites
- ์ธํฐ๋ท ์ฐ๊ฒฐ
node 18+
- ์ด ์ ์ฅ์์
daiso-product-search package ๋๋ ๋์ผ ๋ก์ง
Required inputs
1. Ask the store name first if it is missing
๋งค์ฅ๋ช
์ด ์์ผ๋ฉด ๋ฐ๋ก ์กฐํํ์ง ๋ง๊ณ ๋จผ์ ๋ฌผ์ด๋ณธ๋ค.
- ๊ถ์ฅ ์ง๋ฌธ:
์ด๋ ๋ค์ด์ ๋งค์ฅ์ ํ์ธํ ๊น์? ๋งค์ฅ๋ช
(์: ๊ฐ๋จ์ญ2ํธ์ )์ ์๋ ค์ฃผ์ธ์.
- ๋น์ทํ ๋งค์ฅ์ด ์ฌ๋ฌ ๊ฐ๋ฉด:
ํ๋ณด ๋งค์ฅ์ด ์ฌ๋ฌ ๊ฐ์์. ์ ํํ ๋งค์ฅ๋ช
์ ํ๋๋ง ๊ณจ๋ผ์ฃผ์ธ์.
2. Ask the product name or keyword if it is missing
์ํ๋ช
/๊ฒ์์ด๋ ๋ฐ๋์ ํ์ํ๋ค.
- ๊ถ์ฅ ์ง๋ฌธ:
์ฐพ์ ์ํ๋ช
์ด๋ ๊ฒ์์ด๋ ์๋ ค์ฃผ์ธ์. ์: VT ๋ฆฌ๋ค์ท 100
- ๋๋ฌด ๋์ผ๋ฉด:
๊ฒ์์ด๊ฐ ๋๋ฌด ๋์ด์. ๋ธ๋๋๋ ์ฉ๋๊น์ง ๊ฐ์ด ์๋ ค์ฃผ์ธ์.
Official Daiso Mall surfaces
- store keyword catalog:
https://www.daisomall.co.kr/api/ms/msg/selStrSrchKeyword
- 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 summary:
https://www.daisomall.co.kr/ssn/search/Search
- 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 โ ์ธ์ฆ ํ์
- pickup eligibility fallback:
https://www.daisomall.co.kr/api/ms/msg/selPkupStr
- optional online stock cross-check:
https://www.daisomall.co.kr/api/pdo/selOnlStck
Workflow
1. Resolve the store
๊ณต์ ๋งค์ฅ ๊ฒ์ API๋ก ๋งค์ฅ๋ช
์ ๋จผ์ ํด๊ฒฐํ๋ค.
const { searchStores } = require("daiso-product-search")
const storeResult = await searchStores("๊ฐ๋จ์ญ2ํธ์ ", {
limit: 5
})
console.log(storeResult.items)
๋งค์ฅ ํ๋ณด๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด ์์ 2~3๊ฐ๋ง ๋ณด์ฌ์ฃผ๊ณ ๋ค์ ํ์ธ๋ฐ๋๋ค.
2. Resolve the product
๊ณต์ SearchGoods ํ๋ฉด์ผ๋ก ์ํ ํ๋ณด๋ฅผ ์ฐพ๋๋ค.
const { searchProducts } = require("daiso-product-search")
const productResult = await searchProducts("VT ๋ฆฌ๋ค์ท 100", {
limit: 10
})
console.log(productResult.items)
์ํ ํ๋ณด๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด ์๋ ์ฐ์ ์์๋ก ์งง๊ฒ ์ ๋ฆฌํ๋ค.
- ์ ํํ ์ผ์นํ๋ ์ด๋ฆ
- ๋ธ๋๋ + ์ฉ๋/ํธ์๊น์ง ํฌํจ๋ ์ด๋ฆ
- ๋ฆฌ๋ทฐ ์/๊ฒ์ ์ ์๊ฐ ๋์ ํ๋ณด
- ์จ๋ผ์ธ ์ฌ๊ณ ๊ต์ฐจ ํ์ธ์ด ํ์ํ๋ฉด ํ๋ณด์
onldPdNo ๋ฅผ ํจ๊ป ๋ณด์กดํ๋ค
3. Check the store pickup stock
selStrPkupStck๋ Authorization ํค๋ ์์ด ํธ์ถํ๋ฉด 403์ ๋ฐํํ๋ค.
๋ก๊ทธ์ธ ์์ด /api/auth/request๋ก ๋น๋ก๊ทธ์ธ JWT๋ฅผ ๋ฐ๊ธ๋ฐ์ AES-CBC๋ก ์ํธํํ ๋ค Bearer ํค๋๋ก ์ ๋ฌํ๋ค.
Bearer ํ ํฐ ์์ฑ ๋ฐฉ๋ฒ:
GET /api/auth/request โ ์๋ต ๋ฐ๋: JWT ํ๋ฌธ, ์๋ต ํค๋ x-dm-uid ๋ณด์กด (์ ํจ 30์ด)
- ๋๋ค 16๋ฐ์ดํธ IV ์์ฑ ํ JWT๋ฅผ AES-128-CBC / PKCS7 / ํค
"PRE_AUTH_ENC_KEY"๋ก ์ํธํ
bearer = base64(IV) + base64(์ํธ๋ฌธ) ์ผ๋ก ์กฐํฉ ํ Authorization: Bearer <bearer>, X-DM-UID: <uid> ํค๋๋ก ์ ๋ฌ
๋ฐ๋๋ {pdNo, strCd} ์ ๋ฐฐ์ด๋ก ์ฌ๋ฌ ๋งค์ฅ์ ํ ๋ฒ์ ์กฐํํ ์ ์๋ค.
์๋ต์ stck ํ๋๊ฐ "0" ๋๋ ๋น ๊ฐ์ด๋ฉด ์ฌ๊ณ ์์.
const { getStorePickupStock } = require("daiso-product-search")
const stock = await getStorePickupStock({
pdNo: "1049275",
strCd: "10224"
})
console.log(stock)
4. Use the end-to-end helper when both names are already known
const { lookupStoreProductAvailability } = require("daiso-product-search")
const result = await lookupStoreProductAvailability({
storeQuery: "๊ฐ๋จ์ญ2ํธ์ ",
productQuery: "VT ๋ฆฌ๋ค์ท 100"
})
console.log(result.selectedStore)
console.log(result.selectedProduct)
console.log(result.pickupStock)
5. Respond conservatively
์๋ต์ ์งง๊ณ ๋ช
ํํ๊ฒ ์ ๋ฆฌํ๋ค.
- ๋งค์ฅ๋ช
- ์ํ๋ช
- ๋งค์ฅ ์ฌ๊ณ ์๋ ๋๋ ์ฌ๊ณ ์์
- ํ์ํ๋ฉด ์จ๋ผ์ธ ์ฌ๊ณ ์ฐธ๊ณ ๊ฐ
- ๊ณต์ ํ๋ฉด์ด ๋งค์ฅ ๋ด ์ง์ด ์์น๋ฅผ ์ฃผ์ง ์์ผ๋ฉด
๊ณต์ ํ๋ฉด์์๋ ๋งค์ฅ ์ฌ๊ณ ๊น์ง๋ง ํ์ธ๋๋ค๊ณ ๋ถ๋ช
ํ ๋งํ๋ค.
Done when
- ๋งค์ฅ๋ช
๊ณผ ์ํ๋ช
์ด ๋ชจ๋ ํ์ธ๋์๋ค.
- ๊ณต์ ํ๋ฉด์ผ๋ก ๋งค์ฅ ํ๋ณด์ ์ํ ํ๋ณด๋ฅผ ์ฐพ์๋ค.
- ๊ณต์ ๋งค์ฅ ์ฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ต์ 1ํ ๋ฐํํ๋ค.
- ์์น ์ ๋ณด๊ฐ ์์ผ๋ฉด ์๋ค๊ณ ๋ถ๋ช
ํ ๊ณ ์งํ๋ค.
Failure modes
- ๋งค์ฅ๋ช
์ด ๋๋ฌด ๋์ผ๋ฉด ๊ฐ์ ์๊ถ์ ์ฌ๋ฌ ์ง์ ์ด ๋์์ ์กํ ์ ์๋ค.
- ์ํ๋ช
์ด ๋๋ฌด ๋์ผ๋ฉด ๋ค๋ฅธ ์ฉ๋/ํธ์ ํ๋ณด๊ฐ ๋ง์ด ์์ผ ์ ์๋ค.
- ๊ณต์ ์ฌ๊ณ ๋ ์์ ์ฐจ์ด๋ก ์ค์ ๋ฐฉ๋ฌธ ์ ์๋์ด ๋ฌ๋ผ์ง ์ ์๋ค.
- ํ์ฌ ํ์ธ๋ ๊ณต์ ํ๋ฉด์ ๋งค์ฅ ๋ด aisle/์ง์ด ์์น๋ฅผ ์ง์ ์ฃผ์ง ์์ ์ ์๋ค.
selStrPkupStck 403 โ /api/auth/request ์ฌํธ์ถ ํ Bearer๋ฅผ ์๋ก ๋น๋ํด ์ฌ์๋ํ๋ค.
- Bearer ์ฌ์๋ ํ์๋ 401/403์ด๋ฉด ์ฌ๊ณ ์๋์
retrievalStatus: "blocked" ๋ก ํ์ํ๊ณ , selPkupStr ๊ธฐ๋ฐ pickupEligibility(ํฝ์
๊ฐ๋ฅ ์ฌ๋ถ)๋ง ๋ณด์กฐ ์ ๋ณด๋ก ์ ๊ณตํ๋ค.
Notes
- ์กฐํํ ์คํฌ์ด๋ค.
- ๊ณต์ ํ๋ฉด ์ฐ์ ์์น์ ์ ์งํ๋ค.
- ๊ณต์ ํ๋ฉด์ด ์์น๋ฅผ ์ฃผ์ง ์์ผ๋ฉด ์ต์ง ์ถ์ ์ ํ์ง ์๋๋ค.
- ์ธ์ฆ ํค(
PRE_AUTH_ENC_KEY)๋ JS ๋ฒ๋ค์ ํ๋์ฝ๋ฉ๋์ด ์์ผ๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์๋ค.
selStrPkupStck ํธ์ถ ์: /api/auth/request ํธ์ถ ํ Bearer๋ฅผ ๋ง๋ค์ด ์๋ํ๋ค.
- fallback order: Bearer ์ฌ๊ณ ์กฐํ โ 401/403 ์ ํ ํฐ ์ฌ๋ฐ๊ธ ํ 1ํ ์ฌ์๋ โ ๊ตฌ์กฐํ๋ blocked ์ฌ๊ณ โ ์ ํ์
selPkupStr ํฝ์
๊ฐ๋ฅ ์ฌ๋ถ.