commit 569c38282508b424c42e2b050514fee373eacc23 Author: R5600U_PC Date: Mon Sep 23 23:57:58 2024 +0900 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24f18cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +Inclode/ +Lib/ +Scripts/ +pyvenv.cfg diff --git a/Include/site/python3.11/greenlet/greenlet.h b/Include/site/python3.11/greenlet/greenlet.h new file mode 100644 index 0000000..d02a16e --- /dev/null +++ b/Include/site/python3.11/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/__pycache__/base64_to_image.cpython-311.pyc b/__pycache__/base64_to_image.cpython-311.pyc new file mode 100644 index 0000000..4d3d1d4 Binary files /dev/null and b/__pycache__/base64_to_image.cpython-311.pyc differ diff --git a/__pycache__/browser_control.cpython-311.pyc b/__pycache__/browser_control.cpython-311.pyc new file mode 100644 index 0000000..3c975d1 Binary files /dev/null and b/__pycache__/browser_control.cpython-311.pyc differ diff --git a/__pycache__/gui.cpython-311.pyc b/__pycache__/gui.cpython-311.pyc new file mode 100644 index 0000000..cf52c9e Binary files /dev/null and b/__pycache__/gui.cpython-311.pyc differ diff --git a/__pycache__/logger_module.cpython-311.pyc b/__pycache__/logger_module.cpython-311.pyc new file mode 100644 index 0000000..732cc90 Binary files /dev/null and b/__pycache__/logger_module.cpython-311.pyc differ diff --git a/__pycache__/toggleSwitch.cpython-311.pyc b/__pycache__/toggleSwitch.cpython-311.pyc new file mode 100644 index 0000000..d6ed9ae Binary files /dev/null and b/__pycache__/toggleSwitch.cpython-311.pyc differ diff --git a/__pycache__/whale_translator.cpython-311.pyc b/__pycache__/whale_translator.cpython-311.pyc new file mode 100644 index 0000000..4ce8f10 Binary files /dev/null and b/__pycache__/whale_translator.cpython-311.pyc differ diff --git a/appTranslator.log b/appTranslator.log new file mode 100644 index 0000000..a679503 --- /dev/null +++ b/appTranslator.log @@ -0,0 +1,846 @@ +2024-09-23 20:57:09,904 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 20:57:33,487 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 20:57:40,422 - browser_control.py:23 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 20:57:45,171 - browser_control.py:38 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 20:57:45,173 - browser_control.py:44 - default_logger - DEBUG - 크롬 창을 찾을 수 없습니다. +2024-09-23 20:57:45,173 - browser_control.py:49 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 20:57:45,345 - browser_control.py:66 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 20:58:00,056 - browser_control.py:106 - default_logger - DEBUG - 이미지 URL을 추출 중... +2024-09-23 20:58:00,195 - browser_control.py:110 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 20:58:00,235 - browser_control.py:117 - default_logger - DEBUG - data-value 속성에서 HTML 수집 완료. +2024-09-23 20:58:00,235 - browser_control.py:121 - default_logger - DEBUG - 추출된 이미지 URL 수: 23 +2024-09-23 20:58:00,237 - browser_control.py:123 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 20:58:00,263 - browser_control.py:137 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 20:58:00,345 - browser_control.py:141 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 20:58:00,381 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 20:58:14,186 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/d03d7458-8840-4d5d-9bf3-3cf612ce9c5d.jpg +2024-09-23 20:58:14,222 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 20:58:15,223 - browser_control.py:91 - default_logger - DEBUG - 크롬 창을 찾을 수 없습니다. +2024-09-23 20:58:15,426 - browser_control.py:176 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 20:58:15,456 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 20:58:29,255 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/2a138f30-bf7d-4c7f-8999-a729b7f4a396.jpg +2024-09-23 20:58:29,285 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 20:58:30,286 - browser_control.py:91 - default_logger - DEBUG - 크롬 창을 찾을 수 없습니다. +2024-09-23 20:58:30,488 - browser_control.py:176 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 20:58:30,523 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 20:58:44,855 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/785b254b-2971-4e54-91a4-f75f38929acc.jpg +2024-09-23 20:58:44,866 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 20:58:45,868 - browser_control.py:91 - default_logger - DEBUG - 크롬 창을 찾을 수 없습니다. +2024-09-23 20:58:46,072 - browser_control.py:176 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 20:58:46,072 - whale_translator.py:56 - default_logger - DEBUG - 가상 데스크톱 전환 중 오류 발생: Desktop number 2 exceeds the number of desktops, 1. +2024-09-23 21:00:03,115 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:00:06,915 - browser_control.py:23 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 21:00:11,559 - browser_control.py:38 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 21:00:11,561 - browser_control.py:44 - default_logger - DEBUG - 크롬 창을 찾을 수 없습니다. +2024-09-23 21:00:11,561 - browser_control.py:49 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 21:00:11,698 - browser_control.py:66 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 21:16:24,532 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:16:29,339 - browser_control.py:23 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 21:16:33,553 - browser_control.py:38 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 21:16:33,564 - browser_control.py:44 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 21:16:33,565 - browser_control.py:51 - default_logger - DEBUG - 크롬 창 핸들: 481694866 +2024-09-23 21:16:33,566 - browser_control.py:57 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 21:16:33,689 - browser_control.py:74 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 21:16:43,114 - browser_control.py:114 - default_logger - DEBUG - 이미지 URL을 추출 중... +2024-09-23 21:16:43,269 - browser_control.py:118 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 21:16:43,298 - browser_control.py:125 - default_logger - DEBUG - data-value 속성에서 HTML 수집 완료. +2024-09-23 21:16:43,299 - browser_control.py:129 - default_logger - DEBUG - 추출된 이미지 URL 수: 23 +2024-09-23 21:16:43,299 - browser_control.py:131 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 21:16:43,318 - browser_control.py:145 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 21:16:43,401 - browser_control.py:149 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 21:16:43,436 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:16:57,247 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/d03d7458-8840-4d5d-9bf3-3cf612ce9c5d.jpg +2024-09-23 21:16:57,272 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:16:58,279 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:16:58,486 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:16:58,514 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:17:12,320 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/2a138f30-bf7d-4c7f-8999-a729b7f4a396.jpg +2024-09-23 21:17:12,340 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:17:13,342 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:17:13,544 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:17:13,572 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:17:27,379 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/785b254b-2971-4e54-91a4-f75f38929acc.jpg +2024-09-23 21:17:27,401 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:17:28,402 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:17:28,605 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:17:28,630 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:17:42,432 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/6bf2fa9a-062b-4fa5-aea6-3ea34367d0ca.jpg +2024-09-23 21:17:42,451 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:17:43,453 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:17:43,656 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:17:43,683 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:17:57,479 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/552f4047-a926-401e-82a0-18ef0f57a506.jpg +2024-09-23 21:17:57,500 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:17:58,501 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:17:58,705 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:17:58,747 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:18:12,550 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/3a2ecf1e-5763-4413-a713-74db0c3a65d2.jpg +2024-09-23 21:18:12,571 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:18:13,572 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:18:13,776 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:18:13,802 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:18:27,616 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/bc45eb79-1e9f-45d8-811d-bc11f4a6dfce.jpg +2024-09-23 21:18:27,635 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:18:28,636 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:18:28,840 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:18:28,876 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:18:42,668 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/0c624ab7-2f66-4935-8f0e-97808fc3c05c.jpg +2024-09-23 21:18:42,689 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:18:43,691 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:18:43,894 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:18:43,918 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:18:57,722 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/5b753750-e8f4-49c5-850e-53386d4652f1.jpg +2024-09-23 21:18:57,744 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:18:58,746 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:18:58,949 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:18:58,979 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:19:12,766 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/3d529607-ca26-426c-851b-50fd48c31239.jpg +2024-09-23 21:19:12,791 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:19:13,792 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:19:13,995 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:19:14,025 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:19:27,834 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/d3c58ca2-2ea0-48ef-8ba7-9d3c2c4e727a.jpg +2024-09-23 21:19:27,859 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:19:28,861 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:19:29,063 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:19:29,088 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:19:42,902 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/14d463e1-ed35-41ae-ba6d-dd82cd2d7bc1.jpg +2024-09-23 21:19:42,923 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:19:43,925 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:19:44,128 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:19:44,154 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:19:57,956 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/8cf16fce-7511-4c0e-a446-786984065d12.jpg +2024-09-23 21:19:57,979 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:19:58,980 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:19:59,183 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:19:59,204 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:20:13,021 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/128b1cbe-59fc-4255-bb3d-36ce1b27cff7.jpg +2024-09-23 21:20:13,046 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:20:14,047 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:20:14,251 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:20:14,277 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:20:28,090 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/2fc3bc9c-ad1b-4cef-8e4c-f3883834b14e.jpg +2024-09-23 21:20:28,115 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:20:29,116 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:20:29,319 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:20:29,344 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:20:43,157 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/d33bba73-27b3-4fd8-baf9-ab205383cee3.jpg +2024-09-23 21:20:43,179 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:20:44,180 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:20:44,384 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:20:44,414 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:20:58,237 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/291e462d-7cb7-4f56-a9c7-1a5caab2dc5c.jpg +2024-09-23 21:20:58,256 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:20:59,257 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:20:59,465 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:20:59,492 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:21:13,291 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/6547638e-cb21-4f5d-a82b-4991d8cdbb13.jpg +2024-09-23 21:21:13,312 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:21:14,313 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:21:14,516 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:21:14,582 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:21:28,392 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/fb02de39-0b8e-403f-a37e-30f705f467e4.jpg +2024-09-23 21:21:28,411 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:21:29,412 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:21:29,615 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:21:29,641 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:21:43,455 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/56b60dec-1606-4708-a7e2-243740b6a940.jpg +2024-09-23 21:21:43,480 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:21:44,482 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:21:44,686 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:21:44,718 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:21:58,508 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/087001ba-5b28-4828-8f60-3c8de3b6fbf4.jpg +2024-09-23 21:21:58,530 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:21:59,531 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:21:59,735 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:21:59,762 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:22:13,562 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/a7150f7c-ce28-4153-8e18-76bbe1856ba8.jpg +2024-09-23 21:22:13,582 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:22:14,584 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:22:14,787 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:22:14,814 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 21:22:28,643 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/5a8ad00a-6fe1-4732-9301-e60c74f53e81.jpg +2024-09-23 21:22:28,668 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 21:22:29,669 - browser_control.py:97 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 21:22:29,872 - browser_control.py:184 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 21:33:19,472 - browser_control.py:81 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 22:04:11,612 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:04:54,232 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:05:00,522 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 22:05:04,823 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 22:05:04,833 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 22:05:04,835 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 529238 +2024-09-23 22:05:04,835 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 22:05:04,981 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 22:05:17,915 - browser_control.py:117 - default_logger - DEBUG - 이미지 URL을 추출 중... +2024-09-23 22:05:18,061 - browser_control.py:121 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 22:05:18,087 - browser_control.py:128 - default_logger - DEBUG - data-value 속성에서 HTML 수집 완료. +2024-09-23 22:05:18,088 - browser_control.py:132 - default_logger - DEBUG - 추출된 이미지 URL 수: 23 +2024-09-23 22:05:18,089 - browser_control.py:134 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 22:06:22,933 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:06:25,469 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 22:06:29,800 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 22:06:29,811 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 22:06:29,812 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 280105178 +2024-09-23 22:06:29,813 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 22:06:29,935 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 22:07:10,860 - browser_control.py:117 - default_logger - DEBUG - 이미지 URL을 추출 중... +2024-09-23 22:07:11,021 - browser_control.py:121 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 22:07:11,049 - browser_control.py:128 - default_logger - DEBUG - data-value 속성에서 HTML 수집 완료. +2024-09-23 22:07:11,050 - browser_control.py:132 - default_logger - DEBUG - 추출된 이미지 URL 수: 23 +2024-09-23 22:07:11,050 - browser_control.py:134 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 22:07:11,082 - browser_control.py:165 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 22:07:11,188 - browser_control.py:169 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 22:07:11,216 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:07:25,010 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/d03d7458-8840-4d5d-9bf3-3cf612ce9c5d.jpg +2024-09-23 22:07:25,028 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:07:26,033 - browser_control.py:100 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 22:07:26,034 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 22:07:26,238 - browser_control.py:205 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 22:07:26,252 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:07:40,046 - whale_translator.py:96 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f116b385dd2b47260f4025/2a138f30-bf7d-4c7f-8999-a729b7f4a396.jpg +2024-09-23 22:07:40,053 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:07:41,060 - browser_control.py:100 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 22:07:41,060 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 22:07:41,270 - browser_control.py:205 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 22:07:41,287 - whale_translator.py:53 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:35:58,514 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 22:36:01,551 - whale_translator.py:81 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:36:04,526 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 22:36:04,527 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 22:36:09,554 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 22:36:09,566 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 22:36:09,568 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 2557266 +2024-09-23 22:36:13,588 - browser_control.py:199 - default_logger - DEBUG - 광고 다이알로그가 없어서 바로 진행합니다. +2024-09-23 22:36:13,589 - browser_control.py:62 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 22:36:13,719 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 22:38:12,258 - gui.py:253 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 22:38:12,445 - browser_control.py:86 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 22:38:36,947 - whale_translator.py:62 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 22:38:38,955 - whale_translator.py:81 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:39:12,784 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:39:13,787 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 22:39:15,807 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:39:40,167 - gui.py:253 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 22:41:03,112 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:41:04,114 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 22:41:06,176 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:41:18,430 - gui.py:253 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 22:41:19,534 - whale_translator.py:146 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 22:41:19,535 - whale_translator.py:148 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 22:44:45,969 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 22:44:49,011 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:44:52,942 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 22:44:52,942 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 22:44:56,990 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 22:44:56,999 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 22:44:56,999 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 1219233078 +2024-09-23 22:45:01,394 - browser_control.py:199 - default_logger - DEBUG - 광고 다이알로그가 없어서 바로 진행합니다. +2024-09-23 22:45:01,394 - browser_control.py:62 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 22:45:01,517 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 22:45:17,110 - gui.py:154 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 22:45:17,110 - gui.py:163 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 22:45:17,456 - browser_control.py:205 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 22:45:17,456 - gui.py:169 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 22:45:17,557 - browser_control.py:213 - default_logger - DEBUG - 수정할 상품 개수: 0 +2024-09-23 22:45:17,558 - gui.py:175 - default_logger - DEBUG - 수정할 상품이 없습니다. 번역 작업을 종료합니다. +2024-09-23 22:45:17,558 - gui.py:217 - default_logger - DEBUG - 모든 상품 번역 및 저장 완료. +2024-09-23 22:45:38,553 - gui.py:253 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 22:45:38,751 - browser_control.py:86 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 22:45:38,757 - whale_translator.py:167 - default_logger - DEBUG - 가상 데스크톱 종료 중 오류 발생: WhaleTranslator.close_whale_window_if_exists() takes 1 positional argument but 2 were given +2024-09-23 22:50:16,363 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 22:50:17,365 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 22:50:19,384 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 22:50:22,652 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 22:50:22,653 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 22:50:26,907 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 22:50:26,918 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 22:50:26,919 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 1339953450 +2024-09-23 22:50:31,308 - browser_control.py:199 - default_logger - DEBUG - 광고 다이알로그가 없어서 바로 진행합니다. +2024-09-23 22:50:31,308 - browser_control.py:62 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 22:50:31,435 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:00:08,410 - gui.py:253 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:00:08,617 - browser_control.py:86 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:00:08,619 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:00:09,620 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:00:10,723 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:00:10,724 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:04:25,717 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:04:28,758 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:04:33,337 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:04:33,338 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:04:37,966 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:04:37,975 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:04:37,977 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 1315664 +2024-09-23 23:04:44,074 - browser_control.py:199 - default_logger - DEBUG - 광고 다이알로그가 없어서 바로 진행합니다. +2024-09-23 23:04:44,074 - browser_control.py:62 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 23:04:44,217 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:06:41,531 - gui.py:262 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:06:41,723 - browser_control.py:86 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:06:41,725 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:06:42,726 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:06:43,828 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:06:43,829 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:07:58,181 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:08:01,222 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:08:03,853 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:08:03,854 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:08:08,192 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:08:08,202 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:08:08,203 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 790834 +2024-09-23 23:08:12,821 - browser_control.py:213 - default_logger - DEBUG - 다이얼로그가 발견되지 않았거나 오류 발생: Page.wait_for_selector: Timeout 3000ms exceeded. +Call log: +waiting for locator("div.ant-modal-wrap.ant-modal-centered") to be visible + +2024-09-23 23:08:12,822 - browser_control.py:62 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 23:08:12,960 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:09:03,280 - gui.py:262 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:09:03,468 - browser_control.py:86 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:09:03,470 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:09:04,472 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:09:05,575 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:09:05,577 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:09:32,341 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:09:35,377 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:09:38,000 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:09:38,001 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:09:42,294 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:09:42,303 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:09:42,305 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 193532504 +2024-09-23 23:09:43,753 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 23:09:43,905 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:09:45,851 - browser_control.py:204 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:09:45,962 - browser_control.py:210 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:09:49,712 - gui.py:154 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:09:49,712 - gui.py:163 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:09:50,015 - browser_control.py:222 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:09:50,015 - gui.py:230 - default_logger - DEBUG - 번역 작업 중 오류 발생: 'BrowserController' object has no attribute 'scroll_page_to_bottom' +2024-09-23 23:10:51,468 - gui.py:262 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:10:51,649 - browser_control.py:89 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:10:51,651 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:10:52,652 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:10:53,756 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:10:53,756 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:10:55,077 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:10:58,118 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:11:01,202 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:11:01,202 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:11:05,243 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:11:05,261 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:11:05,263 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 4003134 +2024-09-23 23:11:07,090 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 23:11:07,222 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:11:08,941 - browser_control.py:204 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:11:09,032 - browser_control.py:210 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:11:10,554 - gui.py:154 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:11:10,555 - gui.py:163 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:11:10,852 - browser_control.py:222 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:11:10,853 - browser_control.py:468 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:11:14,986 - browser_control.py:478 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:11:14,996 - browser_control.py:468 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:11:16,014 - browser_control.py:478 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:11:16,019 - browser_control.py:238 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:11:16,041 - browser_control.py:243 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:11:16,042 - gui.py:178 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:11:16,051 - browser_control.py:468 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:11:17,067 - browser_control.py:478 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:11:17,071 - browser_control.py:238 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:11:17,078 - browser_control.py:243 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:11:17,078 - gui.py:193 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:11:17,120 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:11:17,733 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:11:18,750 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:11:19,126 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:11:19,136 - browser_control.py:283 - default_logger - DEBUG - 추출된 이미지 URL 수: 0 +2024-09-23 23:11:19,136 - browser_control.py:286 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:11:19,177 - browser_control.py:309 - default_logger - DEBUG - 이미지 URL 추출 중 오류: 'Logger' object is not callable +2024-09-23 23:11:19,178 - gui.py:214 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:11:19,354 - browser_control.py:335 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:11:19,469 - gui.py:217 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:11:19,470 - gui.py:193 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-09-23 23:11:19,559 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:11:19,970 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:11:20,802 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:11:21,029 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:11:21,037 - browser_control.py:283 - default_logger - DEBUG - 추출된 이미지 URL 수: 0 +2024-09-23 23:11:21,037 - browser_control.py:286 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:11:21,062 - browser_control.py:309 - default_logger - DEBUG - 이미지 URL 추출 중 오류: 'Logger' object is not callable +2024-09-23 23:11:21,063 - gui.py:214 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:11:21,149 - browser_control.py:335 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:11:21,167 - gui.py:217 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:11:21,167 - gui.py:193 - default_logger - DEBUG - 3/20: 세부사항 수정 작업 중... +2024-09-23 23:11:21,337 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:11:21,812 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:11:22,658 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:11:22,886 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:11:22,900 - browser_control.py:283 - default_logger - DEBUG - 추출된 이미지 URL 수: 0 +2024-09-23 23:11:22,900 - browser_control.py:286 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:11:22,930 - browser_control.py:309 - default_logger - DEBUG - 이미지 URL 추출 중 오류: 'Logger' object is not callable +2024-09-23 23:11:22,930 - gui.py:214 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:11:23,015 - browser_control.py:335 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:11:23,035 - gui.py:217 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:11:23,035 - gui.py:193 - default_logger - DEBUG - 4/20: 세부사항 수정 작업 중... +2024-09-23 23:11:23,288 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:11:23,659 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:11:24,520 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:11:24,769 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:11:24,779 - browser_control.py:283 - default_logger - DEBUG - 추출된 이미지 URL 수: 0 +2024-09-23 23:11:24,779 - browser_control.py:286 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:11:24,806 - browser_control.py:309 - default_logger - DEBUG - 이미지 URL 추출 중 오류: 'Logger' object is not callable +2024-09-23 23:11:24,806 - gui.py:214 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:11:24,899 - browser_control.py:335 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:11:24,920 - gui.py:217 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:11:24,920 - gui.py:193 - default_logger - DEBUG - 5/20: 세부사항 수정 작업 중... +2024-09-23 23:11:25,130 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:11:25,553 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:16:00,259 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:16:01,262 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 23:16:03,283 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:16:07,034 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:16:07,034 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:16:10,969 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:16:10,979 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:16:10,980 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 4461072 +2024-09-23 23:16:12,537 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 관리자 계정 +2024-09-23 23:16:12,667 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 관리자 계정 +2024-09-23 23:16:14,368 - browser_control.py:204 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:16:14,592 - browser_control.py:210 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:16:16,370 - gui.py:154 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:16:16,370 - gui.py:163 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:16:16,631 - browser_control.py:222 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:16:16,632 - gui.py:172 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:16:16,639 - browser_control.py:471 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:16:20,752 - browser_control.py:481 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:16:20,756 - browser_control.py:238 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:16:20,765 - browser_control.py:243 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:16:20,766 - gui.py:187 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:16:20,806 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:16:21,366 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:16:22,462 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:16:22,811 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:16:22,835 - browser_control.py:286 - default_logger - DEBUG - 추출된 이미지 URL 수: 23 +2024-09-23 23:16:22,836 - browser_control.py:289 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:16:22,891 - browser_control.py:300 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:16:22,891 - browser_control.py:303 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:16:23,021 - browser_control.py:308 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:16:23,021 - browser_control.py:312 - default_logger - DEBUG - 이미지 URL 추출 중 오류: name 'urls' is not defined +2024-09-23 23:16:23,022 - gui.py:208 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:16:23,113 - browser_control.py:338 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:16:23,140 - gui.py:211 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:16:23,140 - gui.py:187 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-09-23 23:16:23,385 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:16:23,796 - browser_control.py:260 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:16:24,608 - browser_control.py:269 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:16:24,830 - browser_control.py:278 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:16:24,856 - browser_control.py:286 - default_logger - DEBUG - 추출된 이미지 URL 수: 10 +2024-09-23 23:16:24,857 - browser_control.py:289 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:16:24,883 - browser_control.py:300 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:16:24,884 - browser_control.py:303 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:16:24,983 - browser_control.py:308 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:16:24,983 - browser_control.py:312 - default_logger - DEBUG - 이미지 URL 추출 중 오류: name 'urls' is not defined +2024-09-23 23:16:24,984 - gui.py:208 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:16:25,065 - browser_control.py:338 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:16:25,086 - gui.py:211 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:16:25,086 - gui.py:187 - default_logger - DEBUG - 3/20: 세부사항 수정 작업 중... +2024-09-23 23:16:25,342 - browser_control.py:257 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:17:45,837 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:17:46,838 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 23:17:48,854 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:18:10,517 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:18:10,517 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:18:14,875 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:18:14,888 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:18:14,890 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 921572508 +2024-09-23 23:18:16,545 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:18:16,749 - browser_control.py:77 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:18:19,769 - browser_control.py:216 - default_logger - DEBUG - 다이얼로그가 발견되지 않았거나 오류 발생: Page.wait_for_selector: Timeout 3000ms exceeded. +Call log: +waiting for locator("div.ant-modal-wrap.ant-modal-centered") to be visible + +2024-09-23 23:18:23,764 - gui.py:256 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:18:23,964 - browser_control.py:89 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:18:23,966 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:18:24,967 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:18:26,071 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:18:26,071 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:18:43,632 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:18:46,667 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:18:50,021 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:18:50,021 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:18:54,552 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:18:54,561 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:18:54,563 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 450303078 +2024-09-23 23:18:55,532 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:18:55,752 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:18:58,030 - browser_control.py:217 - default_logger - DEBUG - 다이얼로그가 발견되지 않았거나 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Call log: +waiting for locator("div.ant-modal-wrap.ant-modal-centered") to be visible + +2024-09-23 23:21:56,741 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:21:57,742 - whale_translator.py:63 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 23:21:59,763 - whale_translator.py:82 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:22:04,930 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:22:04,930 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:22:09,335 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:22:09,348 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:22:09,350 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 1388320088 +2024-09-23 23:22:10,450 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:22:10,674 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:22:12,506 - browser_control.py:205 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:22:12,593 - browser_control.py:211 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:22:19,603 - gui.py:159 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:22:19,603 - gui.py:168 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:22:19,918 - browser_control.py:223 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:22:19,919 - gui.py:177 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:22:19,926 - browser_control.py:472 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:22:24,072 - browser_control.py:482 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:22:24,076 - browser_control.py:239 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:22:24,085 - browser_control.py:244 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:22:24,085 - gui.py:192 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:22:24,119 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:22:24,626 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:22:25,701 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:22:26,029 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:22:26,055 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 13 +2024-09-23 23:22:26,056 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:22:26,083 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:22:26,083 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:22:26,202 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:22:26,225 - whale_translator.py:73 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:22:27,228 - gui.py:229 - default_logger - DEBUG - 번역 작업 중 오류 발생: (0, 'SetForegroundWindow', 'No error message is available') +2024-09-23 23:23:02,685 - gui.py:261 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:23:02,913 - browser_control.py:90 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:23:02,916 - whale_translator.py:141 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:23:03,917 - whale_translator.py:144 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:23:05,019 - whale_translator.py:162 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:23:05,020 - whale_translator.py:164 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:25:06,753 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:25:09,786 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:25:20,238 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:25:20,240 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:25:24,548 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:25:24,558 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:25:24,561 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 194122328 +2024-09-23 23:25:25,812 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:25:26,045 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:25:27,573 - browser_control.py:205 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:25:27,720 - browser_control.py:211 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:25:30,031 - gui.py:159 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:25:30,031 - gui.py:168 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:25:30,325 - browser_control.py:223 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:25:30,326 - gui.py:177 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:25:30,332 - browser_control.py:472 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:25:34,480 - browser_control.py:482 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:25:34,482 - browser_control.py:239 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:25:34,482 - browser_control.py:244 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:25:34,482 - gui.py:192 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:25:34,527 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:25:35,049 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:25:36,081 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:25:36,369 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:25:36,392 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 13 +2024-09-23 23:25:36,392 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:25:36,419 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:25:36,419 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:25:36,507 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:25:36,526 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:25:50,326 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i4/2206582812176/O1CN01SYsODm1RweY6CPI1V_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:25:50,344 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:25:51,346 - gui.py:229 - default_logger - DEBUG - 번역 작업 중 오류 발생: BrowserController.paste_image_in_chrome() missing 1 required positional argument: 'base64toimage' +2024-09-23 23:26:11,823 - gui.py:261 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:26:12,043 - browser_control.py:90 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:26:12,050 - whale_translator.py:142 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:26:13,050 - whale_translator.py:145 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:26:14,152 - whale_translator.py:163 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:26:14,153 - whale_translator.py:165 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:28:48,095 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:28:51,140 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:29:00,685 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:29:00,685 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:29:05,103 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:29:05,115 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:29:05,117 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 4658494 +2024-09-23 23:29:06,515 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:29:06,762 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:29:08,432 - browser_control.py:205 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:29:08,638 - browser_control.py:211 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:29:22,837 - gui.py:159 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:29:22,837 - gui.py:168 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:29:23,195 - browser_control.py:223 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:29:23,195 - gui.py:177 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:29:23,205 - browser_control.py:472 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:29:27,348 - browser_control.py:482 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:29:27,352 - browser_control.py:239 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:29:27,361 - browser_control.py:244 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:29:27,361 - gui.py:192 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:29:27,385 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:29:27,892 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:29:28,827 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:29:29,107 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:29:29,127 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 13 +2024-09-23 23:29:29,128 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:29:29,154 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:29:29,155 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:29:29,240 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:29:29,267 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:29:43,051 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i4/2206582812176/O1CN01SYsODm1RweY6CPI1V_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:29:43,059 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:29:44,072 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:29:44,072 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:29:44,075 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:29:44,279 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:29:44,293 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:29:58,103 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01L3VUEA1RwebqQZTNp_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:29:58,117 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:29:59,118 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:29:59,118 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:29:59,118 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:29:59,322 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:29:59,333 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:30:13,153 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01skPWr91RweboBW080_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:30:13,167 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:30:14,168 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:14,168 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:14,168 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:30:14,372 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:30:14,387 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:30:28,186 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i3/2206582812176/O1CN01rBLHIW1RwebzHvrgo_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:30:28,201 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:30:29,202 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:29,202 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:29,202 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:30:29,406 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:30:29,419 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:30:43,236 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i1/2206582812176/O1CN01hGOPTO1RweboBV3v1_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:30:43,248 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:30:44,249 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:44,249 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:44,249 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:30:44,453 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:30:44,465 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:30:58,284 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01B0BcfX1RwebspygRX_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:30:58,298 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:30:59,299 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:59,299 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:30:59,299 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:30:59,503 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:30:59,518 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:31:13,321 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01qfHQ251Rwebsq0lLQ_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:31:13,332 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:31:14,335 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:14,335 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:14,335 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:31:14,539 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:31:14,551 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:31:28,356 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i4/2206582812176/O1CN01Zql22i1RweboBVOiK_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:31:28,370 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:31:29,370 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:29,371 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:29,371 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:31:29,574 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:31:29,588 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:31:43,406 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i1/2206582812176/O1CN01CI6VCl1RwebqQYjgt_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:31:43,419 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:31:44,421 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:44,421 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:44,421 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:31:44,624 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:31:44,636 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:31:58,458 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01l9pD8C1RwebtXCxT3_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:31:58,474 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:31:59,476 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:59,476 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:31:59,476 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:31:59,679 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:31:59,694 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:32:13,505 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01GkvW771Rwec03MpH2_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:32:13,517 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:32:14,519 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:14,519 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:14,519 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:32:14,722 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:32:14,735 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:32:28,559 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i3/2206582812176/O1CN01OTK20e1RwebsioiUX_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:32:28,571 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:32:29,575 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:29,575 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:29,575 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:32:29,779 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:32:29,791 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:32:43,609 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2206582812176/O1CN01cl2rSG1RwebsioW16_!!2206582812176.jpg_Q75.jpg +2024-09-23 23:32:43,621 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:32:44,623 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:44,623 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:32:44,623 - base64_to_image.py:59 - default_logger - DEBUG - 클립보드에 Base64 이미지가 없습니다. +2024-09-23 23:32:44,828 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:32:44,828 - gui.py:213 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:32:44,973 - browser_control.py:339 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:32:45,014 - gui.py:216 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:32:45,014 - gui.py:192 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-09-23 23:32:45,382 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:32:45,912 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:32:46,947 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:32:47,237 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:32:47,262 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 33 +2024-09-23 23:32:47,262 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:32:47,305 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:32:47,306 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:32:47,440 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:32:47,454 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:32:48,456 - gui.py:229 - default_logger - DEBUG - 번역 작업 중 오류 발생: (1400, 'SetForegroundWindow', '잘못된 창 핸들입니다.') +2024-09-23 23:40:02,630 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:40:05,674 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:40:33,985 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:40:34,987 - whale_translator.py:142 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾았습니다. 종료 중... +2024-09-23 23:40:35,990 - whale_translator.py:145 - default_logger - DEBUG - '새 탭 - Whale' 창을 종료했습니다. +2024-09-23 23:40:35,990 - whale_translator.py:64 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다. +2024-09-23 23:40:38,026 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:40:45,454 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:40:45,455 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:40:49,761 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:40:49,772 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:40:49,773 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 2888424 +2024-09-23 23:40:51,390 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:40:51,586 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:40:53,137 - browser_control.py:205 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:40:53,298 - browser_control.py:211 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:41:11,126 - gui.py:159 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:41:11,126 - gui.py:168 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:41:11,534 - browser_control.py:223 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:41:11,534 - gui.py:177 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:41:11,543 - browser_control.py:472 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:41:15,676 - browser_control.py:482 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:41:15,681 - browser_control.py:239 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:41:15,690 - browser_control.py:244 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:41:15,690 - gui.py:192 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:41:15,729 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:41:16,392 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:41:17,523 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:41:17,868 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:41:17,895 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 3 +2024-09-23 23:41:17,896 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:41:17,925 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:41:17,926 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:41:18,031 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:41:18,047 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:41:19,049 - gui.py:229 - default_logger - DEBUG - 번역 작업 중 오류 발생: (0, 'SetForegroundWindow', 'No error message is available') +2024-09-23 23:41:37,957 - gui.py:261 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-09-23 23:41:38,174 - browser_control.py:90 - default_logger - DEBUG - 브라우저 종료됨. +2024-09-23 23:41:38,181 - whale_translator.py:147 - default_logger - DEBUG - '새 탭 - Whale' 창을 찾지 못했습니다. +2024-09-23 23:41:39,288 - whale_translator.py:163 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1 +2024-09-23 23:41:39,288 - whale_translator.py:165 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다. +2024-09-23 23:42:01,858 - whale_translator.py:59 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다. +2024-09-23 23:42:04,896 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:42:07,975 - gui.py:119 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-09-23 23:42:07,976 - browser_control.py:26 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-09-23 23:42:12,333 - browser_control.py:41 - default_logger - DEBUG - newPage 로딩 ... +2024-09-23 23:42:12,342 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-09-23 23:42:12,344 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 12326284 +2024-09-23 23:42:13,441 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-09-23 23:42:13,647 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-09-23 23:42:15,419 - browser_control.py:205 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-09-23 23:42:15,623 - browser_control.py:211 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-09-23 23:42:18,016 - gui.py:159 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-09-23 23:42:18,016 - gui.py:168 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-09-23 23:42:18,311 - browser_control.py:223 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-09-23 23:42:18,311 - gui.py:177 - default_logger - DEBUG - 현재 페이지: 1 +2024-09-23 23:42:18,315 - browser_control.py:472 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-09-23 23:42:22,444 - browser_control.py:482 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-09-23 23:42:22,449 - browser_control.py:239 - default_logger - DEBUG - 페이지를 아래로 스크롤했습니다. +2024-09-23 23:42:22,453 - browser_control.py:244 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-09-23 23:42:22,453 - gui.py:192 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-09-23 23:42:22,480 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:42:23,031 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:42:24,072 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:42:24,458 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:42:24,482 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 3 +2024-09-23 23:42:24,482 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:42:24,508 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:42:24,508 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:42:24,630 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:42:24,650 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:42:38,463 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66e43a3be0c01035ed0be546/62d18e17-0621-43d8-8344-f05bd5a0dd71.jpg +2024-09-23 23:42:38,473 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:42:39,492 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:42:39,492 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:42:40,374 - base64_to_image.py:75 - default_logger - DEBUG - 원본 이미지 다운로드 성공, 클립보드에 다시 저장 중... +2024-09-23 23:42:40,390 - base64_to_image.py:77 - default_logger - DEBUG - 원본 이미지가 클립보드에 저장되었습니다. +2024-09-23 23:42:40,594 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:42:40,618 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:42:54,414 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66e43a3be0c01035ed0be546/300d789a-a43f-4d60-8026-83d76c3a32f1.jpg +2024-09-23 23:42:54,429 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:42:55,431 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:42:55,431 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:42:56,055 - base64_to_image.py:75 - default_logger - DEBUG - 원본 이미지 다운로드 성공, 클립보드에 다시 저장 중... +2024-09-23 23:42:56,055 - base64_to_image.py:77 - default_logger - DEBUG - 원본 이미지가 클립보드에 저장되었습니다. +2024-09-23 23:42:56,269 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:42:56,284 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:43:10,099 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66e43a3be0c01035ed0be546/51e9c6ce-3a3b-4882-bf26-89596f13483e.jpg +2024-09-23 23:43:10,113 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:43:11,114 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:11,114 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:11,815 - base64_to_image.py:75 - default_logger - DEBUG - 원본 이미지 다운로드 성공, 클립보드에 다시 저장 중... +2024-09-23 23:43:11,821 - base64_to_image.py:77 - default_logger - DEBUG - 원본 이미지가 클립보드에 저장되었습니다. +2024-09-23 23:43:12,025 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:43:12,025 - gui.py:213 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-09-23 23:43:12,131 - browser_control.py:339 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-09-23 23:43:12,160 - gui.py:216 - default_logger - DEBUG - 상품 수정 완료. +2024-09-23 23:43:12,160 - gui.py:192 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-09-23 23:43:12,502 - browser_control.py:258 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-09-23 23:43:12,951 - browser_control.py:261 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-09-23 23:43:13,812 - browser_control.py:270 - default_logger - DEBUG - 상세페이지 탭 클릭 완료. +2024-09-23 23:43:14,061 - browser_control.py:279 - default_logger - DEBUG - 소스 버튼 클릭 완료. +2024-09-23 23:43:14,083 - browser_control.py:287 - default_logger - DEBUG - 추출된 이미지 URL 수: 33 +2024-09-23 23:43:14,083 - browser_control.py:290 - default_logger - DEBUG - img 태그를 삭제 중... +2024-09-23 23:43:14,115 - browser_control.py:301 - default_logger - DEBUG - Updated data-value: +2024-09-23 23:43:14,115 - browser_control.py:304 - default_logger - DEBUG - img 태그 삭제 완료. +2024-09-23 23:43:14,226 - browser_control.py:309 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. +2024-09-23 23:43:14,242 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:43:28,035 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i1/2210213220218/O1CN01g6hvO71DTtHR2Dwwg_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:43:28,048 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:43:29,049 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:29,049 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:29,387 - base64_to_image.py:53 - default_logger - DEBUG - 이미지 다운로드 중 오류 발생: cannot identify image file <_io.BytesIO object at 0x0000029F835504A0> +2024-09-23 23:43:29,388 - base64_to_image.py:79 - default_logger - DEBUG - 원본 이미지 다운로드 실패. +2024-09-23 23:43:29,592 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:43:29,601 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:43:43,417 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i4/2210213220218/O1CN018J25xq1DTtHTtbBlK_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:43:43,429 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:43:44,431 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:44,431 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:44,605 - base64_to_image.py:53 - default_logger - DEBUG - 이미지 다운로드 중 오류 발생: cannot identify image file <_io.BytesIO object at 0x0000029F835502C0> +2024-09-23 23:43:44,608 - base64_to_image.py:79 - default_logger - DEBUG - 원본 이미지 다운로드 실패. +2024-09-23 23:43:44,811 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:43:44,825 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:43:58,638 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i1/2210213220218/O1CN01AYmhzJ1DTtHY6lpDn_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:43:58,650 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:43:59,655 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:59,655 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:43:59,888 - base64_to_image.py:53 - default_logger - DEBUG - 이미지 다운로드 중 오류 발생: cannot identify image file <_io.BytesIO object at 0x0000029F83550360> +2024-09-23 23:43:59,888 - base64_to_image.py:79 - default_logger - DEBUG - 원본 이미지 다운로드 실패. +2024-09-23 23:44:00,097 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:44:00,111 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:44:13,901 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/2210213220218/O1CN0175owwm1DTtHT8ohnz_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:44:13,915 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:44:14,916 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:14,916 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:15,135 - base64_to_image.py:53 - default_logger - DEBUG - 이미지 다운로드 중 오류 발생: cannot identify image file <_io.BytesIO object at 0x0000029F835503B0> +2024-09-23 23:44:15,135 - base64_to_image.py:79 - default_logger - DEBUG - 원본 이미지 다운로드 실패. +2024-09-23 23:44:15,341 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:44:15,357 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:44:29,159 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i1/2210213220218/O1CN01xXwaPe1DTtHT8mUZn_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:44:29,173 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:44:30,177 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:30,177 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:30,733 - base64_to_image.py:53 - default_logger - DEBUG - 이미지 다운로드 중 오류 발생: cannot identify image file <_io.BytesIO object at 0x0000029F83550F90> +2024-09-23 23:44:30,733 - base64_to_image.py:79 - default_logger - DEBUG - 원본 이미지 다운로드 실패. +2024-09-23 23:44:30,939 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:44:30,950 - whale_translator.py:74 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. +2024-09-23 23:44:44,752 - whale_translator.py:117 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i3/2210213220218/O1CN01GddRXb1DTtHUrEYCO_!!2210213220218.jpg_Q75.jpg +2024-09-23 23:44:44,762 - whale_translator.py:83 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다. +2024-09-23 23:44:45,763 - browser_control.py:368 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:45,763 - browser_control.py:369 - default_logger - DEBUG - 크롬 창으로 포커스 이동. +2024-09-23 23:44:45,763 - base64_to_image.py:83 - default_logger - DEBUG - 클립보드에 Base64 이미지나 'html > whale-ocr' 데이터가 없습니다. +2024-09-23 23:44:45,966 - browser_control.py:331 - default_logger - DEBUG - 이미지 붙여넣기 완료. +2024-09-23 23:44:45,966 - whale_translator.py:77 - default_logger - DEBUG - 가상 데스크톱 전환 중 오류 발생: Desktop number 2 exceeds the number of desktops, 1. +2024-09-23 23:44:45,968 - gui.py:229 - default_logger - DEBUG - 번역 작업 중 오류 발생: (1400, 'SetForegroundWindow', '잘못된 창 핸들입니다.') diff --git a/base64_to_image.py b/base64_to_image.py new file mode 100644 index 0000000..dd4cbb0 --- /dev/null +++ b/base64_to_image.py @@ -0,0 +1,121 @@ +import base64 +import pyperclip +import win32clipboard +from io import BytesIO +from PIL import Image +import requests +import numpy as np +import cv2 +import time +import random + +class base64TOImage: + def __init__(self, app, logger, browser_controller): + self.app = app + self.logger = logger + self.browser_controller = browser_controller # BrowserController 인스턴스를 전달받음 + + def get_clipboard_data(self): + """클립보드의 텍스트 데이터를 가져옵니다.""" + try: + return pyperclip.paste() # 클립보드의 텍스트 데이터를 가져옴 + except Exception as e: + self.logger.debug(f"클립보드 데이터를 가져오는 중 오류 발생: {e}") + return None + + def set_image_to_clipboard(self, image): + """이미지를 클립보드에 넣는 함수 (Windows 전용)""" + output = BytesIO() + image.save(output, "BMP") + data = output.getvalue()[14:] # BMP 헤더 제거 + output.close() + + # 클립보드에 이미지 데이터 넣기 + win32clipboard.OpenClipboard() + win32clipboard.EmptyClipboard() + win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data) + win32clipboard.CloseClipboard() + + def base64_to_image(self, base64_data): + """Base64 데이터를 이미지로 변환하는 함수""" + if base64_data.startswith('data:image'): + header, encoded = base64_data.split(',', 1) + img_data = base64.b64decode(encoded) + image = Image.open(BytesIO(img_data)) + return image + else: + self.logger.debug("유효하지 않은 Base64 이미지 데이터입니다.") + return None + + def download_image_from_url(self, url, max_retries=3): + """URL에서 이미지를 다운로드하고 PIL 이미지 객체로 반환""" + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br", + "DNT": "1", # Do Not Track 요청 헤더 + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "Cache-Control": "max-age=0" + } + + retries = 0 + while retries < max_retries: + try: + self.logger.debug(f"이미지 URL 다운로드 중: {url}") + response = requests.get(url, headers=headers, stream=True) + + # 상태 코드가 200이 아니면 재시도 + if response.status_code == 200: + # OpenCV로 이미지를 로드하여 변환 + image = np.asarray(bytearray(response.content), dtype="uint8") + image = cv2.imdecode(image, cv2.IMREAD_COLOR) + + # OpenCV에서 이미지를 PIL로 변환 + if image is not None: + pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) + return pil_image + else: + self.logger.debug(f"이미지 파일 형식이 올바르지 않습니다. 대상 URL: {url}") + return None + else: + self.logger.debug(f"이미지 로딩 실패, HTTP 상태 코드: {response.status_code}. 재시도 {retries + 1}/{max_retries}") + retries += 1 + time.sleep(random.randint(2, 5)) # 2~5초 대기 후 재시도 + except Exception as e: + self.logger.debug(f"이미지 로딩 중 오류 발생: {e}. 재시도 {retries + 1}/{max_retries}") + retries += 1 + time.sleep(random.randint(2, 5)) # 예외 발생 시 대기 후 재시도 + + self.logger.debug("이미지 다운로드 최대 재시도 횟수를 초과했습니다.") + return None + + def process_clipboard(self, original_url): + """클립보드의 내용을 처리하고, 필요한 경우 이미지 변환 또는 URL 이미지 복사""" + clipboard_data = self.get_clipboard_data() + + if clipboard_data.startswith('data:image'): + # 클립보드에 있는 Base64 데이터를 이미지로 변환 + image = self.base64_to_image(clipboard_data) + if image: + self.logger.debug("Base64 이미지 변환 성공, 클립보드에 다시 저장 중...") + self.set_image_to_clipboard(image) + self.logger.debug("이미지가 클립보드에 저장되었습니다.") + else: + self.logger.debug("Base64 이미지 변환 실패.") + + elif clipboard_data.strip() == "html > whale-ocr": + # 'html > whale-ocr' 감지 시 원본 이미지 URL에서 이미지를 다운로드하여 클립보드에 복사 + if original_url: + image = self.download_image_from_url(original_url) + if image: + self.logger.debug("원본 이미지 다운로드 성공, 클립보드에 다시 저장 중...") + self.set_image_to_clipboard(image) + self.logger.debug("원본 이미지가 클립보드에 저장되었습니다.") + else: + self.logger.debug("원본 이미지 다운로드 실패.") + else: + self.logger.debug("원본 이미지 URL을 찾을 수 없습니다.") + else: + self.logger.debug("클립보드에 Base64 이미지나 'html > whale-ocr' 데이터가 없습니다.") diff --git a/browser_control.py b/browser_control.py new file mode 100644 index 0000000..be9b629 --- /dev/null +++ b/browser_control.py @@ -0,0 +1,484 @@ +from playwright.sync_api import sync_playwright +import re +import pyautogui +import time +import win32gui, win32con +from bs4 import BeautifulSoup + +class BrowserController: + def __init__(self, app, logger): + self.app = app + self.logger = logger + self.chrome_window_name = "퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 - Chrome" + self.whale_window_name = "새 탭 - Whale" + self.chrome_hwnd = None + self.whale_hwnd = None + + self.playwright = None + self.browser = None + self.page = None + + def get_page(self): + return self.page + + def start_browser(self): + """크롬 브라우저 실행 및 페이지 로딩""" + self.logger.debug('크롬 브라우저 실행 중...') + + # Playwright를 수동으로 실행하여 브라우저 유지 + self.playwright = sync_playwright().start() + self.browser = self.playwright.chromium.launch(headless=False) # 브라우저 비헤드리스 모드 실행 + + # 창 크기 설정 (1920x1080) + context = self.browser.new_context( + viewport={"width": 1920, "height": 1080} + ) + + # 페이지 열기 + self.page = context.new_page() + # self.page.goto('https://percenty.co.kr/') # 원하는 페이지로 이동 + self.page.goto('https://percenty.co.kr/signin') # 원하는 페이지로 이동 + self.logger.debug('newPage 로딩 ...') + # 사용자는 이 시점에 로그인 및 상세페이지 편집 모드로 들어감 + + + # 페이지 제목을 가져와서 창 제목으로 활용 + page_title = self.page.title() + self.logger.debug(f'페이지 제목: {page_title}') + + # 창 핸들 찾기 (동적으로 얻은 페이지 제목 사용) + self.chrome_hwnd = self.find_window_by_title(page_title) + if not self.chrome_hwnd: + self.logger.debug('크롬 창을 찾을 수 없습니다.') + else: + self.logger.debug(f'크롬 창 핸들: {self.chrome_hwnd}') + + self.page.wait_for_load_state('networkidle') + + def login(self, admin_id, user_id, admin_password, user_password, is_admin=False): + """로그인 처리""" + self.logger.debug(f'로그인 시도 중: {"관리자" if is_admin else "직원"} 계정') + + if is_admin: + # 관리자 로그인 처리 + self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력 + self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', admin_password) # 관리자 비밀번호 입력 + self.page.click('button:has-text("로그인 하기")') # 관리자 로그인 버튼 클릭 + else: + # 관리자 토글 버튼을 클릭해서 직원 로그인 화면 활성화 + admin_toggle = self.page.locator('button[role="switch"]') + if admin_toggle.get_attribute("aria-checked") == "true": + admin_toggle.click() # 관리자 모드에서 직원 모드로 전환 + + self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력 + self.page.fill('input[placeholder="직원 아이디 입력"]', user_id) # 직원 ID 입력 + self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', user_password) # 직원 비밀번호 입력 + self.page.click('button:has-text("직원 로그인 하기")') # 직원 로그인 버튼 클릭 + + self.logger.debug(f'로그인 완료: {"관리자" if is_admin else "직원"} 계정') + + self.page.wait_for_load_state('networkidle') + + self.close_ad_if_exists() + + + def close_browser(self): + """브라우저 종료""" + if self.browser: + self.browser.close() + self.playwright.stop() + self.logger.debug('브라우저 종료됨.') + + def find_window_by_title(self, window_name): + """창 제목을 통해 핸들을 찾는 메서드""" + def enum_windows_callback(hwnd, result): + if win32gui.IsWindowVisible(hwnd) and window_name in win32gui.GetWindowText(hwnd): + result.append(hwnd) + result = [] + win32gui.EnumWindows(enum_windows_callback, result) + return result[0] if result else None + + def switch_to_chrome(self): + """크롬으로 포커스 전환""" + if self.chrome_hwnd: + win32gui.ShowWindow(self.chrome_hwnd, win32con.SW_RESTORE) + win32gui.SetForegroundWindow(self.chrome_hwnd) + self.logger.debug('크롬 창으로 포커스 이동.') + else: + self.logger.debug('크롬 창을 찾을 수 없습니다.') + + def switch_to_whale(self): + """웨일 브라우저로 포커스 전환""" + if not self.whale_hwnd: + self.whale_hwnd = self.find_window_by_title(self.whale_window_name) + if self.whale_hwnd: + win32gui.ShowWindow(self.whale_hwnd, win32con.SW_RESTORE) + win32gui.SetForegroundWindow(self.whale_hwnd) + self.logger.debug('웨일 창으로 포커스 이동.') + else: + self.logger.debug('웨일 창을 찾을 수 없습니다.') + + def extract_image_urls(self): + """HTML에서 이미지 URL 추출 및 img 태그 삭제 후 소스 버튼 다시 클릭""" + self.logger.debug('이미지 URL을 추출 중...') + + # 소스 버튼 클릭 + self.page.click("button[data-cke-tooltip-text='소스']") + self.logger.debug('소스 버튼 클릭 완료.') + + # 'data-value' 속성 값을 추출 (textarea 요소) + textarea = self.page.wait_for_selector('div.ck-source-editing-area') + data_value = textarea.get_attribute("data-value") + + if data_value: + self.logger.debug('data-value 속성에서 HTML 수집 완료.') + + # 이미지 URL 추출 + image_urls = self.fetch_image_urls(data_value) + self.logger.debug(f'추출된 이미지 URL 수: {len(image_urls)}') + # 추출된 URL 반환 + self.logger.debug('img 태그를 삭제 중...') + + self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기 + + # data-value 속성을 가진 요소 선택 + data_value_element = self.page.query_selector('div.ck-source-editing-area') + + new_value = "" + + if data_value_element: + # 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경) + # self.page.evaluate('(element, value) => element.setAttribute("data-value", value)', data_value_element, new_value) + self.page.evaluate(f'() => document.querySelector("div.ck-source-editing-area").setAttribute("data-value", "{new_value}")') + + # 데이터가 제대로 변경되었는지 확인 + updated_value = data_value_element.get_attribute('data-value') + self.logger(f'Updated data-value: {updated_value}') + + else: + self.logger('Element with data-value not found.') + + + self.logger.debug('img 태그 삭제 완료.') + + # 소스 버튼 다시 클릭 + self.page.click("button[data-cke-tooltip-text='소스']") + self.logger.debug('소스 버튼 재 클릭 완료.') + + return image_urls + else: + self.logger.debug('data-value 속성에 데이터가 없습니다.') + return [] + + def fetch_image_urls(self, html_content): + """ + HTML 콘텐츠에서 모든 태그의 URL을 순서대로 추출 + """ + soup = BeautifulSoup(html_content, 'html.parser') + image_urls = [] + + # class="image_resized"를 가진 모든 태그 찾기 + images_resized = soup.find_all('img', class_='image_resized') + for img in images_resized: + if img and 'src' in img.attrs and img['src'] not in image_urls: + image_urls.append(img['src']) + + #
내부의 모든 태그 찾기 + figures = soup.find_all('figure', class_='image') + for figure in figures: + img_tag = figure.find('img') + if img_tag and 'src' in img_tag.attrs and img_tag['src'] not in image_urls: + image_urls.append(img_tag['src']) + + return image_urls + + def close_ad_if_exists(self): + + """광고 다이얼로그가 있으면 닫기 버튼을 클릭하는 메서드""" + try: + # 광고 다이얼로그가 나타날 때까지 기다림 + dialog_selector = "div.ant-modal-wrap.ant-modal-centered" + close_button_selector = "div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default" + + # 3초 동안 다이얼로그 대기 + self.page.wait_for_selector(dialog_selector, timeout=3000) + self.logger.debug("다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.") + + # 닫기 버튼 클릭 + close_button = self.page.query_selector(close_button_selector) + if close_button: + close_button.click() + self.logger.debug("다이얼로그를 성공적으로 닫았습니다.") + else: + self.logger.debug("닫기 버튼을 찾지 못했습니다.") + + except Exception as e: + # 다이얼로그가 없거나 다른 문제가 발생한 경우 + self.logger.debug(f"다이얼로그가 발견되지 않았거나 오류 발생: {e}") + + def go_to_new_product_page(self): + """신규 상품 등록 페이지로 이동""" + try: + self.page.click('span.ant-menu-title-content:has-text("신규 상품 등록")') + self.logger.debug("신규 상품 등록 페이지로 이동 완료.") + except Exception as e: + self.logger.debug(f"신규 상품 등록 페이지 이동 중 오류: {str(e)}") + + def get_product_edit_buttons(self): + """현재 페이지의 세부사항 수정 및 업로드 버튼을 찾기""" + try: + # 페이지 로딩을 기다림 + self.page.wait_for_load_state('networkidle') # 네트워크 요청이 모두 끝날 때까지 대기 + + # 페이지 끝까지 스크롤하여 모든 동적 요소 로드 + self.scroll_page_to_bottom() + + + # 스크롤하여 모든 버튼을 화면에 표시 (가장 하단까지 스크롤) + self.page.evaluate("""window.scrollTo(0, document.body.scrollHeight);""") + self.logger.debug("페이지를 아래로 스크롤했습니다.") + + # 버튼 선택 (확실한 선택자를 사용하여 확인) + buttons = self.page.locator('button:has-text("세부사항 수정 및 업로드")') + count = buttons.count() + self.logger.debug(f"수정할 상품 개수: {count}") + + # 모든 버튼을 리스트로 반환 + return [buttons.nth(i) for i in range(count)] + + except Exception as e: + self.logger.debug(f"상품 수정 버튼을 찾는 중 오류: {str(e)}") + return [] + + def open_product_edit_dialog(self, button): + """상품 수정 다이얼로그 열기""" + try: + # 요소가 화면에 없을 경우 스크롤하여 보이도록 함 + button.scroll_into_view_if_needed() + self.logger.debug("상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.") + + button.click() + self.logger.debug("세부사항 수정 다이얼로그 열기 완료.") + self.page.wait_for_selector('div.ant-tabs-nav') # 다이얼로그가 완전히 로딩될 때까지 기다림 + except Exception as e: + self.logger.debug(f"세부사항 수정 다이얼로그 열기 중 오류: {str(e)}") + + def click_detail_tab(self): + """상세페이지 탭 클릭""" + try: + self.page.click('div.ant-tabs-tab:has-text("상세페이지")') + self.logger.debug("상세페이지 탭 클릭 완료.") + except Exception as e: + self.logger.debug(f"상세페이지 탭 클릭 중 오류: {str(e)}") + + def extract_image_urls(self): + """상세페이지에서 이미지 URL 추출""" + try: + # 소스 편집 모드로 전환 + self.page.click('button[data-cke-tooltip-text="소스"]') + self.logger.debug("소스 버튼 클릭 완료.") + + # 'data-value' 속성 값을 추출 (textarea 요소) + textarea = self.page.wait_for_selector('div.ck-source-editing-area') + data_value = textarea.get_attribute("data-value") + + # HTML 소스에서 이미지 URL 추출 + image_urls = self.fetch_image_urls(data_value) + self.logger.debug(f'추출된 이미지 URL 수: {len(image_urls)}') + + # HTML 소스에서 이미지 URL 삭제 + self.logger.debug('img 태그를 삭제 중...') + self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기 + # data-value 속성을 가진 요소 선택 + data_value_element = self.page.query_selector('div.ck-source-editing-area') + new_value = "" + if data_value_element: + # 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경) + # self.page.evaluate('(element, value) => element.setAttribute("data-value", value)', data_value_element, new_value) + self.page.evaluate(f'() => document.querySelector("div.ck-source-editing-area").setAttribute("data-value", "{new_value}")') + # 데이터가 제대로 변경되었는지 확인 + updated_value = data_value_element.get_attribute('data-value') + self.logger.debug(f'Updated data-value: {updated_value}') + else: + self.logger.debug('Element with data-value not found.') + self.logger.debug('img 태그 삭제 완료.') + + + # img 태그의 class 삭제 후 다시 소스 버튼 클릭 + self.page.click('button[data-cke-tooltip-text="소스"]') + self.logger.debug('소스 버튼 재 클릭 완료.') + + return image_urls + except Exception as e: + self.logger.debug(f"이미지 URL 추출 중 오류: {str(e)}") + return [] + + def translate_image(self, url): + """이미지 번역 진행""" + try: + self.whale_translator.translate_image(url) + self.logger.debug(f"이미지 번역 완료: {url}") + except Exception as e: + self.logger.debug(f"이미지 번역 중 오류: {str(e)}") + + def paste_image_in_chrome(self, base64toimage, url): + """크롬으로 포커스를 옮기고 클립보드의 이미지를 붙여넣고 엔터 입력""" + try: + self.switch_to_chrome() # 크롬으로 포커스 이동 + base64toimage.process_clipboard(url) # 클립보드 내용이 base64일 경우 이미지로 변환 + pyautogui.hotkey('ctrl', 'v') # 클립보드 이미지 붙여넣기 + pyautogui.press('enter') # 엔터 키 입력 + self.logger.debug("이미지 붙여넣기 완료.") + except Exception as e: + self.logger.debug(f"이미지 붙여넣기 중 오류: {str(e)}") + + def save_product_edit(self): + """상품 수정 후 저장 버튼 클릭""" + try: + self.page.click('button:has-text("저장하기")') + self.logger.debug("상품 수정 내용 저장 완료.") + self.page.keyboard.press("Escape") # ESC로 다이얼로그 닫기 + except Exception as e: + self.logger.debug(f"저장 버튼 클릭 중 오류: {str(e)}") + + def go_to_next_page(self): + """다음 페이지로 이동""" + try: + next_button = self.page.query_selector('li.ant-pagination-item-next') + if next_button: + next_button.click() + self.page.wait_for_load_state('domcontentloaded') + self.logger.debug("다음 페이지로 이동 완료.") + return True + else: + self.logger.debug("다음 페이지가 없습니다.") + return False + except Exception as e: + self.logger.debug(f"다음 페이지로 이동 중 오류: {str(e)}") + return False + + def switch_to_chrome(self): + """크롬으로 포커스 전환""" + try: + if not self.chrome_hwnd: + self.chrome_hwnd = self.find_window_by_title(self.chrome_window_name) + if self.chrome_hwnd: + win32gui.ShowWindow(self.chrome_hwnd, win32con.SW_RESTORE) + win32gui.SetForegroundWindow(self.chrome_hwnd) + self.logger.debug('크롬 창으로 포커스 이동.') + self.logger.debug('크롬 창으로 포커스 이동.') + else: + self.logger.debug('크롬 창을 찾을 수 없습니다.') + self.logger.debug('크롬 창을 찾을 수 없습니다.') + except Exception as e: + self.logger.debug(f"크롬 포커스 전환 중 오류: {str(e)}") + + + + + def scroll_with_wheel(self, direction="down", pause_time=0.5, max_scrolls=20): + """ + 휠 스크롤을 사용하여 페이지를 위나 아래로 천천히 스크롤. + + Parameters: + - direction: 스크롤 방향 ("down"은 아래로, "up"은 위로). + - pause_time: 스크롤 사이의 대기 시간 (초). + - max_scrolls: 최대 스크롤 횟수. + """ + scroll_count = 0 + last_height = self.page.evaluate("document.body.scrollHeight") + + while scroll_count < max_scrolls: + if direction == "down": + # 아래로 스크롤 + self.page.mouse.wheel(0, 1000) + elif direction == "up": + # 위로 스크롤 + self.page.mouse.wheel(0, -1000) + else: + raise ValueError("direction 인자는 'down' 또는 'up'만 허용됩니다.") + + time.sleep(pause_time) + + # 스크롤 후 높이 확인 + new_height = self.page.evaluate("document.body.scrollHeight") + + # 아래로 스크롤 시, 페이지의 끝에 도달한 경우 종료 + if direction == "down" and new_height == last_height: + break + elif direction == "up" and new_height == 0: + break # 위로 스크롤 시, 페이지의 시작에 도달하면 종료 + + last_height = new_height + scroll_count += 1 + + def collect_product_info(self): + """ + 상품 정보를 수집하는 메서드 + """ + try: + # 페이지를 아래로 스크롤하여 모든 상품 로드 + self.scroll_with_wheel('down') + self.scroll_with_wheel('up') + + product_infos = [] + for i in range(1, 51): # 1부터 최대 50까지 상품 처리 + try: + # 각 상품의 CSS 선택자를 동적으로 생성하여 접근 + product_name_selector = f"div#root div:nth-child({i}) > div > li > div > div > div:nth-child(2) > div > div > div.ant-col.css-1li46mu > div.sc-dPZUQH.mXDuy > span.sc-dSIIpw.Nrwqu.Body3Regular14.CharacterPrimary85" + product_price_selector = f"div#root div:nth-child({i}) > div > li > div > div > div:nth-child(2) > div > div > div.ant-col.css-1li46mu > div:nth-child(3) > div:nth-child(1) > span.sc-dSIIpw.Nrwqu.Body3Regular14.CharacterPrimary85" + product_image_selector = f"div#root div:nth-child({i}) > div > li > div > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img" + + product_name_element = self.page.locator(product_name_selector) + product_price_element = self.page.locator(product_price_selector) + product_image_element = self.page.locator(product_image_selector) + + if product_name_element and product_price_element and product_image_element: + product_info = { + "name": product_name_element.text_content().strip(), + "price": product_price_element.text_content().strip(), + "image_url": product_image_element.get_attribute('src') + } + self.logger.debug(f"상품 {i}: {product_info}") + product_infos.append(product_info) + except Exception as e: + self.logger.error(f"상품 {i} 정보 수집 중 오류 발생: {str(e)}") + continue + + return product_infos + except Exception as e: + self.logger.error(f"상품 정보 수집 중 오류 발생: {str(e)}") + return [] + + def click_modify_button_by_text(self, index): + """인덱스에 해당하는 '세부사항 수정 및 업로드' 버튼 클릭""" + try: + button_selector = f'(//button[span[text()="세부사항 수정 및 업로드"]])[{index}]' + + # 버튼이 화면에 보이도록 스크롤 후 클릭 + button = self.page.query_selector(button_selector) + if button: + button.scroll_into_view_if_needed() + self.page.evaluate('arguments[0].click();', button) + self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 완료') + else: + self.logger.debug(f'{index}번째 상품의 수정 버튼을 찾지 못했습니다.') + except Exception as e: + self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 중 오류: {str(e)}') + + + def scroll_page_to_bottom(self, pause_time=1): + """페이지의 맨 아래까지 스크롤하여 모든 동적 요소를 로드""" + self.logger.debug('페이지 스크롤 시작...') + previous_height = self.page.evaluate("() => document.body.scrollHeight") + + while True: + self.page.evaluate("window.scrollBy(0, window.innerHeight);") # 한 화면씩 스크롤 + time.sleep(pause_time) # 페이지 로딩 대기 + current_height = self.page.evaluate("() => document.body.scrollHeight") + if current_height == previous_height: + break # 더 이상 스크롤할 내용이 없으면 종료 + previous_height = current_height + self.logger.debug('페이지 스크롤 완료.') + + diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..fdc8de9 --- /dev/null +++ b/gui.py @@ -0,0 +1,265 @@ +from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QTextEdit, QLabel, QLineEdit, QHBoxLayout +from PyQt5.QtCore import Qt, QRect, QSettings +from toggleSwitch import ToggleSwitch +from browser_control import BrowserController +from whale_translator import WhaleTranslator +from base64_to_image import base64TOImage +class TranslationApp(QWidget): + def __init__(self, logger=None): + super().__init__() + self.initUI() + self.logger = logger + self.settings = QSettings("WhenRideMycar", "TranslationApp") # QSettings 초기화 + self.browser_controller = BrowserController(self, self.logger) + self.whale_translator = WhaleTranslator(self, self.logger, debug_mode=True) # 디버그 모드 켜기 + self.base64TOImage = base64TOImage(self, logger, self.browser_controller) + self.running = False + + # 이전에 저장된 설정 불러오기 + self.load_settings() + + def initUI(self): + self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setGeometry(QRect(1740, 500, 180, 400)) + self.setWindowTitle('이미지 번역 도구') + + # 로그 + self.log = QTextEdit(self) + self.log.setReadOnly(True) + + # 관리자 토글 + self.admin_toggle = ToggleSwitch(self) + self.admin_toggle.clicked.connect(self.on_toggle_clicked) + + # 관리자 ID 및 PW + self.admin_id_label = QLabel("관리자 ID:", self) + self.admin_id_input = QLineEdit(self) + self.admin_pw_label = QLabel("관리자 PW:", self) + self.admin_pw_input = QLineEdit(self) + self.admin_pw_input.setEchoMode(QLineEdit.Password) + + # 직원 ID 및 PW + self.user_id_label = QLabel("직원 ID:", self) + self.user_id_input = QLineEdit(self) + self.user_pw_label = QLabel("직원 PW:", self) + self.user_pw_input = QLineEdit(self) + self.user_pw_input.setEchoMode(QLineEdit.Password) + + # 크롬 실행 버튼 및 번역 버튼 + self.start_chrome_button = QPushButton('크롬 실행', self) + self.translate_button = QPushButton('번역 시작', self) + self.pause_button = QPushButton('일시정지', self) + self.exit_button = QPushButton('종료', self) + + # 레이아웃 설정 + layout = QVBoxLayout() + + # 관리자 토글 버튼 및 로그인 관련 필드 추가 + toggle_layout = QHBoxLayout() + toggle_layout.addWidget(QLabel("관리자 여부:", self)) + toggle_layout.addWidget(self.admin_toggle) + layout.addLayout(toggle_layout) + + # 관리자 ID/PW + layout.addWidget(self.admin_id_label) + layout.addWidget(self.admin_id_input) + layout.addWidget(self.admin_pw_label) + layout.addWidget(self.admin_pw_input) + + # 직원 ID/PW + layout.addWidget(self.user_id_label) + layout.addWidget(self.user_id_input) + layout.addWidget(self.user_pw_label) + layout.addWidget(self.user_pw_input) + + + # 크롬 및 번역 관련 버튼 + layout.addWidget(self.start_chrome_button) + layout.addWidget(self.translate_button) + layout.addWidget(self.pause_button) + layout.addWidget(self.exit_button) + self.setLayout(layout) + + layout.addWidget(self.log) + + # 기본 상태 설정 + self.on_toggle_clicked(False) + + # 버튼 이벤트 연결 + self.start_chrome_button.clicked.connect(self.start_browser) + self.translate_button.clicked.connect(self.start_translation) + self.pause_button.clicked.connect(self.pause_translation) + self.exit_button.clicked.connect(self.close) + + def on_toggle_clicked(self, is_checked): + """관리자 토글 상태에 따라 필드 활성화/비활성화""" + if is_checked: + # 관리자 모드 + # self.admin_id_label.setVisible(True) + # self.admin_id_input.setVisible(True) + self.admin_pw_label.setVisible(True) + self.admin_pw_input.setVisible(True) + self.user_id_label.setVisible(False) + self.user_id_input.setVisible(False) + self.user_pw_label.setVisible(False) + self.user_pw_input.setVisible(False) + else: + # 직원 모드 + # self.admin_id_label.setVisible(False) + # self.admin_id_input.setVisible(False) + self.admin_pw_label.setVisible(False) + self.admin_pw_input.setVisible(False) + self.user_id_label.setVisible(True) + self.user_id_input.setVisible(True) + self.user_pw_label.setVisible(True) + self.user_pw_input.setVisible(True) + + def start_browser(self): + """크롬 브라우저 실행 후 로그인""" + self.logger.debug('크롬 브라우저를 실행합니다...') + self.browser_controller.start_browser() + + # 관리자 토글 상태에 따라 로그인 + + if self.admin_toggle.isChecked(): + admin_id = self.admin_id_input.text() + admin_pw = self.admin_pw_input.text() + user_id = self.user_id_input.text() + user_pw = self.user_pw_input.text() + self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=True) + else: + admin_id = self.admin_id_input.text() + admin_pw = self.admin_pw_input.text() + user_id = self.user_id_input.text() + user_pw = self.user_pw_input.text() + self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=False) + + # 로그인 정보 저장 + self.save_settings() + + def save_settings(self): + """QSettings에 사용자 정보 저장""" + self.settings.setValue("admin/id", self.admin_id_input.text()) + self.settings.setValue("admin/pw", self.admin_pw_input.text()) + self.settings.setValue("user/id", self.user_id_input.text()) + self.settings.setValue("user/pw", self.user_pw_input.text()) + self.settings.setValue("admin/toggle", self.admin_toggle.isChecked()) + + def load_settings(self): + """QSettings에서 사용자 정보 불러오기""" + self.admin_id_input.setText(self.settings.value("admin/id", "")) + self.admin_pw_input.setText(self.settings.value("admin/pw", "")) + self.user_id_input.setText(self.settings.value("user/id", "")) + self.user_pw_input.setText(self.settings.value("user/pw", "")) + admin_toggle_state = self.settings.value("admin/toggle", "false") == "true" + self.admin_toggle.setChecked(admin_toggle_state) + self.on_toggle_clicked(admin_toggle_state) + + def start_translation(self): + self.logger.debug('번역 작업을 시작합니다...') + self.running = True # 번역 작업이 시작됨 + + try: + # # 1. 광고 다이얼로그가 나타날 경우 닫기 처리 + # self.logger.debug('광고 다이얼로그 닫기 처리 중...') + # self.browser_controller.close_ad_dialog_if_present() + + # 2. "신규 상품 등록" 페이지로 이동 + self.logger.debug('신규 상품 등록 페이지로 이동 중...') + self.browser_controller.go_to_new_product_page() + + # # Playwright에서 페이지 스크롤 후 "세부사항 수정 및 업로드" 버튼 수집 + # self.browser_controller.scroll_page_to_bottom() + + # 3. 각 상품에 대해 "세부사항 수정 및 업로드" 작업을 수행 + page_number = 1 + while self.running: + self.logger.debug(f'현재 페이지: {page_number}') + + # 4. 현재 페이지의 모든 "세부사항 수정 및 업로드" 버튼 찾기 + product_buttons = self.browser_controller.get_product_edit_buttons() + + if not product_buttons: + self.logger.debug('수정할 상품이 없습니다. 번역 작업을 종료합니다.') + break + + # 5. 각 상품에 대해 번역 작업 수행 + for index, button in enumerate(product_buttons, start=1): + if not self.running: + self.logger.debug('번역 작업이 중단되었습니다.') + break + + self.logger.debug(f'{index}/{len(product_buttons)}: 세부사항 수정 작업 중...') + + # 상품 수정 다이얼로그 열기 + self.browser_controller.open_product_edit_dialog(button) + + # 상세페이지 탭 클릭 + self.browser_controller.click_detail_tab() + + # 이미지 URL 추출 + image_urls = self.browser_controller.extract_image_urls() + + # 이미지 번역 작업 진행 + for url in image_urls: + if not self.running: + self.logger.debug('번역 작업이 중단되었습니다.') + break + + self.whale_translator.translate_image(url) + self.browser_controller.paste_image_in_chrome(self.base64TOImage, url) + + # 수정 후 저장 + self.logger.debug('상품 세부사항 저장 중...') + self.browser_controller.save_product_edit() + + self.logger.debug('상품 수정 완료.') + + # 6. 다음 페이지로 이동 (있으면) + if not self.browser_controller.go_to_next_page(): + self.logger.debug('더 이상 페이지가 없습니다. 작업을 종료합니다.') + break + page_number += 1 + + if self.running: + self.logger.debug('모든 상품 번역 및 저장 완료.') + self.running = False # 작업 종료 후 상태를 False로 전환 + + except Exception as e: + self.logger.debug(f'번역 작업 중 오류 발생: {str(e)}') + self.running = False + + def start_translation_by_one(self): + self.logger.debug('번역 작업을 시작합니다...') + self.running = True # 번역 작업이 시작됨 + + # Playwright에서 이미지 URL 추출 + image_urls = self.browser_controller.extract_image_urls() + + # 추출된 URL을 WhaleTranslator에 전달하여 번역 진행 + for url in image_urls: + if not self.running: # 작업이 중단되었는지 확인 + self.logger.debug('번역 작업이 중단되었습니다.') + break + + self.whale_translator.translate_image(url) + # 번역 후 크롬으로 포커스를 옮기고 이미지를 붙여넣기 + self.browser_controller.paste_image_in_chrome(self.base64TOImage) + + page = BrowserController.get_page() + page.click('button:has-text("저장하기")') # 모든 이미지 번역 완료 후 저장하기 클릭 + + if self.running: + self.logger.debug('모든 이미지 번역 및 붙여넣기 완료.') + self.running = False # 작업 종료 후 상태를 False로 전환 + + def pause_translation(self): + self.logger.debug('번역 작업을 중단합니다...') + self.running = False # 번역 작업 중단 + + def close(self): + self.logger.debug('프로그램을 종료합니다...') + self.save_settings() + self.browser_controller.close_browser() # 브라우저 종료 + self.whale_translator.close_all_virtual_desktops() + super().close() diff --git a/logger_module.py b/logger_module.py new file mode 100644 index 0000000..79b0c93 --- /dev/null +++ b/logger_module.py @@ -0,0 +1,56 @@ +import logging +import os +from logging.handlers import RotatingFileHandler +from PyQt5.QtCore import pyqtSignal, QObject + +def setup_logger(name, log_file, level=logging.DEBUG, max_bytes=10*1024*1024, backup_count=5): + """로거 설정을 위한 함수""" + formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)d - %(name)s - %(levelname)s - %(message)s') + + # RotatingFileHandler를 사용하여 로그 파일 설정 + handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=backup_count, encoding='utf-8') + handler.setFormatter(formatter) + + logger = logging.getLogger(name) + logger.setLevel(level) + logger.addHandler(handler) + + # 콘솔 로그 출력을 위한 핸들러가 이미 추가되었는지 확인 + if not any(isinstance(h, logging.StreamHandler) for h in logger.handlers): + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + console_handler.setLevel(level) + logger.addHandler(console_handler) + + return logger + +class QTextEditLogger(logging.Handler, QObject): + appendHtml = pyqtSignal(str) # HTML 메시지를 전달할 시그널 정의 + scrollToBottom = pyqtSignal() # 스크롤을 최하단으로 이동시키는 시그널 + + def __init__(self): + logging.Handler.__init__(self) + QObject.__init__(self) + + def emit(self, record): + msg = self.format(record) # 로그 레코드를 문자열로 포매팅 + + color = { + logging.DEBUG: "black", + logging.INFO: "grey", + logging.WARNING: "orange", + logging.ERROR: "red", + logging.CRITICAL: "purple", + }.get(record.levelno, "black") + + # HTML 스타일을 적용한 메시지 생성 + message = f"{msg}
" + self.appendHtml.emit(message) # HTML 메시지로 변경 + self.scrollToBottom.emit() # 스크롤 시그널 발생 + + def close(self): + self.flush() + logging.Handler.close(self) + + def flush(self): + pass # 필요 시 정리 작업 수행 diff --git a/main.py b/main.py new file mode 100644 index 0000000..b317dfa --- /dev/null +++ b/main.py @@ -0,0 +1,16 @@ +from PyQt5.QtWidgets import QApplication +from gui import TranslationApp +from logger_module import setup_logger + +def main(): + # 로깅 설정 + logger = setup_logger('default_logger', f'appTranslator.log') + + # PyQt5 앱 실행 + app = QApplication([]) + window = TranslationApp(logger) # 로거를 TranslationApp에 전달 + window.show() + app.exec_() + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dfaac63 Binary files /dev/null and b/requirements.txt differ diff --git a/toggleSwitch.py b/toggleSwitch.py new file mode 100644 index 0000000..230af5c --- /dev/null +++ b/toggleSwitch.py @@ -0,0 +1,84 @@ +from PyQt5.QtCore import Qt, QRect, QPropertyAnimation, pyqtProperty, pyqtSignal, QPoint +from PyQt5.QtGui import QPainter, QColor +from PyQt5.QtWidgets import QWidget + +class ToggleSwitch(QWidget): + clicked = pyqtSignal(bool) + + def __init__(self, parent=None): + super(ToggleSwitch, self).__init__(parent) + self.setFixedSize(60, 30) + self._checked = False + self._circle_color_checked = QColor('red') + self._circle_color_unchecked = QColor('gray') + self._background_color = QColor('white') + self._circle_pos = QPoint(0, 0) # Circle's initial position. + self.animation = QPropertyAnimation(self, b"circle_pos") + self.animation.setDuration(250) + + self._init_position() + + @pyqtProperty(QPoint) + def circle_pos(self): + return self._circle_pos + + @circle_pos.setter + def circle_pos(self, pos): + self._circle_pos = pos + self.update() + + def _init_position(self): + if self._checked: + self._circle_pos.setX(30) + else: + self._circle_pos.setX(0) + + def mousePressEvent(self, event): + if event.button() == Qt.LeftButton: + self._checked = not self._checked + self.clicked.emit(self._checked) + self._update_animation() + self.update() + super(ToggleSwitch, self).mousePressEvent(event) + + def _update_animation(self): + if self._checked: + self.animation.setStartValue(QPoint(0, 0)) + self.animation.setEndValue(QPoint(30, 0)) + else: + self.animation.setStartValue(QPoint(30, 0)) + self.animation.setEndValue(QPoint(0, 0)) + self.animation.start() + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + painter.setPen(Qt.NoPen) + painter.setBrush(self._background_color) + painter.drawRoundedRect(QRect(0, 0, 60, 30), 15, 15) + + circle_color = self._circle_color_checked if self._checked else self._circle_color_unchecked + + painter.setBrush(circle_color) + painter.drawEllipse(self._circle_pos.x(), self._circle_pos.y(), 30, 30) + + def setChecked(self, checked): + if self._checked != checked: + self._checked = checked + self._update_animation() + self.update() + + def isChecked(self): + return self._checked + + def setState(self, state): + """ToggleSwitch의 상태를 설정합니다. + + Args: + state (bool): True로 설정하면 스위치를 체크 상태로, False로 설정하면 언체크 상태로 변경합니다. + """ + if self._checked != state: + self._checked = state + self._update_animation() + self.clicked.emit(self._checked) + self.update() \ No newline at end of file diff --git a/translator.py b/translator.py new file mode 100644 index 0000000..b1f3e2c --- /dev/null +++ b/translator.py @@ -0,0 +1,20 @@ +import re +from playwright.sync_api import sync_playwright + +def fetch_image_urls(): + with sync_playwright() as p: + browser = p.chromium.launch(headless=False) + page = browser.new_page() + page.goto('https://percentry.co.kr') + # 추가적인 로그인 및 네비게이션 로직 + + # 이미지 URL 수집 + content = page.locator("div.ck-source-editing-area").inner_html() + urls = re.findall(r'src="(https://file\.percenty\.co\.kr[^"]+\.(?:jpg|jpeg|png|gif))"', content) + browser.close() + return urls + +def translate_images(app, image_urls): + for index, url in enumerate(image_urls): + app.log.append(f'{index+1}/{len(image_urls)} 이미지 번역 중...') + # 번역 로직 diff --git a/whale_translator.py b/whale_translator.py new file mode 100644 index 0000000..2e5ac98 --- /dev/null +++ b/whale_translator.py @@ -0,0 +1,172 @@ +import pyautogui +import pyperclip +import time +import win32gui, win32con +from pyvda import VirtualDesktop, get_virtual_desktops +import subprocess + +class WhaleTranslator: + def __init__(self, app, logger, debug_mode=False): + self.app = app + self.logger = logger + self.debug_mode = debug_mode + self.newtab = "about:newtab" + self.whale_window_name = "새 탭 - Whale" + self.whale_hwnd = None + + self.ensure_virtual_desktop_2_exists() + self.start_whale_browser() + self.return_to_virtual_desktop_1() + + + def start_whale_browser(self): + # Whale 브라우저 실행 + whale_path = r"C:\\Program Files\\Naver\\Naver Whale\\Application\\whale.exe" # whale.exe 경로 지정 + # 웨일을 시크릿 모드로 실행 + subprocess.Popen([whale_path, '--incognito']) + + # subprocess.Popen(["C:\\Program Files\\Naver\\Naver Whale\\Application\\whale.exe", '--incognito']) # 경로 확인 필요 + + # 창 크기 조정 + time.sleep(2) # 창이 뜰 때까지 대기 + hwnd = win32gui.FindWindow(None, self.whale_window_name) # Whale 브라우저 창 이름 + if hwnd: + win32gui.ShowWindow(hwnd, win32con.SW_NORMAL) + win32gui.SetWindowPos(hwnd, None, 0, 0, 1920, 1080, win32con.SWP_NOZORDER) + else: + self.logger.debug("Whale 창을 찾을 수 없습니다.") + + def find_whale_window(self): + """웨일 창 핸들을 찾는 메서드""" + if not self.whale_hwnd: + self.whale_hwnd = self.find_window_by_title(self.whale_window_name) + return self.whale_hwnd + + def find_window_by_title(self, window_name): + def enum_windows_callback(hwnd, result): + if win32gui.IsWindowVisible(hwnd) and window_name in win32gui.GetWindowText(hwnd): + result.append(hwnd) + result = [] + win32gui.EnumWindows(enum_windows_callback, result) + return result[0] if result else None + + def ensure_virtual_desktop_2_exists(self): + """가상 데스크톱 2가 존재하는지 확인하고, 없으면 생성""" + try: + # 현재 활성화된 가상 데스크톱 수 확인 + desktops = get_virtual_desktops() + number_of_desktops = len(desktops) + + # 가상 데스크톱 2가 존재하지 않으면 생성 + if number_of_desktops < 2: + pyautogui.hotkey('win', 'ctrl', 'd') # 새 가상데스크탑 생성 + self.logger.debug("가상 데스크톱 2가 생성되었습니다.") + time.sleep(1) + else: + self.switch_to_virtual_desktop_2() + self.close_whale_window_if_exists() + self.logger.debug("가상 데스크톱 2가 이미 존재합니다.") + + except Exception as e: + self.logger.debug(f"가상 데스크톱 확인/생성 중 오류 발생: {e}") + + + def switch_to_virtual_desktop_2(self): + """가상 데스크톱 2로 전환""" + try: + VirtualDesktop(2).go() + self.logger.debug("가상 데스크톱 2로 전환되었습니다.") + time.sleep(1) + except Exception as e: + self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}") + + def return_to_virtual_desktop_1(self): + """가상 데스크톱 1로 복귀""" + try: + VirtualDesktop(1).go() + self.logger.debug("가상 데스크톱 1로 전환되었습니다.") + time.sleep(1) + except Exception as e: + self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}") + + def translate_image(self, url): + # 가상 데스크톱 2에서 웨일 작업 수행 + self.switch_to_virtual_desktop_2() + + if self.find_whale_window(): + win32gui.ShowWindow(self.whale_hwnd, win32con.SW_RESTORE) # 웨일 창 활성화 + win32gui.SetForegroundWindow(self.whale_hwnd) + + pyautogui.moveTo(960,580) # 마우스 센터로 이동 + + pyautogui.hotkey('ctrl', 'l') # 웨일 브라우저의 주소창으로 이동 + self.enter_url(url) + + pyautogui.rightClick() + time.sleep(0.2) # 컨텍스트 메뉴 대기 + pyautogui.press('c') # 번역된 이미지 클립보드에 복사 + time.sleep(1) # 이미지 로딩 대기 + + pyautogui.rightClick() + time.sleep(0.2) # 컨텍스트 메뉴 대기 + pyautogui.press('r') # 번역 클릭 + time.sleep(5) # 번역 완료 대기 + + pyautogui.rightClick() + time.sleep(0.2) # 컨텍스트 메뉴 대기 + pyautogui.press('c') # 번역된 이미지 클립보드에 복사 + pyautogui.hotkey('ctrl', 'l') # 새 탭으로 이동 + pyautogui.typewrite(self.newtab) # URL을 입력 + self.enter_url(self.newtab) + self.logger.debug(f'번역 완료: {url}') + self.return_to_virtual_desktop_1() + else: + self.logger.debug('웨일 창을 찾을 수 없습니다.') + + def enter_url(self, url): + """입력기를 영어로 전환한 후 pyautogui로 URL 입력""" + # 입력기를 영어로 전환 (한영 전환키 사용) + pyautogui.hotkey('alt', 'shift') # 혹은 'ctrl', 'shift'를 사용할 수도 있음 + time.sleep(0.5) # 입력 모드 전환 후 잠시 대기 + + # 주소창으로 이동 후 URL 입력 + pyautogui.hotkey('ctrl', 'l') # 주소창으로 이동 + time.sleep(0.5) + pyautogui.typewrite(url) # URL 입력 + pyautogui.press('enter') # Enter 키 입력 + time.sleep(1) # 페이지 로딩 대기 + + + def close_whale_window_if_exists(self): + """'새 탭 - Whale' 창이 존재하면 종료""" + whale_window_name = "새 탭 - Whale" + whale_hwnd = self.find_window_by_title(whale_window_name) + + if whale_hwnd: + self.logger.debug(f"'{whale_window_name}' 창을 찾았습니다. 종료 중...") + win32gui.PostMessage(whale_hwnd, win32con.WM_CLOSE, 0, 0) # 창을 종료하는 메시지 전송 + time.sleep(1) + self.logger.debug(f"'{whale_window_name}' 창을 종료했습니다.") + else: + self.logger.debug(f"'{whale_window_name}' 창을 찾지 못했습니다.") + + + def close_all_virtual_desktops(self): + """모든 가상 데스크톱을 종료""" + try: + desktops = get_virtual_desktops() + number_of_desktops = len(desktops) + + # 가상 데스크톱이 1개 이상일 때만 종료 + while number_of_desktops > 1: + self.close_whale_window_if_exists() # 웨일 브라우저 창이 있으면 종료 + pyautogui.hotkey('win', 'ctrl', 'f4') # 현재 가상 데스크톱 닫기 + time.sleep(1) # 각 데스크톱 닫기 사이에 짧은 대기시간 추가 + desktops = get_virtual_desktops() + number_of_desktops = len(desktops) + self.logger.debug(f"남은 가상 데스크톱 수: {number_of_desktops}") + + self.logger.debug("모든 가상 데스크톱이 종료되었습니다.") + + except Exception as e: + self.logger.debug(f"가상 데스크톱 종료 중 오류 발생: {e}") diff --git a/win.py b/win.py new file mode 100644 index 0000000..14af560 --- /dev/null +++ b/win.py @@ -0,0 +1,15 @@ +import win32gui + +def enum_window_titles(): + def callback(hwnd, results): + title = win32gui.GetWindowText(hwnd) + if title: # 제목이 있는 창만 결과에 추가 + results.append(title) + titles = [] + win32gui.EnumWindows(callback, titles) + return titles + +# 모든 창의 제목 출력 +window_titles = enum_window_titles() +for title in window_titles: + print(title)