fix: Carmodoo session expiry causing all searches to return 0 results
Detect GoLogin redirect response (126 bytes) when session cookies expire, automatically re-login and retry the search once. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -158,6 +158,14 @@ class CarmodooClient:
|
|||||||
print(f"Carmodoo login error: {e}")
|
print(f"Carmodoo login error: {e}")
|
||||||
return False
|
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(
|
async def search_cars(
|
||||||
self,
|
self,
|
||||||
maker_code: Optional[str] = None,
|
maker_code: Optional[str] = None,
|
||||||
@@ -172,7 +180,8 @@ class CarmodooClient:
|
|||||||
transmission: Optional[str] = None,
|
transmission: Optional[str] = None,
|
||||||
complex_code: Optional[str] = None, # 단지 코드
|
complex_code: Optional[str] = None, # 단지 코드
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
page_size: int = 50
|
page_size: int = 50,
|
||||||
|
_retry: bool = False
|
||||||
) -> List[dict]:
|
) -> List[dict]:
|
||||||
"""차량 검색 (POST 방식 AJAX API 호출)"""
|
"""차량 검색 (POST 방식 AJAX API 호출)"""
|
||||||
|
|
||||||
@@ -270,6 +279,29 @@ class CarmodooClient:
|
|||||||
|
|
||||||
print(f"[search_cars] Response status: {response.status_code}, content length: {len(response.content)}")
|
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:
|
if response.status_code == 200:
|
||||||
html = self._decode_response(response.content)
|
html = self._decode_response(response.content)
|
||||||
print(f"[search_cars] Decoded HTML length: {len(html)}")
|
print(f"[search_cars] Decoded HTML length: {len(html)}")
|
||||||
|
|||||||
Reference in New Issue
Block a user