diff --git a/backend/app/api/carmodoo.py b/backend/app/api/carmodoo.py index 2dc339e..933bef6 100644 --- a/backend/app/api/carmodoo.py +++ b/backend/app/api/carmodoo.py @@ -158,6 +158,14 @@ class CarmodooClient: print(f"Carmodoo login error: {e}") return False + def _is_login_redirect(self, content: bytes) -> bool: + """응답이 로그인 리다이렉트인지 확인""" + if len(content) < 200: + text = content.decode('utf-8', errors='replace') + if 'GoLogin' in text or 'goLogin' in text: + return True + return False + async def search_cars( self, maker_code: Optional[str] = None, @@ -172,7 +180,8 @@ class CarmodooClient: transmission: Optional[str] = None, complex_code: Optional[str] = None, # 단지 코드 page: int = 1, - page_size: int = 50 + page_size: int = 50, + _retry: bool = False ) -> List[dict]: """차량 검색 (POST 방식 AJAX API 호출)""" @@ -270,6 +279,29 @@ class CarmodooClient: print(f"[search_cars] Response status: {response.status_code}, content length: {len(response.content)}") + # 세션 만료 감지 → 재로그인 후 재시도 + if self._is_login_redirect(response.content): + if not _retry: + print("[search_cars] Session expired (GoLogin detected), re-logging in...") + self.is_logged_in = False + self.cookies = None + login_result = await self.login() + print(f"[search_cars] Re-login result: {login_result}") + if login_result: + return await self.search_cars( + maker_code=maker_code, model_code=model_code, + year_min=year_min, year_max=year_max, + mileage_min=mileage_min, mileage_max=mileage_max, + price_min=price_min, price_max=price_max, + fuel=fuel, transmission=transmission, + complex_code=complex_code, + page=page, page_size=page_size, + _retry=True + ) + else: + print("[search_cars] Session expired even after re-login, giving up") + return [] + if response.status_code == 200: html = self._decode_response(response.content) print(f"[search_cars] Decoded HTML length: {len(html)}")