o2o-castad-backend/app/home/services/naver_search.py

100 lines
3.0 KiB
Python

"""
네이버 지역 검색 API 클라이언트
숙박/펜션 자동완성 검색 기능을 제공합니다.
"""
import logging
from typing import List
import aiohttp
from config import naver_api_settings
logger = logging.getLogger(__name__)
class NaverSearchClient:
"""
네이버 지역 검색 API 클라이언트
숙박/펜션 카테고리 검색을 위한 클라이언트입니다.
"""
def __init__(self) -> None:
self.client_id = naver_api_settings.NAVER_CLIENT_ID
self.client_secret = naver_api_settings.NAVER_CLIENT_SECRET
self.api_url = naver_api_settings.NAVER_LOCAL_API_URL
async def search_accommodation(
self,
query: str,
display: int = 5,
) -> List[dict]:
"""
숙박/펜션 검색
Args:
query: 검색어
display: 결과 개수 (기본 5개)
Returns:
검색 결과 리스트 (address, roadAddress, title)
"""
# 숙박/펜션 카테고리 검색을 위해 쿼리에 키워드 추가
search_query = f"{query} 숙박"
headers = {
"X-Naver-Client-Id": self.client_id,
"X-Naver-Client-Secret": self.client_secret,
}
params = {
"query": search_query,
"display": display,
"sort": "random", # 정확도순
}
logger.info(f"[NAVER] 지역 검색 요청 - query: {search_query}")
try:
async with aiohttp.ClientSession() as session:
async with session.get(
self.api_url,
headers=headers,
params=params,
) as response:
if response.status != 200:
error_text = await response.text()
logger.error(
f"[NAVER] API 오류 - status: {response.status}, error: {error_text}"
)
return []
data = await response.json()
items = data.get("items", [])
# 필요한 필드만 추출
results = [
{
"address": item.get("address", ""),
"roadAddress": item.get("roadAddress", ""),
"title": item.get("title", ""),
}
for item in items
]
logger.info(f"[NAVER] 검색 완료 - 결과 수: {len(results)}")
return results
except aiohttp.ClientError as e:
logger.error(f"[NAVER] 네트워크 오류 - {str(e)}")
return []
except Exception as e:
logger.error(f"[NAVER] 예기치 않은 오류 - {str(e)}")
return []
# 싱글톤 인스턴스
naver_search_client = NaverSearchClient()