Some checks failed
ci / ci (22, ubuntu-latest) (push) Failing after 24m12s
- server/api/ai/market-price: Anthropic 스트리밍 제거, 네이버 쇼핑 API 호출로 변경 - 신품 기준 최저가 10건 조회 (가격 오름차순, 중고·렌탈 제외) - NAVER_CLIENT_ID / NAVER_CLIENT_SECRET 환경변수 사용 - MarketPriceAnalysis: 스트리밍 텍스트 UI → 구조화된 가격 비교 UI - 신품 최저가 / 평균가 / 희망가 대비 비율 요약 카드 - 상품 목록 (이미지, 상품명, 쇼핑몰, 가격, 네이버 링크) - nuxt.config: naverClientId / naverClientSecret runtimeConfig 추가
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
interface NaverShoppingItem {
|
|
title: string
|
|
link: string
|
|
image: string
|
|
lprice: string
|
|
hprice: string
|
|
mallName: string
|
|
productId: string
|
|
brand: string
|
|
category1: string
|
|
category2: string
|
|
category3: string
|
|
category4: string
|
|
}
|
|
|
|
interface NaverShoppingResponse {
|
|
lastBuildDate: string
|
|
total: number
|
|
start: number
|
|
display: number
|
|
items: NaverShoppingItem[]
|
|
}
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const config = useRuntimeConfig()
|
|
const body = await readBody(event)
|
|
|
|
const { itemName } = body as { itemName: string; salePrice: number }
|
|
|
|
if (!itemName?.trim()) {
|
|
throw createError({ statusCode: 400, message: '장비명이 필요합니다' })
|
|
}
|
|
|
|
const clientId = config.naverClientId as string
|
|
const clientSecret = config.naverClientSecret as string
|
|
|
|
if (!clientId || !clientSecret) {
|
|
throw createError({ statusCode: 500, message: '네이버 API 인증 정보가 설정되지 않았습니다' })
|
|
}
|
|
|
|
const url = new URL('https://openapi.naver.com/v1/search/shop.json')
|
|
url.searchParams.set('query', itemName)
|
|
url.searchParams.set('display', '10')
|
|
url.searchParams.set('sort', 'asc') // 가격 오름차순 (최저가 먼저)
|
|
url.searchParams.set('exclude', 'used:rental') // 중고·렌탈 제외 → 신품 기준
|
|
|
|
const response = await fetch(url.toString(), {
|
|
headers: {
|
|
'X-Naver-Client-Id': clientId,
|
|
'X-Naver-Client-Secret': clientSecret
|
|
}
|
|
})
|
|
|
|
if (!response.ok) {
|
|
const text = await response.text()
|
|
throw createError({ statusCode: response.status, message: `네이버 쇼핑 API 오류: ${text}` })
|
|
}
|
|
|
|
const data = await response.json() as NaverShoppingResponse
|
|
return data
|
|
})
|