From 13533913fb22e617950678c1d9a4cc4ad8a4bf7e Mon Sep 17 00:00:00 2001 From: 9700X_PC <9700X_PC@gmail.com> Date: Sun, 30 Mar 2025 22:49:30 +0900 Subject: [PATCH] ... --- app.log | 209 ++++++++++++++++++ .../__pycache__/app_manager.cpython-311.pyc | Bin 6982 -> 7158 bytes modules/__pycache__/app_state.cpython-311.pyc | Bin 1358 -> 1358 bytes modules/__pycache__/backend.cpython-311.pyc | Bin 2753 -> 2753 bytes .../__pycache__/category_page.cpython-311.pyc | Bin 1753 -> 1753 bytes .../__pycache__/db_manager.cpython-311.pyc | Bin 7540 -> 9687 bytes modules/__pycache__/export.cpython-311.pyc | Bin 2163 -> 2163 bytes .../forbidden_page.cpython-311.pyc | Bin 1753 -> 1753 bytes modules/__pycache__/logger.cpython-311.pyc | Bin 3546 -> 3546 bytes .../__pycache__/login_page.cpython-311.pyc | Bin 7867 -> 8453 bytes .../market_actions.cpython-311.pyc | Bin 0 -> 2481 bytes .../__pycache__/market_page.cpython-311.pyc | Bin 5371 -> 5628 bytes .../product_filter.cpython-311.pyc | Bin 2407 -> 2407 bytes .../__pycache__/product_page.cpython-311.pyc | Bin 6901 -> 6901 bytes .../__pycache__/project_info.cpython-311.pyc | Bin 2128 -> 2128 bytes .../setting_manager.cpython-311.pyc | Bin 4900 -> 4900 bytes modules/app_manager.py | 35 ++- modules/login_page.py | 10 + modules/market_actions.py | 45 ++++ modules/market_page.py | 44 ++-- poetry.lock | 171 +++++++++++++- pyproject.toml | 4 +- tests/__pycache__/re.cpython-311.pyc | Bin 0 -> 1281 bytes tests/test_market_actions.py | 18 ++ tests/uc.py | 97 ++++++++ 25 files changed, 596 insertions(+), 37 deletions(-) create mode 100644 modules/__pycache__/market_actions.cpython-311.pyc create mode 100644 modules/market_actions.py create mode 100644 tests/__pycache__/re.cpython-311.pyc create mode 100644 tests/test_market_actions.py create mode 100644 tests/uc.py diff --git a/app.log b/app.log index 198782d..9ccaead 100644 --- a/app.log +++ b/app.log @@ -237,3 +237,212 @@ postgrest.exceptions.APIError: {'code': '42P01', 'details': None, 'hint': None, [2025-03-28 14:15:33,963] [DEBUG] Building ProductPage content [2025-03-28 14:15:33,964] [DEBUG] ForbiddenPage initialized [2025-03-28 14:15:33,965] [DEBUG] CategoryPage initialized +[2025-03-30 08:27:31,100] [DEBUG] Logger initialized +[2025-03-30 08:27:31,101] [DEBUG] Initializing DBManager... +[2025-03-30 08:27:31,227] [DEBUG] DBManager initialized +[2025-03-30 08:27:31,228] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:27:31,228] [DEBUG] Initializing LoginPage... +[2025-03-30 08:27:47,528] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:27:47,528] [DEBUG] Entering DBManager.login() +[2025-03-30 08:27:47,652] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:27:47,748] [DEBUG] Client updated with JWT token +[2025-03-30 08:27:47,748] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:27:47,748] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:27:47,749] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:27:47,749] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:27:47,749] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:27:47,920] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:27:47,920] [DEBUG] Exiting update_last_login() +[2025-03-30 08:27:47,921] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:27:47,921] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:27:47,921] [DEBUG] Building MarketPage content +[2025-03-30 08:27:47,922] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:27:47,922] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:27:47,939] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:27:47,943] [DEBUG] Building ProductPage content +[2025-03-30 08:27:47,944] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:27:47,944] [DEBUG] CategoryPage initialized +[2025-03-30 08:29:38,671] [DEBUG] Logger initialized +[2025-03-30 08:29:38,672] [DEBUG] Initializing DBManager... +[2025-03-30 08:29:38,804] [DEBUG] DBManager initialized +[2025-03-30 08:29:38,804] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:29:38,804] [DEBUG] Initializing LoginPage... +[2025-03-30 08:29:49,696] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:29:49,696] [DEBUG] Entering DBManager.login() +[2025-03-30 08:29:49,807] [ERROR] Login error: Invalid login credentials +Traceback (most recent call last): + File "D:\py\Resell1\.venv\Lib\site-packages\gotrue\_sync\gotrue_base_api.py", line 120, in _request + response.raise_for_status() + File "D:\py\Resell1\.venv\Lib\site-packages\httpx\_models.py", line 829, in raise_for_status + raise HTTPStatusError(message, request=request, response=self) +httpx.HTTPStatusError: Client error '400 Bad Request' for url 'http://146.56.101.199:8000/auth/v1/token?grant_type=password' +For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "D:\py\Resell1\modules\db_manager.py", line 33, in login + response = self.client.auth.sign_in_with_password({"email": email, "password": password}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\py\Resell1\.venv\Lib\site-packages\gotrue\_sync\gotrue_client.py", line 270, in sign_in_with_password + response = self._request( + ^^^^^^^^^^^^^^ + File "D:\py\Resell1\.venv\Lib\site-packages\gotrue\_sync\gotrue_base_api.py", line 125, in _request + raise handle_exception(e) +gotrue.errors.AuthApiError: Invalid login credentials + +[2025-03-30 08:29:49,808] [WARNING] 로그인 실패: Invalid login credentials +[2025-03-30 08:29:56,270] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:29:56,271] [DEBUG] Entering DBManager.login() +[2025-03-30 08:29:56,400] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:29:56,496] [DEBUG] Client updated with JWT token +[2025-03-30 08:29:56,496] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:29:56,496] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:29:56,496] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:29:56,496] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:29:56,496] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:29:56,659] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:29:56,659] [DEBUG] Exiting update_last_login() +[2025-03-30 08:29:56,660] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:29:56,660] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:29:56,661] [DEBUG] Building MarketPage content +[2025-03-30 08:29:56,661] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:29:56,661] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:29:56,678] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:29:56,682] [DEBUG] Building ProductPage content +[2025-03-30 08:29:56,683] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:29:56,683] [DEBUG] CategoryPage initialized +[2025-03-30 08:31:47,785] [DEBUG] Logger initialized +[2025-03-30 08:31:47,785] [DEBUG] Initializing DBManager... +[2025-03-30 08:31:47,910] [DEBUG] DBManager initialized +[2025-03-30 08:31:47,911] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:31:47,911] [DEBUG] Initializing LoginPage... +[2025-03-30 08:31:59,683] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:31:59,683] [DEBUG] Entering DBManager.login() +[2025-03-30 08:31:59,811] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:31:59,906] [DEBUG] Client updated with JWT token +[2025-03-30 08:31:59,906] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:31:59,907] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:31:59,907] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:31:59,907] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:31:59,907] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:32:00,077] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:32:00,078] [DEBUG] Exiting update_last_login() +[2025-03-30 08:32:00,079] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:32:00,079] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:32:00,079] [DEBUG] Building MarketPage content +[2025-03-30 08:32:00,079] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:32:00,079] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:32:00,095] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:32:00,099] [DEBUG] Building ProductPage content +[2025-03-30 08:32:00,100] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:32:00,100] [DEBUG] CategoryPage initialized +[2025-03-30 08:32:02,135] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:32:02,782] [DEBUG] 탭 전환됨, 인덱스: 2 +[2025-03-30 08:32:22,468] [DEBUG] 탭 전환됨, 인덱스: 0 +[2025-03-30 08:32:26,650] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:33:19,532] [DEBUG] Logger initialized +[2025-03-30 08:33:19,533] [DEBUG] Initializing DBManager... +[2025-03-30 08:33:19,659] [DEBUG] DBManager initialized +[2025-03-30 08:33:19,659] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:33:19,659] [DEBUG] Initializing LoginPage... +[2025-03-30 08:33:28,069] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:33:28,070] [DEBUG] Entering DBManager.login() +[2025-03-30 08:33:28,194] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:33:28,290] [DEBUG] Client updated with JWT token +[2025-03-30 08:33:28,291] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:33:28,291] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:33:28,292] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:33:28,292] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:33:28,292] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:33:28,447] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:33:28,447] [DEBUG] Exiting update_last_login() +[2025-03-30 08:33:28,448] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:33:28,449] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:33:28,449] [DEBUG] Building MarketPage content +[2025-03-30 08:33:28,449] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:33:28,449] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:33:28,466] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:33:28,470] [DEBUG] Building ProductPage content +[2025-03-30 08:33:28,470] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:33:28,471] [DEBUG] CategoryPage initialized +[2025-03-30 08:33:31,207] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:33:31,209] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:33:31,229] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:33:35,081] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:33:36,601] [DEBUG] 탭 전환됨, 인덱스: 0 +[2025-03-30 08:35:58,828] [DEBUG] Logger initialized +[2025-03-30 08:35:58,829] [DEBUG] Initializing DBManager... +[2025-03-30 08:35:58,956] [DEBUG] DBManager initialized +[2025-03-30 08:35:58,956] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:35:58,957] [DEBUG] Initializing LoginPage... +[2025-03-30 08:36:08,089] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:36:08,089] [DEBUG] Entering DBManager.login() +[2025-03-30 08:36:08,199] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:36:08,294] [DEBUG] Client updated with JWT token +[2025-03-30 08:36:08,294] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:36:08,294] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:36:08,294] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:36:08,294] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:36:08,295] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:36:08,460] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:36:08,460] [DEBUG] Exiting update_last_login() +[2025-03-30 08:36:08,461] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:36:08,461] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:36:08,462] [DEBUG] Building MarketPage content +[2025-03-30 08:36:08,462] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:36:08,462] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:36:08,479] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:36:08,483] [DEBUG] Building ProductPage content +[2025-03-30 08:36:08,484] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:36:08,484] [DEBUG] CategoryPage initialized +[2025-03-30 08:36:09,933] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:36:09,935] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:36:09,954] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:36:12,339] [DEBUG] 탭 전환됨, 인덱스: 2 +[2025-03-30 08:36:12,733] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:36:14,050] [DEBUG] 탭 전환됨, 인덱스: 3 +[2025-03-30 08:36:14,651] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:36:26,073] [DEBUG] 탭 전환됨, 인덱스: 0 +[2025-03-30 08:40:42,155] [DEBUG] Logger initialized +[2025-03-30 08:40:42,156] [DEBUG] Initializing DBManager... +[2025-03-30 08:40:42,282] [DEBUG] DBManager initialized +[2025-03-30 08:40:42,283] [DEBUG] AppManager.start() - 시작, 로그인 페이지 표시 +[2025-03-30 08:40:42,283] [DEBUG] Initializing LoginPage... +[2025-03-30 08:40:50,870] [DEBUG] LoginPage.login() 호출됨 +[2025-03-30 08:40:50,870] [DEBUG] Entering DBManager.login() +[2025-03-30 08:40:51,008] [DEBUG] Entering update_client_with_token() +[2025-03-30 08:40:51,103] [DEBUG] Client updated with JWT token +[2025-03-30 08:40:51,103] [DEBUG] Exiting update_client_with_token() +[2025-03-30 08:40:51,103] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:40:51,104] [DEBUG] Exiting DBManager.login() +[2025-03-30 08:40:51,104] [DEBUG] 로그인 성공: {'id': '909d2ef8-7053-4006-ab40-49eb49f20383', 'email': 'leensoo1nt@gmail.com', 'nickname': 'Unknown'} +[2025-03-30 08:40:51,104] [DEBUG] Entering update_last_login(user_id=909d2ef8-7053-4006-ab40-49eb49f20383) +[2025-03-30 08:40:51,256] [INFO] Last login updated for user 909d2ef8-7053-4006-ab40-49eb49f20383 +[2025-03-30 08:40:51,256] [DEBUG] Exiting update_last_login() +[2025-03-30 08:40:51,257] [DEBUG] AppManager.on_login_success() 호출됨 +[2025-03-30 08:40:51,257] [DEBUG] AppManager.show_main_ui() 호출됨 +[2025-03-30 08:40:51,257] [DEBUG] MarketPage initialized +[2025-03-30 08:40:51,258] [DEBUG] Building MarketPage content +[2025-03-30 08:40:51,258] [DEBUG] Building ProductPage content +[2025-03-30 08:40:51,258] [DEBUG] ForbiddenPage initialized +[2025-03-30 08:40:51,259] [DEBUG] CategoryPage initialized +[2025-03-30 08:40:52,841] [DEBUG] MarketPage.load_market_list() 호출됨 +[2025-03-30 08:40:52,842] [DEBUG] Entering DBManager.get_markets() +[2025-03-30 08:40:52,860] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:40:52,863] [DEBUG] Retrieved markets: [{'id': 40, 'market_name': '소오행', 'market_url': 'https://smartstore.naver.com/hduo', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.055264+09:00'}, {'id': 41, 'market_name': '더담온', 'market_url': 'https://smartstore.naver.com/thedamon', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.096337+09:00'}, {'id': 42, 'market_name': 'nolly', 'market_url': 'https://smartstore.naver.com/jb__mall', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.159303+09:00'}, {'id': 43, 'market_name': '전부다사니7', 'market_url': 'https://smartstore.naver.com/dasani7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.200015+09:00'}, {'id': 44, 'market_name': '서울네임', 'market_url': 'https://smartstore.naver.com/seoulname', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.239592+09:00'}, {'id': 45, 'market_name': '제이에이-코퍼레이션', 'market_url': 'https://smartstore.naver.com/wpdldpdl5889', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.277585+09:00'}, {'id': 46, 'market_name': '도팅크: 꼭 필요한 잡화점', 'market_url': 'https://smartstore.naver.com/dothink2', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.316331+09:00'}, {'id': 47, 'market_name': '마켓 에스', 'market_url': 'https://smartstore.naver.com/markets7', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.354437+09:00'}, {'id': 48, 'market_name': '홍콩 리미티드', 'market_url': 'https://smartstore.naver.com/hk2018911', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.392223+09:00'}, {'id': 49, 'market_name': '제비인터내셔널', 'market_url': 'https://smartstore.naver.com/jebi-intl', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.430131+09:00'}, {'id': 50, 'market_name': 'meTime', 'market_url': 'https://smartstore.naver.com/me___time', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.468699+09:00'}, {'id': 51, 'market_name': '언노운커머스', 'market_url': 'https://smartstore.naver.com/unkcomm', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.506583+09:00'}, {'id': 52, 'market_name': '도쿄몬스터', 'market_url': 'https://smartstore.naver.com/tokyomonster', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.543724+09:00'}, {'id': 53, 'market_name': '캘리보리', 'market_url': 'https://smartstore.naver.com/calibori', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.580153+09:00'}, {'id': 54, 'market_name': 'AVANI', 'market_url': 'https://smartstore.naver.com/abai-mall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.616694+09:00'}, {'id': 55, 'market_name': '구매대행이영', 'market_url': 'https://smartstore.naver.com/sheek0900', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.65542+09:00'}, {'id': 56, 'market_name': '어센틱클럽', 'market_url': 'https://smartstore.naver.com/authenticclub', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.690294+09:00'}, {'id': 57, 'market_name': '블랑쉐쇼어', 'market_url': 'https://smartstore.naver.com/blanchetshore', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.727035+09:00'}, {'id': 58, 'market_name': '송이네직구', 'market_url': 'https://smartstore.naver.com/bestlife0', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.763872+09:00'}, {'id': 59, 'market_name': '코비즈몰', 'market_url': 'https://smartstore.naver.com/kobismall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.801908+09:00'}, {'id': 60, 'market_name': '꾸미다홈', 'market_url': 'https://smartstore.naver.com/kkumidahome', 'market_grade': '일반', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.840859+09:00'}, {'id': 61, 'market_name': '행복한직구곧감', 'market_url': 'https://smartstore.naver.com/goatgam', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.878412+09:00'}, {'id': 62, 'market_name': '하버홀세일', 'market_url': 'https://smartstore.naver.com/hbwholesale', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.915608+09:00'}, {'id': 63, 'market_name': '트로스트몰', 'market_url': 'https://smartstore.naver.com/pictel', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.953079+09:00'}, {'id': 64, 'market_name': '글로버디', 'market_url': 'https://smartstore.naver.com/globuddy', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:38.988935+09:00'}, {'id': 65, 'market_name': '국대 상사', 'market_url': 'https://smartstore.naver.com/korea_tool_market', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.029876+09:00'}, {'id': 66, 'market_name': '마이프라이빗', 'market_url': 'https://smartstore.naver.com/private23', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.065646+09:00'}, {'id': 67, 'market_name': '액티브웨이브', 'market_url': 'https://smartstore.naver.com/konan_shop', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.104063+09:00'}, {'id': 68, 'market_name': '드림보이스', 'market_url': 'https://smartstore.naver.com/dreamvoice', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.140983+09:00'}, {'id': 69, 'market_name': '아웃핏플로우', 'market_url': 'https://smartstore.naver.com/outfitflow', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.177959+09:00'}, {'id': 70, 'market_name': '아호구대', 'market_url': 'https://smartstore.naver.com/ahointer131', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.214153+09:00'}, {'id': 71, 'market_name': '클릭스마켓', 'market_url': 'https://smartstore.naver.com/click_s', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.252121+09:00'}, {'id': 72, 'market_name': '젤피샵', 'market_url': 'https://smartstore.naver.com/jelfishop', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.288807+09:00'}, {'id': 73, 'market_name': '미우크굿즈', 'market_url': 'https://smartstore.naver.com/mjukgoods', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.325675+09:00'}, {'id': 74, 'market_name': '모드다', 'market_url': 'https://smartstore.naver.com/modeuda', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.363111+09:00'}, {'id': 75, 'market_name': '아스코지 Askozy', 'market_url': 'https://smartstore.naver.com/askozymall', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.401901+09:00'}, {'id': 76, 'market_name': '마토리상사', 'market_url': 'https://smartstore.naver.com/matoritrading', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.439193+09:00'}, {'id': 77, 'market_name': '하인정', 'market_url': 'https://smartstore.naver.com/godinjung', 'market_grade': '파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.475836+09:00'}, {'id': 78, 'market_name': '소앤지샵', 'market_url': 'https://smartstore.naver.com/songandgang', 'market_grade': '빅파워', 'market_memo': '', 'created_at': '2025-03-28T20:02:39.512588+09:00'}] +[2025-03-30 08:41:30,511] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:41:41,840] [DEBUG] 탭 전환됨, 인덱스: 2 +[2025-03-30 08:41:42,505] [DEBUG] 탭 전환됨, 인덱스: 3 +[2025-03-30 08:41:43,371] [DEBUG] 탭 전환됨, 인덱스: 2 +[2025-03-30 08:41:43,907] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:41:44,977] [DEBUG] 탭 전환됨, 인덱스: 0 +[2025-03-30 08:41:50,774] [DEBUG] MarketPage.add_market() 호출됨 +[2025-03-30 08:41:53,800] [DEBUG] MarketPage.load_sold_products() 호출됨 +[2025-03-30 08:42:07,395] [DEBUG] 탭 전환됨, 인덱스: 1 +[2025-03-30 08:42:10,015] [DEBUG] 탭 전환됨, 인덱스: 0 +[2025-03-30 08:42:25,596] [DEBUG] MarketPage.load_sold_products() 호출됨 +[2025-03-30 09:20:56,412] [DEBUG] Logger initialized +[2025-03-30 09:20:56,413] [DEBUG] Entering fetch_sold_products() +[2025-03-30 09:20:56,413] [DEBUG] Fetching URL: https://smartstore.naver.com/modeuda/best?cp=1 +[2025-03-30 09:20:56,485] [ERROR] HTTP error 429 for URL: https://smartstore.naver.com/modeuda/best?cp=1 diff --git a/modules/__pycache__/app_manager.cpython-311.pyc b/modules/__pycache__/app_manager.cpython-311.pyc index 08d8f5e33ac1c93dc2b582896ea2f6befa5aac9a..92c02f72c0deb9f37f637ed9afdf49d84d3d4467 100644 GIT binary patch delta 1063 zcmZ`%Z%7ki7=Q2f@7;Dc&)sdeKaN~ZVi=O885Aq~10}j3{{;~;yfG(pv)e>L#h?g< zAmlabL&QGR3L039Lg+*J!9GtJc?=?gg8C3l(uh9w++-^upX2%6^ZuUa{XOsd+`T*c zv)%H9Wlad|)s3$aVtrwGiD|1Yw~9>~E`lTrJT+M^qebYMmV7WbP_=|&>~vZrAF-{? zD)AW_Qs6r#36d>q&**>y-?15EYF{NrXv9G}Otx8Dg_(yIS#h_@v@t@1k|pcNXg~>k z$7W2Da~_RUyNx(2nL$@2l3aUKxGNQEUZ^boN~G(E$LJ$hScVy?c1(Ln8+(M%Y@=3k zrvhYw<^6RxnHlr68DuIVXt2H#N~j0vH(%GAEx_ z)oA%Fyvi|&*Vgj}Sn=RL?gQMV@1c2$EEwtosp^-2=~r(yjU-BzH{zYzh3TuOi>>i8wWSq8DwKPu2O#gQt9INKO{V&z;fbR03=B0CjfZ8qlf2;%>f|1^sKig{`_+AYS?`1jfGri~ z*ljBkor}>goOO{&_dfUKx%M@#y}-3AoTsGIu$B@=B`Z`gbV;pPHv&f{jX;t)uS*hJynRZ&k-2_iX~sU#te6>66BIXn6Dl&-ae z{=r_FEIDtvCe&N1f1KE7DCZzFLI3Q1vi>~F935s%;(Eo9>%x~?HEsOpEp6~MI delta 957 zcmZ`%OK1~87@par+s$LsCcAlU`iN<(1WF&GsRjG6>OrNA&=eGe7&2>`7?ZL|B-FI_ zAd*NyWhz$ikW(#KC=!I;#6v|qCD21zDSGnUVlC2xI-9T&!TvDce)E6-eltJ+91MK$ znO?E19*_w4eT(#%-|@>6@w}-Qfe>wor6Ap2=!i#+;BG(&xleJDU!|*@M@&1odQg;mIWI340}$M5c(IXt8y5gQ*9JiV delta 20 acmX>odQg;mIWI340}#j=Jln{Yl?HkM delta 20 acmcb~dy|)YIWI340}yP{dA5=J92)>VX9f8H diff --git a/modules/__pycache__/db_manager.cpython-311.pyc b/modules/__pycache__/db_manager.cpython-311.pyc index f174f6ddb2d915706945a4600e6cac5409546ba6..814674d3bd2f068995a9406216a9b4ab49c6d435 100644 GIT binary patch delta 2092 zcmaJ>ZERCj7(TaOYrEUEu+r{(XJd&iLaP!p-I!+B;Rf3vYxyw|O6k4(qHD{!w+?Dc zF-}tf4cpz^kWEWOU;@d+h45oBMj_#sX_v+=jU@cgMC@%c5`OW^b6Pss9G-jcdCxiT z^FHs_z4vj$;+~=_8jTv@@#klM_ii_i6#Y(lM*cdeXBA8VtL%|6nqk>{8m7n&%-SD! zQ46JXN^Atz%FCo*RuY}F02SC zxQcunWsGWFkBV3!DbObMYHhfHF9AUKX=ByKP{A6Nl2mP5;p$Tggp_u$8SoXvcW%@H z^m160k08R(Ar&b!qq$ymS%O2wPi~Ox-I8v=Xv3JAxv#6GeQ&d^#pbj-njI}pC(MlBNPj;gP7g!z)|hx}Dlct7BPmjU>;fy>Z zwH{$P{%yCv>D5{&e*MYX@Pkz?UYPz#6pSZ~e)u?^M@^?MoL(EFBk z+Rg4dB+#PPP{%I_Fz0*2MqhYkndxm-_^@LB>#h;2}c-l_p$54xq#cv za$HZq<2iwI&xV&x{68r*K!=$^)tIu=tVQI*OUW7bNT4^RKpc-ytVRYbP$w~0lHQS53B69XvOa#$lPd7Lc-%2;HR!^vNEH#ctdkHqaa<`m-bXN? z9-D9^?EIGmAu}qtZc7@s&C&_uj%e!=tvkDCk*-{zE8|t|Kb!D` z?*!eEq&wnt$9-e;?UNV-RQ!N!o%Ey|bwg-l$=)3pzhKaV(w#nWYf1~SqcS2vE)YnH_ zmWoT3fkacbin}YJvnO@-xXzyAsjU6xz*h&ZZa9Bv>QJ=vzP@B)_vr4)lL@^gskdN` z=W}XJ&}~V&El#&#YDu(RxL8(Folkh@?PKw(o%p`zh|`q`x+_U{#px~~RaUWmE3WNS zbA!zaela%FSo~Votj6MwRozl2z4In)sg~X?rSST0wH(i#<|3iI{6Gz2u;C0qrC4Me zi&SJqCMABjKZMcpIdes&+;G*s46vAGvf>4k&{1KpNBi>>=qOpOa6eJ*z(1*ghkXlq vv4VVP+&G?=r4&Uy5FS+Mg+~={v}#XfuVooaQHEu({`@F={`dvjtj~V|L&|@` delta 200 zcmcca{l$uJIWI340}$ltKTCfoFp=*XW6Z>-u`Iz1n!KCC7%xdO`)Tq{PEd}Xd_Y;6 zao6NK%3IhOcv!_gFz`&?sS<2*i?gICF*!9UF*&=46KG6P2#Amb5#m7N7l%!5eoARh qs$Ee8kjn_f#WN;bsfKzBTws8r4=iqsj6egilOMt2UvS8RZ2|zxDKu#S diff --git a/modules/__pycache__/export.cpython-311.pyc b/modules/__pycache__/export.cpython-311.pyc index c17ac1fabb8b64799c5a8f8cb922b20b3ef276b6..acc5289e43f46dbc94cdc785c557f88b574fe6b3 100644 GIT binary patch delta 20 acmew?@L7O+IWI340}$M5c(IW?g989V@dir( delta 20 acmew?@L7O+IWI340}u!qJln{f!2tj~j|DLR diff --git a/modules/__pycache__/forbidden_page.cpython-311.pyc b/modules/__pycache__/forbidden_page.cpython-311.pyc index fa08596e68faae00706d1b48b9cd9764677ce215..89aa26ba298a56141ef9c7315698764434e3e6c1 100644 GIT binary patch delta 20 acmcb~dy|)YIWI340}$M6e6f-H92)>Yl?HkM delta 20 acmcb~dy|)YIWI340}!m!dA5=J92)>VJq7as diff --git a/modules/__pycache__/logger.cpython-311.pyc b/modules/__pycache__/logger.cpython-311.pyc index 45cd330dc0f520ac81249b2d93708b1329da044e..10f27ef6ca22f2910c40a34638c6f4dc18d6f990 100644 GIT binary patch delta 20 acmca5eM_2qIWI340}$M6e6f-HJTCx3yau2E delta 20 acmca5eM_2qIWI340}$Moe72GMJTCx1Nd`9n diff --git a/modules/__pycache__/login_page.cpython-311.pyc b/modules/__pycache__/login_page.cpython-311.pyc index fce25e8a93094dee90cdd74d55bf44060acb6c5e..a45c60f335243920de07c63a1332b1edd64cf343 100644 GIT binary patch delta 602 zcmdmO+v>!(oR^o20SI(jUZj_bZRC@eU@~CYtS@ndiLZtsOBf^t0t-YYf0R&WWvyXd zAUZjbQB;&=86yM3Y9NMyA_bU?HcJZYGA5uL5JLda95EO>UL3}PsTXC#Ws)fy7Lz1k z`jJdRGJk>O#Ii!UcXF(tmVIJGD~GcPT_$RDIC1Vki(2vZPY1|&4uCeM)8<1WesvWwY( zgu>+0(yEMyH-7|@^&i+6L?y3?XkHhwxFlk6QN-$sh*byY4Q`Qs+b-J~;upCUuW&1V zU|{5QX1t+cxSn?v?}qdpMHe-ku4p)QxLo0pzrv#mQ!RCoTjdJ33P`mZTy@p~rHdM_ zS2SEE;rvr2zpKqn^uk=5YN n1Nn&sM6^!Umy=-ZnCu~EV(-Mn2-JX`{0J8Rf zU~6MU3I_gNXyO`y&<*$sg+O`~L#dU1X2eM1^63ZiLZ&NuAu3cED6My zA^`{|Wv)tzy`&dc$J8e^rCFLhrD(DZup)*PU%)8o088zQHdhc`p)k;_PDa` z$4V)24Xulld{wCrymX~@jEre`Q>h0t`cnHEFuJkAKdy~wxw>M!%d^v$<)KX}Ia5L{ zN!qYhJ6^$WD9r&2s??5Eyrif5&pkJ;)h19(*Nt9B{H78fLJf$u#`S=*>6LM&VtRRJ z>B^g?YmjF*Rx(hItygs%(N%H%r~2-q93qC$u=+R}B5dZ!-;iJi3`P3>zV!87>G~)Z zuP3DY7xB?9r!;w98lA%8?UXb&lOJ2a(&wM$FC=jO%cL|7x+7L8nXuylo)2^OrX~(f z1JCgxmT3%nK4#cPZ)mV-FhnyE+S7D`;rN5zaO*A`pkgWYmGs5g{H3Hcc~e>5?LOS) zaCWw}JKEjdJ#9S>w;Sg#-4cJ8lcqoE)eqh z7}kz~!qSiPMLtXOBjDQ9(w(2g^GR{;E*2*y#M`4wKQA;%$rr>pQSVajk{8(1elHJm3lZ?VUYsPNzWn*ia-aXijpWpg;yf9-0&Mj$tno=KZ0d&A`f+mY^-z zMY(V&$T5OufFBG96=4q#+XNVc9*DnSl36fr8P*Ln1ybn?1jETUn4Iy2@_a|Ty)S&a zuZ!WBKwwuN9LPw3;rfc_!Q+)_aE;;9f~8Dw*lhqNU!dGMi1`Rw-iUOjWkir~=X9oX z)EJenZO-UgvbvVEu4P%ZiL8EX+46^_;gO{w)t#}}vKHH{Gh^AC(B+Klz)s(iqpHt2 z$DHZ9J+oG*;LT9YS*kfrH7{B=PwY?W3TCo}C2M>wwfm8Ad)l}?S5*u4l^+s0^ZH5Z z0+rr!barp{je{WJeYm$EGv;Gi^Rcw~Sk6+Lct2OQ;Y>WCd0hQYqGHipJ)uwTNbR{* zeX}lO-kmk?PLR2(nq{QcuP=gku7Y=D%&x52l{UKyNOkq!ZvJL->d58#srrOz(OffO zNFKOdam1FNS6cb4(Q6K vjynR?vYH@>9MX>{PYxMJlqZL(MwDk+VjtehRU_r?ST3ZvQ5)} literal 0 HcmV?d00001 diff --git a/modules/__pycache__/market_page.cpython-311.pyc b/modules/__pycache__/market_page.cpython-311.pyc index d50a202883ff194e65e4298fe0ddb567abf33438..5c37a84a053f1a857d663f1b2c077ad8788de207 100644 GIT binary patch literal 5628 zcmcgwZ%iA>72mbj_WBQIF@zW}#$37fe7yj7zO4XcX(a(d9Lbw! zigh59x6D|J-6ko{e2p5janvL4o9R+P$G-Plo?8RWhr6?*Q_Eb&m@jqgBEvi zE0RbNtL0EAut`AmZn3(^c>FxEusZli%2h;gPUNZp%|=B z)GQo7k&I|H6Uk|TW5e;7#K)u{rBMl9m@M@XY3P_hGYLR?+A-8OK6_<+gojqb>*LWl zmlXKKcvM#(i!|3cdqtyJ7EOU==juzd>MSzRd=e*t%oCXgZ<<=LXBvI*a%P%4;8mNU zT?@`_x@n7UlAGU9=pL2sk?9^_Z_~|NbhASHRN5yOpT{7H2xHAb!47|<<;NzVH$js# zP{^m%@^(cg*k`5oB{a!Gn!!89nGAfqKb)DPHY`SK=ByjGHRyQ<_Xdl=QVnvj&2lu% z)m9vL!)}xa{n2LVX^;L6=#N&frz-t*pGB2>^mjskXTCQ#oYh z+TdJ9of}KfC8@^P*I0TkNp53bV<}>e5L_+CY}Bp6&fmei5BpMEb*)TQZe5WJy2kqn zdAv7}$9j&KInPFYr5()R@gk;b^{l5jhK>#m!*eaikeg4(B7u@a1`1A}MDxtvO7GnJ zbzt|GOFJuH?A)4v;02~eO~eH*XaZ0GEYYl&`RT}%q**3}Q1~LSEeYw0z-yLpT!@Rw zCM+iV`R(lQR{{_3&hM;l?ks)waPw}E)aZDO4GYuZi+ao5g~jaJ-JM_jeD_yrL(3$Z ze11ARUoL`--QO&MfF#mMfxYrYcI{dcDXcKXH$cwVK7qg$QpV3?eK$1ce0uP{O zgBd2Hv4lp6@yiL#%6~K)igB9xB7fxp5(BfdC1yimP*AX5$4U{ok!G5dH0lihk)+uX z9o3g>o#I0rAgKF}IwJu}WoJde z&ajlw>I_8|HFJcxq9Dy(%IkIZp^y|hgVv=vQ1-aKGEv_yYrdeFN8*>!nsrRSO^V2+ z6A1YNBGRIWmOSSzSwg4b5I{{57oa)db2${hrO>@9-7C|*_Zz*75!v7U7t=l0S1-wD zFUY;)O7FPZJ1%n<$UVdI`480dvvT_-rTvoHehF3j@B0I)zf0~O`bzrS&tyNV_*vD@qN)}U+uF8# z>Kn$hShF&*99fMi{x?IjAxROYAAd-vy!-rdwsYb2e(9 zJLe!g4Vn7=8OEQhv$r}P5kQ_Gg2rq5wvq5QFJ3|8S(hl)``S9Eb`JfOQ%|0k_m9ck zq|8JVCZaNt4AY=8?Kz9N#+{>yefx7xs~4mJd4dS&#Fd7hh|n>N0|Y1_5JlklcpbPe zc4z@`V2Rbkj5Qdb6g*sokYxrq`LxH;XiAxWORSiTP)HIH;;K1i8X`W}zDh~>$RUWC z(h*nA#Ydc>Ek5c})GCI;;(X8>9jr$1GtR?UGRS_>5iS4s5v|WNV#Ew#1^8wuRJ>|Q znODnnUD995Vr)qg3mFucmW~=0ANJ*k&MH38OR@;UXgh_#lO9ff4;qz0Njc;p5PT&V z*j?J(`EogXV|}iEgqOr={zIM%)Y(3o7tjSpp z;5=y6@lqps%~q6&8fj!yGo#}JSr!V00|hkgfbv|+X?%m|tW?3P&>->hvw(VBp@&p@ zNT!Fr_B1YbZF>%Ec@8L^F4fbOwi%%J@LikSd>9^u?o;VLneNNf)}^UToi|5V?X5aV zAHDBsSbPnh}v;P z@%5{|euWuOnSshiRV4v>cDQo{RbTrEktc|xj{}_6)P4HS^>>!cip!_Ee6s#z+F#b; z6u=!V&%RB2w`i|IH>-5BTzsB|Migo3(D+l(;r|L64d97mI~W-!qXQUS>%W0g2|FPH zca_RpvFL-DVK5W-!MzZd@YEoadIqAQ9|qX!@M>I9!KJC;WDw+4+Or`_F*x=9QHW;( z#dsz#$xGoWo&(4BLBLmJvjsLA4hg~p3Lov2UR;N~*f5NE2qvQ0rb3C3B#GitDCKXa zM<5q8>wYTsqc$~$ehFkP*gwAug}K&$yPiI1l0e$12zgE@^huRIDbpvv_WG7059ZaxkV_VI6=o*M_{rneMluj=g0 z5u|-!^Nc$16Frx4G25;KTdo7^QN`7-y82~T|MR#AI(2myc?y{qa}mQu3CYrvfs5UO zt1z}oXW$?P=+PLM@v)GYKUt_a zoGE))rzL@!8m;mbn84h=suLZ8s>BqK3Tqrt=s}epl<7efi0U9Ocf6D%~p6t^diM09bv%O!_$M9P z>=Ff)wyYGfk#@Dsibzc=x1u3Hq~@Vr@zAF}@z95vXrx#pAt6;%T5KdE=nGFh=h_~7 z@&f|(dVKD^=iYnn-#OnoGq>GtCxLW#-+yBNbP@7ztW*Sg49zVg z7RW7eYl0nN8Db$PiDiQ{E|CMuiw>CI zsXIT8$d{zdCor+jjw7|lQ!!kHAsyu6x~=eko&j=`Ofr*1fKoY4TA;=lH7nGNeZ~mX za3oD4)(p9mBxkF()aMIOxo0pKINxD%hZzjpW!$3NfCNSAt^{4X5Fbltbbl%-jLRu8 z8_lGJ^HL^yK@x>%Bpx4)L@(*?(d<|p>ZxQ#N@l{W&ZedK`85L5xU>+YmmU2F&yHU? zJ0wA`_34>wv5&?+Z+^8t2XL*^hZR&+)5V+X~mFa(<2TE7j*Yh#*npe4*liKfR3yaL#ZW z+Gm6DxO19J?xzM#QQ#y|GrNZI1p(CUP2gp*yj7jP65c zPfMR?TGy+OUMm3Z1_$IuyYujrAT-3Sr5$FzB$nn#z zRc^-$w?k<=pmMz$*Q;>7kK1=@?faGYPAO-8p`D2lv8QFmJwG}Z z%O%xdw-)SHJw2MI=b^!ltHJlR;QOklOY?Nq*ca5`J`k*W_G_N~r3SXOvE(EzTk~7C z=RLtvvm@YqMu5CPg0t=T?^fb%o4JDX*=JeJyJu0<_Wtximo{)t*)FJ_Pc_e{dCykO zv$JHgx*JOzY299O*}WhK$O|Ok7x+>maky8xzzP?b6;WHhd*;a#DE_dtEY zZ{OM%fK3|`bA~SfxkfU3vASS8v2PUq8HYTot{gc+5fkDPH zpdebrHD1Y#CFYt*_S?<~(UckE%yXD)|CbqUZ!%-dy0pfVU1cXNIm0K`pWY;EUM)kW z^BBEdH110<{9`@R=L}C$FU_nK6%=n6%>EEM)d4|0c44HpI~;mCd%yVIT;c0QolQm( zl1_AMR*vgzLQ13nD{WDTy3*mMa;Vn^;wtf83;?l=i)k4*DEolu4TxL_PaK6X7%T5W zz7@Lb_Q?3SloTnL$*njBfn2v|$3=kLu#Ezl&PcRPXA-&g!qY^{BpH&DV>N;mtQSPqF#tR;_twiP#+hN~VrJ zY}q>VBSa$CeBa#3+|k>||9pJ0bNL5qN4M6|t@?X3e~;=ppm`3g?X+vTMeXR)I=WPU zx8|>dy4OkqgzIQ55q3+{GbAsNOdSKrb2ooAaARQBs`7q~_bc?t@7zTpPve4!=Z;m* zyTW-@u1(|Gl%^l>%j_o7-5H5-6>ST63S_lP}wqR`2(4^m`5@g zWE;Vfylt~rm&tYGl5H@uIwjd;&NV?6oekBLrknv>RSxDG8Xr5DMNM3*sHQlf-ux!E z4?_qMs)i7u%4^fXP_`4qyy}H2RQT)t;`Lj_+_zzFt(i8XnVRM-8!LiL`Hia^N?|KC zJ-G+Uy4%z}jXGi&UprJL0iCe!^PW}y-4*`b#e~Wq()dFPeID_i z>48-~u)+tF;0cvKsqrTj{^XmO1u7Obi6)hZXKH28a}nm5!gO{vpjjqy~ z7tpwX!UbNZPXMS!!ZOt-j26xMG)!cStHO-D8#0;tE$m))bh-;ow-V$}Y^&Q}9seWf zo<{Er8*JJ#J*jX$iu8kFH+~U8hb{=ZQxM8uO`yyR!mqNCc)6wQvswDVsR2JV!Ap^D zKSjSe$@rc?UnOL8xiXr*jAtz$1#*YbdCKn_sEINXRL=AlK&~0TlErQd%nr?+0e5N( zEXJ0Sw6KA@(RI)M*^N2Jn)hACHuhCzg1QqjBVvjQn QtZifZjPhS>(n?qIKfBtAQvd(} diff --git a/modules/__pycache__/product_filter.cpython-311.pyc b/modules/__pycache__/product_filter.cpython-311.pyc index a8f8b854af3667cb264c4f75ab342a168b58b123..1c5098b8ea71c27ec4aaa256a996724dc1d7ffd1 100644 GIT binary patch delta 20 acmaDZ^jwI0IWI340}$M6e6f)`h7$lnd-1in+4|p delta 20 acmca0a6y23IWI340}#aMJ=@6b$^ig55d{zc diff --git a/modules/__pycache__/setting_manager.cpython-311.pyc b/modules/__pycache__/setting_manager.cpython-311.pyc index 5f877ca176fd8221de6af409cdd6c860f65b86f8..46cc1df4cf65ac1c2c42c8441c5aa178c6a8c645 100644 GIT binary patch delta 20 acmZ3YwnUA4IWI340}$M6e6f*RQWyX_-UXTf delta 20 acmZ3YwnUA4IWI340}$BjKikMHDGUHKj|8Ux diff --git a/modules/app_manager.py b/modules/app_manager.py index ee58a95..2d9855d 100644 --- a/modules/app_manager.py +++ b/modules/app_manager.py @@ -74,31 +74,42 @@ class AppManager: on_change=self.on_tab_change ) - # 로그 영역: 스크롤 가능한 컨테이너에 Text 컨트롤 배치 - log_text = ft.Text("", size=12, color="black") + # 로그 영역: Container 내부에 ListView를 사용하여 스크롤 가능하도록 구현 + log_list = ft.ListView( + controls=[], + expand=True, + auto_scroll=True, + spacing=5, + ) log_container = ft.Container( - content=log_text, + content=log_list, height=150, - scroll=ft.ScrollMode.AUTO, border=ft.border.all(1, "lightgray"), padding=10, bgcolor="white", ) - main_layout = ft.Column([tabs, log_container], expand=True, spacing=10) + # 전체 레이아웃: 탭 영역을 확장하는 Container와 로그 영역을 하단에 배치 + main_layout = ft.Column( + [ + ft.Container(content=tabs, expand=True), # 탭 영역이 남은 공간을 채움 + log_container + ], + spacing=10, + expand=True + ) - # 창 크기 및 중앙 배치 (1400×800) - self.page.window.width = 1400 - self.page.window.height = 800 + self.page.window.width = 1000 + self.page.window.height = 900 self.page.window.center() - - self.page.add(main_layout) + self.page.controls.append(main_layout) self.page.update() - # Logger의 GUI 콜백 설정하여 로그가 log_text에 출력되도록 함 + # Logger의 GUI 콜백: log_list에 새 로그 메시지를 Text 컨트롤로 추가 def gui_log_callback(message: str): - log_text.value += message + "\n" + log_list.controls.append(ft.Text(message, size=12, color="black")) self.page.update() + self.logger.gui_callback = gui_log_callback def on_tab_change(self, e: ft.ControlEvent): diff --git a/modules/login_page.py b/modules/login_page.py index 4191dbc..b5a3a14 100644 --- a/modules/login_page.py +++ b/modules/login_page.py @@ -124,3 +124,13 @@ class LoginPage: for ctrl in self.controls: self.page.add(ctrl) self.page.update() + + # 저장된 사용자 정보 불러오기 + user_info = self.settings_manager.load_user_info() + if user_info.get("email"): + self.username_field.value = user_info.get("email", "") + if user_info.get("password"): + self.password_field.value = user_info.get("password", "") + # 포커스를 사용자 이름 필드에 설정 + self.username_field.focus() + self.page.update() diff --git a/modules/market_actions.py b/modules/market_actions.py new file mode 100644 index 0000000..2e0c423 --- /dev/null +++ b/modules/market_actions.py @@ -0,0 +1,45 @@ +import re +import json +import requests + +def fetch_sold_products(market_url: str, logger=None) -> dict: + """ + 주어진 마켓 URL에서 베스트 상품 페이지(예: https://smartstore.naver.com/modeuda/best?cp=1)에 접속하여 + __PRELOADED_STATE__ 항목을 추출하고 JSON 객체로 반환합니다. + + Args: + market_url (str): 예를 들어 "https://smartstore.naver.com/modeuda" + logger: 로거 객체가 제공되면 디버그/오류 메시지를 출력합니다. + + Returns: + dict: 추출된 __PRELOADED_STATE__ JSON 데이터 (추출 실패 시 빈 dict 반환) + """ + if logger: + logger.debug("Entering fetch_sold_products()") + try: + # 베스트 상품 페이지 URL 생성 + best_url = market_url.rstrip('/') + "/best?cp=1" + if logger: + logger.debug(f"Fetching URL: {best_url}") + response = requests.get(best_url) + if response.status_code != 200: + if logger: + logger.error(f"HTTP error {response.status_code} for URL: {best_url}") + return {} + html = response.text + # __PRELOADED_STATE__ 항목을 정규식으로 추출 (비정형 데이터이므로 non-greedy match 사용) + pattern = r'window\.__PRELOADED_STATE__=({.*?});' + match = re.search(pattern, html, re.DOTALL) + if not match: + if logger: + logger.error("Could not find __PRELOADED_STATE__ in the page") + return {} + state_json_str = match.group(1) + state = json.loads(state_json_str) + if logger: + logger.debug("Fetched __PRELOADED_STATE__ successfully") + return state + except Exception as e: + if logger: + logger.error(f"Error in fetch_sold_products: {e}", exc_info=True) + return {} diff --git a/modules/market_page.py b/modules/market_page.py index bfcf608..aead095 100644 --- a/modules/market_page.py +++ b/modules/market_page.py @@ -1,52 +1,55 @@ -# modules/market_page.py import flet as ft import logging -from modules import db_manager class MarketPage: def __init__(self, page: ft.Page, logger: logging.Logger, db_manager): self.page = page self.logger = logger self.db_manager = db_manager - self.market_list = [] - self.on_products_fetched_callback = None # 외부에서 설정 (ProductPage 업데이트용) + self.logger.debug("MarketPage initialized") self.build_content() def build_content(self): self.logger.debug("Building MarketPage content") - # 버튼들 + self.header = ft.Text("마켓 페이지", style=ft.TextStyle(size=24, weight="bold"), color="black") + + # 버튼들: 마켓목록 가져오기, 팔린상품 가져오기, 마켓추가하기 self.load_market_btn = ft.ElevatedButton("마켓목록 가져오기", on_click=self.load_market_list) - self.load_sold_products_btn = ft.ElevatedButton("팔린상품 가져오기", on_click=self.load_sold_products) + self.sold_products_btn = ft.ElevatedButton("팔린상품 가져오기", on_click=self.load_sold_products) self.add_market_btn = ft.ElevatedButton("마켓추가하기", on_click=self.add_market) - # 마켓 목록 테이블 + + # 마켓 목록 테이블: 각 행에 마켓이름, 마켓 URL, 메모 정보를 표시 self.market_table = ft.DataTable( columns=[ ft.DataColumn(ft.Text("마켓이름")), ft.DataColumn(ft.Text("마켓 URL")), - ft.DataColumn(ft.Text("메모")) + ft.DataColumn(ft.Text("메모")), ], rows=[], expand=True, key="market_table" ) + self.content = ft.Column( [ - ft.Row([self.load_market_btn, self.load_sold_products_btn, self.add_market_btn]), + ft.Row([self.load_market_btn, self.sold_products_btn, self.add_market_btn], spacing=10), self.market_table ], spacing=10, ) - self.load_market_list(None) + # self.load_market_list(None) # 초기 로드 def load_market_list(self, e): self.logger.debug("MarketPage.load_market_list() 호출됨") - self.market_list = self.db_manager.get_markets() + # DBManager의 get_markets() 메서드를 호출하여 마켓 목록을 가져옵니다. + markets = self.db_manager.get_markets() + self.logger.debug(f"Retrieved markets: {markets}") rows = [] - for m in self.market_list: + for m in markets: row = ft.DataRow(cells=[ - ft.DataCell(ft.Text(m.get("name", ""))), - ft.DataCell(ft.Text(m.get("url", ""))), - ft.DataCell(ft.Text(m.get("memo", ""))) + ft.DataCell(ft.Text(m.get("market_name", ""))), + ft.DataCell(ft.Text(m.get("market_url", ""))), + ft.DataCell(ft.Text(m.get("market_memo", ""))), ]) rows.append(row) self.market_table.rows = rows @@ -54,18 +57,17 @@ class MarketPage: def load_sold_products(self, e): self.logger.debug("MarketPage.load_sold_products() 호출됨") - # DBManager를 이용해 각 마켓의 팔린상품 목록을 가져옴 - sold_products = self.db_manager.get_sold_products(self.market_list) + # 각 마켓을 순회하며 팔린상품 목록을 가져오는 기능을 DBManager에서 구현했다고 가정합니다. + sold_products = self.db_manager.get_sold_products(self.db_manager.get_markets()) self.logger.debug(f"Sold products fetched: {sold_products}") - if self.on_products_fetched_callback: + # 예를 들어, 상품 페이지에 전달하는 콜백을 호출할 수 있습니다. + if hasattr(self, "on_products_fetched_callback") and self.on_products_fetched_callback: self.on_products_fetched_callback(sold_products) - else: - self.logger.debug("on_products_fetched_callback 미설정") self.page.update() def add_market(self, e): self.logger.debug("MarketPage.add_market() 호출됨") - # 마켓 추가 기능은 미구현 + # 마켓 추가 기능은 아직 미구현이므로 SnackBar 메시지 표시 snack = ft.SnackBar(ft.Text("마켓 추가 기능은 미구현입니다.")) snack.open = True self.page.open(snack) diff --git a/poetry.lock b/poetry.lock index 6dc4712..e03e426 100644 --- a/poetry.lock +++ b/poetry.lock @@ -245,7 +245,7 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" +markers = "sys_platform == \"linux\" and platform_python_implementation != \"PyPy\" or os_name == \"nt\" and implementation_name != \"pypy\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1290,6 +1290,21 @@ files = [ [package.dependencies] et-xmlfile = "*" +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "packaging" version = "24.2" @@ -1561,7 +1576,7 @@ description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" +markers = "sys_platform == \"linux\" and platform_python_implementation != \"PyPy\" or os_name == \"nt\" and implementation_name != \"pypy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1719,6 +1734,19 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + [[package]] name = "pytest" version = "8.3.5" @@ -1897,6 +1925,43 @@ files = [ cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "selenium" +version = "4.30.0" +description = "Official Python bindings for Selenium WebDriver" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "selenium-4.30.0-py3-none-any.whl", hash = "sha256:90bcd3be86a1762100a093b33e5e4530b328226da94208caadb15ce13243dffd"}, + {file = "selenium-4.30.0.tar.gz", hash = "sha256:16ab890fc7cb21a01e1b1e9a0fbaa9445fe30837eabc66e90b3bacf12138126a"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +typing_extensions = ">=4.9,<5.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +websocket-client = ">=1.8,<2.0" + +[[package]] +name = "selenium-stealth" +version = "1.0.6" +description = "Trying to make python selenium more stealthy." +optional = false +python-versions = ">=3, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +files = [ + {file = "selenium_stealth-1.0.6-py3-none-any.whl", hash = "sha256:b62da5452aa4a84f29a4dfb21a9696aff20788a7c570dd0b81bc04a940848b97"}, +] + +[package.dependencies] +selenium = "*" + +[package.extras] +test = ["pytest"] + [[package]] name = "six" version = "1.17.0" @@ -1921,6 +1986,18 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + [[package]] name = "storage3" version = "0.11.3" @@ -1990,6 +2067,43 @@ files = [ httpx = {version = ">=0.26,<0.29", extras = ["http2"]} strenum = ">=0.4.15,<0.5.0" +[[package]] +name = "trio" +version = "0.29.0" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "trio-0.29.0-py3-none-any.whl", hash = "sha256:d8c463f1a9cc776ff63e331aba44c125f423a5a13c684307e828d930e625ba66"}, + {file = "trio-0.29.0.tar.gz", hash = "sha256:ea0d3967159fc130acb6939a0be0e558e364fee26b5deeecc893a6b08c361bdf"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +idna = "*" +outcome = "*" +sniffio = ">=1.3.0" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.12.2" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6"}, + {file = "trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae"}, +] + +[package.dependencies] +outcome = ">=1.2.0" +trio = ">=0.11" +wsproto = ">=0.14" + [[package]] name = "typing-extensions" version = "4.13.0" @@ -2014,6 +2128,22 @@ files = [ {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] +[[package]] +name = "undetected-chromedriver" +version = "3.5.5" +description = "('Selenium.webdriver.Chrome replacement with compatiblity for Brave, and other Chromium based browsers.', 'Not triggered by CloudFlare/Imperva/hCaptcha and such.', 'NOTE: results may vary due to many factors. No guarantees are given, except for ongoing efforts in understanding detection algorithms.')" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "undetected-chromedriver-3.5.5.tar.gz", hash = "sha256:9f945e1435005247abe17de316bcfda85b284a4177fd5f25167c78ced33b65ec"}, +] + +[package.dependencies] +requests = "*" +selenium = ">=4.9.0" +websockets = "*" + [[package]] name = "urllib3" version = "2.3.0" @@ -2026,12 +2156,32 @@ files = [ {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + [package.extras] brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + [[package]] name = "websockets" version = "14.2" @@ -2111,6 +2261,21 @@ files = [ {file = "websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5"}, ] +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + [[package]] name = "xlwings" version = "0.33.11" @@ -2294,4 +2459,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<4.0" -content-hash = "a72b2533fbfa496663693cb7f0429d8c6f27e4f552e38580d14fb86eed879d33" +content-hash = "6452961b22cf2443f40017ec928a472efc29f0759ee931106368e1137c552511" diff --git a/pyproject.toml b/pyproject.toml index 7ae7002..1ea2bd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,9 @@ dependencies = [ "xlwings (>=0.33.11,<0.34.0)", "requests (>=2.32.3,<3.0.0)", "supabase (>=2.15.0,<3.0.0)", - "keyring (>=25.6.0,<26.0.0)" + "keyring (>=25.6.0,<26.0.0)", + "undetected-chromedriver (>=3.5.5,<4.0.0)", + "selenium-stealth (>=1.0.6,<2.0.0)" ] window_title = "나도 좀 팔자 - [나팔]" diff --git a/tests/__pycache__/re.cpython-311.pyc b/tests/__pycache__/re.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b223f53fee421cc3015c244920ffb807ab8a66a GIT binary patch literal 1281 zcmZuwO=ufO6n?Wi`ddp;f}yR8NeoFLn}eL6wkE1+2-t>{k~*?;5rSc(nb_;BcE!%9 zVAlpw0&PPACIoynr8q6lA%s9Lf#jIus_a257y`XCH-m3EWoDHX+R!&MZ{GiV^R4u_ zR5C!)i+lgA{GFW!Hw#O!J5n%(5{|Hqc;VHMq==&FOgFb znZ!DJry{bWoS+8$sm5Pa?@!L!^R|)qVO4`0hJ59l* z*;rwMINr(%^P9sWQpm}ppgeja*$#-|lK|2Uw`8*|Bt~H0M4OO)+Lk6p0F|JmKteF; z6{_dajhSjUuk-+ z>6S-Xhgutx3knfNrwCcB&42&H)w%gOvb214d7hB!Th)5O)S|5IQs#=N$Xwp>8L@cN zw#|&M{Jxqb%Cvo32H-XBxlx98T5WFXQFZ`oWXKWjNQ^ta6J@xt1mh}eYHI4;#9Xz} zUT@SGXO45BAw7aOOY6{zP`2e+JiF1I{08jNtk6);&sA`1#1^x+TElc(;KRd|!);}dx^_%1`B|Fp+ zLVYm0@#;gN8?Qd-ck{oLe=cvM?Te3QcCI|UvU~B5na8ug&py?j=l(7~E5FM3&R+}9 zUwi#!@AP7Lda*ZtBOJfcgIWl+0BUdG>ma@R@I{c`eHiP;>kwzrH-|7}#{n0A-S|hJ b2=s|Qo(%A051$P2$spN>I^fTxGk)NEgX%1u literal 0 HcmV?d00001 diff --git a/tests/test_market_actions.py b/tests/test_market_actions.py new file mode 100644 index 0000000..e7e8d0b --- /dev/null +++ b/tests/test_market_actions.py @@ -0,0 +1,18 @@ +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +from modules.market_actions import fetch_sold_products +from modules.logger import get_logger +import json + +def test_fetch_sold_products(): + logger = get_logger() + # 테스트용 샘플 마켓 URL (실제 운영중인 URL로 변경 가능) + market_url = "https://smartstore.naver.com/modeuda" + state = fetch_sold_products(market_url, logger) + print("Fetched __PRELOADED_STATE__:") + print(json.dumps(state, indent=4, ensure_ascii=False)) + +if __name__ == "__main__": + test_fetch_sold_products() diff --git a/tests/uc.py b/tests/uc.py new file mode 100644 index 0000000..4893d8f --- /dev/null +++ b/tests/uc.py @@ -0,0 +1,97 @@ +import undetected_chromedriver as uc +from selenium.webdriver.support.ui import WebDriverWait +from selenium_stealth import stealth +import re +import json +import time +import logging + +def fetch_preloaded_state(market_url: str, logger=None) -> dict: + best_url = market_url.rstrip('/') + "/best?cp=1" + if logger: + logger.debug(f"Fetching best URL: {best_url}") + + options = uc.ChromeOptions() + options.headless = True + options.add_argument("--headless=new") + options.add_argument("--disable-blink-features=AutomationControlled") + options.add_argument('--disable-popup-blocking') + options.add_argument('--remote-debugging-port=9222') + + try: + # enable_cdp_events와 incognito 모드를 활성화합니다. + driver = uc.Chrome(options=options, enable_cdp_events=True, incognito=True) + + # selenium_stealth 설정 + stealth(driver, + vendor="Google Inc. ", + platform="Win32", + webgl_vendor="intel Inc. ", + renderer="Intel Iris OpenGL Engine", + fix_hairline=True, + ) + + # 암묵적 대기 설정: 2초 + driver.implicitly_wait(2) + + # 추가적인 JavaScript 오버라이드 적용 + driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { + "source": """ + Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); + window.navigator.chrome = { runtime: {} }; + Object.defineProperty(navigator, 'languages', {get: () => ['ko-KR', 'en-US', 'en']}); + Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5]}); + """ + }) + + + driver.get(best_url) + + # __PRELOADED_STATE__가 로드될 때까지 최대 30초 대기 + # wait = WebDriverWait(driver, 30) + # wait.until(lambda d: d.execute_script("return typeof window.__PRELOADED_STATE__ !== 'undefined';")) + + time.sleep(3) + + # 디버깅: 현재 URL과 HTML의 일부 출력 + current_url = driver.current_url + html = driver.page_source + if logger: + logger.debug(f"Current URL: {current_url}") + logger.debug("HTML snippet:") + # logger.debug(html[:500]) # 처음 500자만 출력 + logger.debug(html) + + # __PRELOADED_STATE__ 추출 + pattern = r'window\.__PRELOADED_STATE__=({.*?});' + match = re.search(pattern, html, re.DOTALL) + if not match: + if logger: + logger.error("Could not find __PRELOADED_STATE__ in the page") + driver.quit() + return {} + state_json_str = match.group(1) + state = json.loads(state_json_str) + if logger: + logger.debug("Fetched __PRELOADED_STATE__ successfully") + driver.quit() + return state + except Exception as e: + if logger: + logger.error(f"Error fetching sold products: {e}", exc_info=True) + try: + driver.quit() + except Exception: + pass + return {} + +# 테스트 실행 예제 +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + test_logger = logging.getLogger("TestLogger") + + sample_market_url = "https://smartstore.naver.com/modeuda" + state = fetch_preloaded_state(sample_market_url, test_logger) + + import pprint + pprint.pprint(state)