This commit is contained in:
R5600U_PC 2024-09-27 17:19:52 +09:00
parent 182710fb6a
commit 7b40d16f95
20 changed files with 1055 additions and 280 deletions

Binary file not shown.

Binary file not shown.

View File

@ -12073,3 +12073,771 @@ pywintypes.error: (1400, 'SetForegroundWindow', '잘못된 창 핸들입니다.'
2024-09-27 14:19:25,434 - browser_control.py:365 - default_logger - DEBUG - 소스 버튼 재 클릭 완료. 2024-09-27 14:19:25,434 - browser_control.py:365 - default_logger - DEBUG - 소스 버튼 재 클릭 완료.
2024-09-27 14:19:25,434 - gui.py:495 - default_logger - DEBUG - 현재 상품의 총 이미지 수 : 12개 2024-09-27 14:19:25,434 - gui.py:495 - default_logger - DEBUG - 현재 상품의 총 이미지 수 : 12개
2024-09-27 14:19:25,478 - whale_translator.py:106 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다. 2024-09-27 14:19:25,478 - whale_translator.py:106 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 14:45:09,044 - whale_translator.py:106 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 14:45:10,046 - whale_translator.py:222 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 14:45:10,046 - whale_translator.py:87 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 14:45:14,994 - whale_translator.py:115 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 14:45:15,995 - vertexAI.py:16 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 14:45:15,995 - vertexAI.py:20 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 14:45:16,039 - vertexAI.py:24 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 14:45:16,039 - vertexAI.py:35 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-09-27 14:45:16,041 - vertexAI.py:38 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-09-27 14:45:16,042 - gui.py:61 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 14:45:28,995 - gui.py:242 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 14:45:28,997 - browser_control.py:27 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 14:45:32,938 - browser_control.py:42 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 14:45:32,940 - browser_control.py:47 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 14:45:32,940 - browser_control.py:54 - default_logger - DEBUG - 크롬 창 핸들: 461378
2024-09-27 14:45:34,631 - browser_control.py:60 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 14:45:34,842 - browser_control.py:78 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-09-27 14:45:36,661 - browser_control.py:253 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-09-27 14:45:36,782 - browser_control.py:259 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-09-27 14:45:47,870 - gui.py:390 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-09-27 14:45:47,877 - gui.py:395 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-09-27 14:45:48,221 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-09-27 14:45:48,221 - browser_control.py:548 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-09-27 14:45:52,344 - browser_control.py:558 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-09-27 14:45:52,344 - browser_control.py:120 - default_logger - DEBUG - 가져온 텍스트: 총 53개 상품
2024-09-27 14:45:52,344 - gui.py:414 - default_logger - DEBUG - 현재 페이지: 1
2024-09-27 14:45:52,355 - browser_control.py:548 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-09-27 14:45:53,367 - browser_control.py:558 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-09-27 14:45:53,380 - browser_control.py:292 - default_logger - DEBUG - 수정할 상품 개수: 20
2024-09-27 14:45:53,380 - gui.py:427 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-09-27 14:45:53,426 - browser_control.py:306 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-09-27 14:45:53,985 - browser_control.py:309 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-09-27 14:45:55,340 - browser_control.py:326 - default_logger - DEBUG - 옵션 탭 클릭 완료.
2024-09-27 14:45:55,541 - option.py:72 - default_logger - DEBUG - 단일 상품 여부: 옵션 상품입니다
2024-09-27 14:45:55,549 - option.py:84 - default_logger - DEBUG - 전체 옵션이 체크되어 있음
2024-09-27 14:45:55,552 - option.py:253 - default_logger - DEBUG - 가격 낮은 순 정렬을 클릭합니다.
2024-09-27 14:45:55,713 - option.py:113 - default_logger - DEBUG - 총 옵션 갯수: 9
2024-09-27 14:45:55,735 - option.py:125 - default_logger - DEBUG - 1번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:55,748 - option.py:133 - default_logger - DEBUG - 1번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:55,759 - option.py:144 - default_logger - DEBUG - 1번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:55,778 - option.py:156 - default_logger - DEBUG - 1번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/ae1785ee-7ae6-466f-8a43-c675c1b9828d.jpg"/>
2024-09-27 14:45:56,084 - option.py:172 - default_logger - DEBUG - 1번째 옵션 가격정보 수집 완료 : 284600 - 284600
2024-09-27 14:45:56,106 - option.py:125 - default_logger - DEBUG - 2번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,115 - option.py:133 - default_logger - DEBUG - 2번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,128 - option.py:144 - default_logger - DEBUG - 2번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,144 - option.py:156 - default_logger - DEBUG - 2번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/9acfa199-0dc8-4246-a294-2e8771dc2f40.jpg"/>
2024-09-27 14:45:56,159 - option.py:172 - default_logger - DEBUG - 2번째 옵션 가격정보 수집 완료 : 288700 - 288700
2024-09-27 14:45:56,182 - option.py:125 - default_logger - DEBUG - 3번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,192 - option.py:133 - default_logger - DEBUG - 3번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,198 - option.py:144 - default_logger - DEBUG - 3번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,213 - option.py:156 - default_logger - DEBUG - 3번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/62739915-704d-4616-99ab-f3217225e016.jpg"/>
2024-09-27 14:45:56,233 - option.py:172 - default_logger - DEBUG - 3번째 옵션 가격정보 수집 완료 : 288700 - 288700
2024-09-27 14:45:56,246 - option.py:125 - default_logger - DEBUG - 4번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,260 - option.py:133 - default_logger - DEBUG - 4번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,269 - option.py:144 - default_logger - DEBUG - 4번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,275 - option.py:156 - default_logger - DEBUG - 4번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/f53805fe-df0a-4f4c-87af-eca0586cfd6c.jpg"/>
2024-09-27 14:45:56,298 - option.py:172 - default_logger - DEBUG - 4번째 옵션 가격정보 수집 완료 : 305000 - 305000
2024-09-27 14:45:56,311 - option.py:125 - default_logger - DEBUG - 5번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,324 - option.py:133 - default_logger - DEBUG - 5번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,333 - option.py:144 - default_logger - DEBUG - 5번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,344 - option.py:156 - default_logger - DEBUG - 5번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/30635734-e1da-4914-bd53-ad77a31d646f.jpg"/>
2024-09-27 14:45:56,361 - option.py:172 - default_logger - DEBUG - 5번째 옵션 가격정보 수집 완료 : 305000 - 305000
2024-09-27 14:45:56,377 - option.py:125 - default_logger - DEBUG - 6번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,383 - option.py:133 - default_logger - DEBUG - 6번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,393 - option.py:144 - default_logger - DEBUG - 6번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,407 - option.py:156 - default_logger - DEBUG - 6번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/d1d171da-4794-474d-be89-95db1ee6e4e7.jpg"/>
2024-09-27 14:45:56,417 - option.py:172 - default_logger - DEBUG - 6번째 옵션 가격정보 수집 완료 : 317300 - 317300
2024-09-27 14:45:56,435 - option.py:125 - default_logger - DEBUG - 7번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,443 - option.py:133 - default_logger - DEBUG - 7번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,452 - option.py:144 - default_logger - DEBUG - 7번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,467 - option.py:156 - default_logger - DEBUG - 7번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/be03bf33-ab1f-4088-ade2-7ce844bec652.jpg"/>
2024-09-27 14:45:56,478 - option.py:172 - default_logger - DEBUG - 7번째 옵션 가격정보 수집 완료 : 344500 - 344500
2024-09-27 14:45:56,501 - option.py:125 - default_logger - DEBUG - 8번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,510 - option.py:133 - default_logger - DEBUG - 8번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,516 - option.py:144 - default_logger - DEBUG - 8번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,531 - option.py:156 - default_logger - DEBUG - 8번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/6efc8bf0-1ecb-4740-87e8-48d391a799f2.jpg"/>
2024-09-27 14:45:56,539 - option.py:172 - default_logger - DEBUG - 8번째 옵션 가격정보 수집 완료 : 344500 - 344500
2024-09-27 14:45:56,561 - option.py:125 - default_logger - DEBUG - 9번째 옵션명 수집완료. 나머지 필드 수집중...
2024-09-27 14:45:56,564 - option.py:133 - default_logger - DEBUG - 9번째 옵션편집필드 수집 완료 : JSHandle@node
2024-09-27 14:45:56,580 - option.py:144 - default_logger - DEBUG - 9번째 옵션 체크박스 수집 완료 : JSHandle@node
2024-09-27 14:45:56,593 - option.py:156 - default_logger - DEBUG - 9번째 옵션 이미지 수집 완료 : JSHandle@<img class="sc-gbvfcU ezktkd" src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37eb473994c46d385c450/ba464fee-a24b-4bf3-9e5f-77045cb05747.jpg"/>
2024-09-27 14:45:56,620 - option.py:172 - default_logger - DEBUG - 9번째 옵션 가격정보 수집 완료 : 469600 - 469600
2024-09-27 14:45:56,622 - option.py:35 - default_logger - DEBUG - 수집된 원본 옵션 정보: {'origin_option_1': 'QQ-700电动泵手扳开关带保压设计', 'origin_option_2': '特价QQ-700蓝油箱配手按开关', 'origin_option_3': '特价QQ-700蓝油箱配脚踏开关', 'origin_option_4': 'QQ-700220V配手按开关', 'origin_option_5': 'QQ-700220V配脚踏开关', 'origin_option_6': 'HHB-700A电磁阀泵 220V配脚踏开关', 'origin_option_7': 'QQ-700110V配脚踏开关', 'origin_option_8': 'QQ-700110V配手按开关', 'origin_option_9': 'QQ-700遥控版手按开关'}
2024-09-27 14:45:56,931 - vertexAI.py:83 - default_logger - DEBUG - 옵션 데이터를 번역 중: {'origin_option_1': 'QQ-700电动泵手扳开关带保压设计', 'origin_option_2': '特价QQ-700蓝油箱配手按开关', 'origin_option_3': '特价QQ-700蓝油箱配脚踏开关', 'origin_option_4': 'QQ-700220V配手按开关', 'origin_option_5': 'QQ-700220V配脚踏开关', 'origin_option_6': 'HHB-700A电磁阀泵 220V配脚踏开关', 'origin_option_7': 'QQ-700110V配脚踏开关', 'origin_option_8': 'QQ-700110V配手按开关', 'origin_option_9': 'QQ-700遥控版手按开关'}
2024-09-27 14:45:56,931 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700电动泵手扳开关带保压设计
2024-09-27 14:45:56,935 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,935 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,935 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,935 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,935 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 电
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 动
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 泵
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 手
2024-09-27 14:45:56,939 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 扳
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 带
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 保
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 压
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 设
2024-09-27 14:45:56,942 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 计
2024-09-27 14:45:56,946 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700电动泵手扳开关带保压设计
2024-09-27 14:45:56,946 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: 特价QQ-700蓝油箱配手按开关
2024-09-27 14:45:56,946 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 特
2024-09-27 14:45:56,946 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 价
2024-09-27 14:45:56,946 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,949 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,949 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,950 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,950 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,950 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,951 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 蓝
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 油
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 箱
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 手
2024-09-27 14:45:56,951 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 按
2024-09-27 14:45:56,956 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:56,956 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:56,957 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,957 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: 特价QQ-700蓝油箱配手按开关
2024-09-27 14:45:56,959 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: 特价QQ-700蓝油箱配脚踏开关
2024-09-27 14:45:56,959 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 特
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 价
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,960 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,966 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,966 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 蓝
2024-09-27 14:45:56,967 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 油
2024-09-27 14:45:56,967 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 箱
2024-09-27 14:45:56,967 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:56,967 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 脚
2024-09-27 14:45:56,967 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 踏
2024-09-27 14:45:56,970 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:56,970 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:56,970 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,972 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: 特价QQ-700蓝油箱配脚踏开关
2024-09-27 14:45:56,972 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700220V配手按开关
2024-09-27 14:45:56,972 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,972 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,975 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,975 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,975 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,975 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,975 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,978 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: V
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 手
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 按
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:56,979 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:56,983 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,983 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700220V配手按开关
2024-09-27 14:45:56,983 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700220V配脚踏开关
2024-09-27 14:45:56,983 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,983 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:56,986 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,986 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,986 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,986 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,986 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: V
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:56,989 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 脚
2024-09-27 14:45:56,992 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 踏
2024-09-27 14:45:56,992 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:56,992 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:56,993 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:56,993 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700220V配脚踏开关
2024-09-27 14:45:56,993 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: HHB-700A电磁阀泵 220V配脚踏开关
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: H
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: H
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: B
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:56,995 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:56,999 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: A
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 电
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 磁
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 阀
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 泵
2024-09-27 14:45:57,000 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가:
2024-09-27 14:45:57,003 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:57,003 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 2
2024-09-27 14:45:57,005 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,005 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: V
2024-09-27 14:45:57,006 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:57,006 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 脚
2024-09-27 14:45:57,008 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 踏
2024-09-27 14:45:57,008 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:57,008 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:57,008 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: HHB-700A电磁阀泵 220V配脚踏开关
2024-09-27 14:45:57,008 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700110V配脚踏开关
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,011 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,011 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,017 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 1
2024-09-27 14:45:57,017 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 1
2024-09-27 14:45:57,019 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,019 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: V
2024-09-27 14:45:57,019 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:57,019 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 脚
2024-09-27 14:45:57,021 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 踏
2024-09-27 14:45:57,021 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:57,022 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:57,022 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,023 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700110V配脚踏开关
2024-09-27 14:45:57,024 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700110V配手按开关
2024-09-27 14:45:57,025 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,025 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,025 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:57,027 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:57,027 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,027 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,027 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,029 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 1
2024-09-27 14:45:57,030 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 1
2024-09-27 14:45:57,030 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,030 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: V
2024-09-27 14:45:57,031 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 配
2024-09-27 14:45:57,031 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 手
2024-09-27 14:45:57,032 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 按
2024-09-27 14:45:57,032 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:57,032 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:57,034 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,034 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700110V配手按开关
2024-09-27 14:45:57,034 - vertexAI.py:55 - default_logger - DEBUG - 텍스트에서 특수 문자를 정리 중: QQ-700遥控版手按开关
2024-09-27 14:45:57,034 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,034 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: Q
2024-09-27 14:45:57,034 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: -
2024-09-27 14:45:57,034 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 7
2024-09-27 14:45:57,034 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,039 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 0
2024-09-27 14:45:57,040 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 遥
2024-09-27 14:45:57,040 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 控
2024-09-27 14:45:57,041 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 版
2024-09-27 14:45:57,041 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,041 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 手
2024-09-27 14:45:57,043 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 按
2024-09-27 14:45:57,043 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 开
2024-09-27 14:45:57,043 - vertexAI.py:70 - default_logger - DEBUG - 허용된 문자 추가: 关
2024-09-27 14:45:57,044 - vertexAI.py:66 - default_logger - DEBUG - 허용되지 않은 문자 제거:
2024-09-27 14:45:57,044 - vertexAI.py:73 - default_logger - DEBUG - 정리된 텍스트: QQ-700遥控版手按开关
2024-09-27 14:45:57,044 - vertexAI.py:87 - default_logger - DEBUG - 정리된 옵션 데이터: {'origin_option_1': 'QQ-700电动泵手扳开关带保压设计', 'origin_option_2': '特价QQ-700蓝油箱配手按开关', 'origin_option_3': '特价QQ-700蓝油箱配脚踏开关', 'origin_option_4': 'QQ-700220V配手按开关', 'origin_option_5': 'QQ-700220V配脚踏开关', 'origin_option_6': 'HHB-700A电磁阀泵 220V配脚踏开关', 'origin_option_7': 'QQ-700110V配脚踏开关', 'origin_option_8': 'QQ-700110V配手按开关', 'origin_option_9': 'QQ-700遥控版手按开关'}
2024-09-27 14:45:57,044 - vertexAI.py:92 - default_logger - DEBUG - 생성된 프롬프트: 질문은 아래와 같아.
가공방법
1. 특수문자가 있을 경우 제거해줘.
2. 원본 상품명을 참고해서, 각 옵션의 이름을 최대한 간결하게, 각 옵션의 특징(제품의 스펙을 나타내는 크기,무게,용량,전압,전류,상품코드등)만 남겨줘.
3. 간결하게 만들어진 각 옵션명을 한국어로 일관되게 번역해줘.
4. 번역된 옵션 이름 중 같은 이름의 옵션이 있을 경우, 해당옵션들만 원본옵션명에서 특징들을 다시 추출해서 추가해줘.
5. 가격문의, 문의사항, 견적, 견적문의, 예약금, 선결제, 고객센터 연락 등 옵션명을 바로 알려주지 않고 고객에게 연락을 유도하는 옵션명은 삭제해야 해.
6. 번역된 옵션명들은 'trans_option_1': '', 'trans_option_2': '', 'trans_option_3': '', 'trans_option_4': '' 와 같은 형식(json)으로 반환해줘.
원본 데이터
{"origin_option_1": "QQ-700电动泵手扳开关带保压设计", "origin_option_2": "特价QQ-700蓝油箱配手按开关", "origin_option_3": "特价QQ-700蓝油箱配脚踏开关", "origin_option_4": "QQ-700220V配手按开关", "origin_option_5": "QQ-700220V配脚踏开关", "origin_option_6": "HHB-700A电磁阀泵 220V配脚踏开关", "origin_option_7": "QQ-700110V配脚踏开关", "origin_option_8": "QQ-700110V配手按开关", "origin_option_9": "QQ-700遥控版手按开关"}
2024-09-27 14:45:57,044 - vertexAI.py:95 - default_logger - DEBUG - Vertex AI 모델에 프롬프트를 전달하여 응답을 기다리는 중...
2024-09-27 14:45:59,223 - vertexAI.py:97 - default_logger - DEBUG - 모델 응답: ```json
{
"trans_option_1": "QQ-700 220V 수동",
"trans_option_2": "QQ-700 220V 발판",
"trans_option_3": "QQ-700 110V 발판",
"trans_option_4": "QQ-700 110V 수동",
"trans_option_5": "QQ-700 리모컨 수동",
"trans_option_6": "QQ-700 블루 탱크 수동",
"trans_option_7": "QQ-700 블루 탱크 발판",
"trans_option_8": "HHB-700A 220V 발판"
}
```
2024-09-27 14:45:59,225 - vertexAI.py:104 - default_logger - DEBUG - 응답에서 추출된 JSON 텍스트: {
"trans_option_1": "QQ-700 220V 수동",
"trans_option_2": "QQ-700 220V 발판",
"trans_option_3": "QQ-700 110V 발판",
"trans_option_4": "QQ-700 110V 수동",
"trans_option_5": "QQ-700 리모컨 수동",
"trans_option_6": "QQ-700 블루 탱크 수동",
"trans_option_7": "QQ-700 블루 탱크 발판",
"trans_option_8": "HHB-700A 220V 발판"
}
2024-09-27 14:45:59,227 - vertexAI.py:107 - default_logger - DEBUG - 번역된 데이터: {'trans_option_1': 'QQ-700 220V 수동', 'trans_option_2': 'QQ-700 220V 발판', 'trans_option_3': 'QQ-700 110V 발판', 'trans_option_4': 'QQ-700 110V 수동', 'trans_option_5': 'QQ-700 리모컨 수동', 'trans_option_6': 'QQ-700 블루 탱크 수동', 'trans_option_7': 'QQ-700 블루 탱크 발판', 'trans_option_8': 'HHB-700A 220V 발판'}
2024-09-27 14:45:59,228 - option.py:37 - default_logger - DEBUG - 번역된 옵션 정보: {'trans_option_1': 'QQ-700 220V 수동', 'trans_option_2': 'QQ-700 220V 발판', 'trans_option_3': 'QQ-700 110V 발판', 'trans_option_4': 'QQ-700 110V 수동', 'trans_option_5': 'QQ-700 리모컨 수동', 'trans_option_6': 'QQ-700 블루 탱크 수동', 'trans_option_7': 'QQ-700 블루 탱크 발판', 'trans_option_8': 'HHB-700A 220V 발판'}
2024-09-27 14:45:59,230 - option.py:40 - default_logger - DEBUG - 번역된 옵션명을 입력합니다.
2024-09-27 14:45:59,230 - option.py:189 - default_logger - DEBUG - trans_option_1번째 translated_name : QQ-700 220V 수동
2024-09-27 14:45:59,231 - option.py:197 - default_logger - DEBUG - trans_option_1번째 번역옵션 필드 : JSHandle@<input type="text" value="QQ-700 전동펌프 수동 스위치" class="ant-input css-1li46mu"/>
2024-09-27 14:45:59,249 - option.py:201 - default_logger - DEBUG - trans_option_1번째 translated_name : [QQ-700 220V 수동] 입력 완료
2024-09-27 14:45:59,249 - option.py:189 - default_logger - DEBUG - trans_option_2번째 translated_name : QQ-700 220V 발판
2024-09-27 14:45:59,250 - option.py:197 - default_logger - DEBUG - trans_option_2번째 번역옵션 필드 : JSHandle@<input type="text" class="ant-input css-1li46mu" value="QQ-700 블루 오일탱크 수동 스위치"/>
2024-09-27 14:45:59,276 - option.py:201 - default_logger - DEBUG - trans_option_2번째 translated_name : [QQ-700 220V 발판] 입력 완료
2024-09-27 14:45:59,277 - option.py:189 - default_logger - DEBUG - trans_option_3번째 translated_name : QQ-700 110V 발판
2024-09-27 14:45:59,277 - option.py:197 - default_logger - DEBUG - trans_option_3번째 번역옵션 필드 : JSHandle@<input type="text" class="ant-input css-1li46mu" value="QQ-700 블루 오일탱크 발판 스위치"/>
2024-09-27 14:45:59,305 - option.py:201 - default_logger - DEBUG - trans_option_3번째 translated_name : [QQ-700 110V 발판] 입력 완료
2024-09-27 14:45:59,305 - option.py:189 - default_logger - DEBUG - trans_option_4번째 translated_name : QQ-700 110V 수동
2024-09-27 14:45:59,306 - option.py:197 - default_logger - DEBUG - trans_option_4번째 번역옵션 필드 : JSHandle@<input type="text" value="QQ-700 220V 수동 스위치" class="ant-input css-1li46mu"/>
2024-09-27 14:45:59,333 - option.py:201 - default_logger - DEBUG - trans_option_4번째 translated_name : [QQ-700 110V 수동] 입력 완료
2024-09-27 14:45:59,334 - option.py:189 - default_logger - DEBUG - trans_option_5번째 translated_name : QQ-700 리모컨 수동
2024-09-27 14:45:59,335 - option.py:197 - default_logger - DEBUG - trans_option_5번째 번역옵션 필드 : JSHandle@<input type="text" value="QQ-700 220V 발판 스위치" class="ant-input css-1li46mu"/>
2024-09-27 14:45:59,379 - option.py:201 - default_logger - DEBUG - trans_option_5번째 translated_name : [QQ-700 리모컨 수동] 입력 완료
2024-09-27 14:45:59,379 - option.py:189 - default_logger - DEBUG - trans_option_6번째 translated_name : QQ-700 블루 탱크 수동
2024-09-27 14:45:59,379 - option.py:197 - default_logger - DEBUG - trans_option_6번째 번역옵션 필드 : JSHandle@<input type="text" class="ant-input css-1li46mu" value="HHB-700A 전자밸브 펌프 220V 발판 스위치"/>
2024-09-27 14:45:59,407 - option.py:201 - default_logger - DEBUG - trans_option_6번째 translated_name : [QQ-700 블루 탱크 수동] 입력 완료
2024-09-27 14:45:59,407 - option.py:189 - default_logger - DEBUG - trans_option_7번째 translated_name : QQ-700 블루 탱크 발판
2024-09-27 14:45:59,413 - option.py:197 - default_logger - DEBUG - trans_option_7번째 번역옵션 필드 : JSHandle@<input type="text" value="QQ-700 110V 발판 스위치" class="ant-input css-1li46mu"/>
2024-09-27 14:45:59,446 - option.py:201 - default_logger - DEBUG - trans_option_7번째 translated_name : [QQ-700 블루 탱크 발판] 입력 완료
2024-09-27 14:45:59,446 - option.py:189 - default_logger - DEBUG - trans_option_8번째 translated_name : HHB-700A 220V 발판
2024-09-27 14:45:59,446 - option.py:197 - default_logger - DEBUG - trans_option_8번째 번역옵션 필드 : JSHandle@<input type="text" value="QQ-700 110V 수동 스위치" class="ant-input css-1li46mu"/>
2024-09-27 14:45:59,472 - option.py:201 - default_logger - DEBUG - trans_option_8번째 translated_name : [HHB-700A 220V 발판] 입력 완료
2024-09-27 14:45:59,472 - option.py:213 - default_logger - DEBUG - 옵션이 3개 이상이므로 가장 낮은 옵션을 체크 해제합니다.
2024-09-27 14:45:59,742 - option.py:253 - default_logger - DEBUG - 가격 낮은 순 정렬을 클릭합니다.
2024-09-27 14:46:00,381 - option.py:50 - default_logger - DEBUG - 저장 버튼을 클릭합니다.
2024-09-27 14:46:00,685 - option.py:53 - default_logger - DEBUG - 옵션 처리 완료.
2024-09-27 14:46:01,009 - option.py:261 - default_logger - DEBUG - 옵션 수정 내용 저장 완료.
2024-09-27 14:46:01,392 - browser_control.py:318 - default_logger - DEBUG - 상세페이지 탭 클릭 완료.
2024-09-27 14:46:01,586 - browser_control.py:335 - default_logger - DEBUG - 소스 버튼 클릭 완료.
2024-09-27 14:46:01,607 - browser_control.py:343 - default_logger - DEBUG - 추출된 이미지 URL 수: 12
2024-09-27 14:46:01,609 - browser_control.py:346 - default_logger - DEBUG - img 태그를 삭제 중...
2024-09-27 14:46:01,634 - browser_control.py:357 - default_logger - DEBUG - Updated data-value:
2024-09-27 14:46:01,634 - browser_control.py:360 - default_logger - DEBUG - img 태그 삭제 완료.
2024-09-27 14:46:01,757 - browser_control.py:365 - default_logger - DEBUG - 소스 버튼 재 클릭 완료.
2024-09-27 14:46:01,762 - gui.py:495 - default_logger - DEBUG - 현재 상품의 총 이미지 수 : 12개
2024-09-27 14:46:01,821 - whale_translator.py:106 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 14:46:17,444 - whale_translator.py:150 - default_logger - DEBUG - 번역 완료: https://img.alicdn.com/imgextra/i2/143741434/O1CN01Lsea7w1MSoh2hy0Nx_!!143741434.png?v=1641956906350_Q75.jpg
2024-09-27 14:46:17,492 - whale_translator.py:115 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 14:46:18,495 - browser_control.py:444 - default_logger - DEBUG - 크롬 창으로 포커스 이동.
2024-09-27 14:46:18,495 - browser_control.py:445 - default_logger - DEBUG - 크롬 창으로 포커스 이동.
2024-09-27 14:46:18,502 - clipboardImageManager.py:176 - default_logger - INFO - 클립보드 이미지 확인
2024-09-27 14:46:18,537 - clipboardImageManager.py:180 - default_logger - DEBUG - 클립보드에 있는 이미지 크기: 750px
2024-09-27 14:46:18,537 - clipboardImageManager.py:183 - default_logger - DEBUG - 이미지 가로 크기 200픽셀 이상: 크롭 진행 중...
2024-09-27 14:46:18,607 - clipboardImageManager.py:253 - default_logger - DEBUG - 크롭 전 이미지 저장됨: H:\py\autoTrans\original_image_20240927_144618.png
2024-09-27 14:46:18,679 - clipboardImageManager.py:266 - default_logger - DEBUG - 1% 크롭된 이미지 저장됨: H:\py\autoTrans\cropped_image_1_20240927_144618.png
2024-09-27 14:46:18,745 - clipboardImageManager.py:266 - default_logger - DEBUG - 2% 크롭된 이미지 저장됨: H:\py\autoTrans\cropped_image_2_20240927_144618.png
2024-09-27 14:46:18,807 - clipboardImageManager.py:266 - default_logger - DEBUG - 3% 크롭된 이미지 저장됨: H:\py\autoTrans\cropped_image_3_20240927_144618.png
2024-09-27 14:46:18,807 - clipboardImageManager.py:281 - default_logger - DEBUG - 이미지가 클립보드에 저장되었습니다.
2024-09-27 14:46:19,040 - browser_control.py:389 - default_logger - DEBUG - 이미지 붙여넣기 완료.
2024-09-27 14:46:19,040 - browser_control.py:390 - default_logger - DEBUG - 이미지 붙여넣기 완료로 클립보드 비우기.
2024-09-27 14:46:19,040 - clipboardImageManager.py:232 - default_logger - DEBUG - 클립보드가 비워졌습니다.
2024-09-27 14:46:19,091 - whale_translator.py:106 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:25:40,808 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:25:40,808 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:25:40,819 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:25:40,819 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:25:40,951 - whale_translator.py:110 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:25:41,052 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:25:44,203 - whale_translator.py:220 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:25:45,229 - whale_translator.py:223 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:25:45,229 - whale_translator.py:91 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:25:46,609 - whale_translator.py:60 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 15:28:57,820 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:28:57,820 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:28:57,830 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:28:57,831 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:28:58,023 - whale_translator.py:86 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 15:28:58,136 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:35:24,891 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:35:24,891 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:35:24,903 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:35:24,904 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:35:25,101 - whale_translator.py:120 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:35:25,120 - whale_translator.py:120 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:35:25,164 - whale_translator.py:129 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:35:26,103 - whale_translator.py:230 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:35:26,136 - whale_translator.py:236 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:35:26,136 - whale_translator.py:101 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:35:29,343 - whale_translator.py:233 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:35:29,343 - whale_translator.py:101 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:35:31,799 - whale_translator.py:129 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:39:15,791 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:39:16,117 - whale_translator.py:117 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:39:16,419 - whale_translator.py:101 - default_logger - DEBUG - 가상 데스크톱 확인/생성 중 오류 발생: object NoneType can't be used in 'await' expression
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 96, in ensure_virtual_desktop_2_exists
await self.switch_to_virtual_desktop_2()
TypeError: object NoneType can't be used in 'await' expression
2024-09-27 15:39:22,084 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:40:31,460 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:40:31,760 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:40:31,761 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:40:31,772 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:40:31,773 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:42:20,757 - whale_translator.py:117 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:42:21,068 - whale_translator.py:227 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:42:22,070 - whale_translator.py:230 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:42:22,070 - whale_translator.py:98 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:42:22,095 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:42:22,397 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:42:22,397 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:42:22,404 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:42:22,404 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:42:46,004 - whale_translator.py:117 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:42:46,306 - whale_translator.py:233 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:42:46,306 - whale_translator.py:98 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:42:46,306 - whale_translator.py:117 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:42:46,610 - whale_translator.py:233 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:42:46,610 - whale_translator.py:98 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:42:52,283 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:42:52,584 - whale_translator.py:126 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:42:52,885 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:42:52,885 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:42:52,897 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:42:52,897 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:43:51,323 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:43:51,623 - whale_translator.py:228 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:43:52,626 - whale_translator.py:231 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:43:52,626 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:43:52,628 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:43:52,930 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:43:52,930 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:43:58,150 - whale_translator.py:64 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 15:43:58,171 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:43:58,473 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:43:58,774 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:43:58,774 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:43:58,788 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:43:58,788 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:45:03,863 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:45:04,165 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:45:04,165 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:45:04,170 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:45:04,470 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:45:04,470 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:45:09,732 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:45:10,034 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:45:10,336 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:45:10,336 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:45:10,349 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:45:10,350 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:46:25,745 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:46:26,048 - whale_translator.py:228 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:46:27,051 - whale_translator.py:231 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:46:27,051 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:46:27,051 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:46:27,355 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:46:27,355 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:46:32,586 - whale_translator.py:64 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 15:46:32,610 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:46:32,912 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:46:33,214 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:46:33,214 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:46:33,223 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:46:33,223 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:46:46,800 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:46:47,101 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:46:47,101 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:46:47,105 - whale_translator.py:118 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:46:47,406 - whale_translator.py:234 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:46:47,406 - whale_translator.py:99 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:46:52,650 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:46:52,961 - whale_translator.py:127 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:46:53,264 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:46:53,264 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:46:53,271 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:46:53,280 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:53:52,576 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:53:52,879 - whale_translator.py:229 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 찾았습니다. 종료 중...
2024-09-27 15:53:53,881 - whale_translator.py:232 - default_logger - DEBUG - '새 시크릿 탭 - Whale' 창을 종료했습니다.
2024-09-27 15:53:53,881 - whale_translator.py:100 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:53:53,883 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:53:54,184 - whale_translator.py:235 - default_logger - DEBUG - '새 탭 - Whale' 또는 '새 시크릿 탭 - Whale' 창을 찾지 못했습니다.
2024-09-27 15:53:54,184 - whale_translator.py:100 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:53:54,191 - whale_translator.py:42 - default_logger - DEBUG - Whale 브라우저 실행, PID: 6176
2024-09-27 15:56:44,002 - whale_translator.py:111 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 15:56:45,003 - whale_translator.py:135 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:56:45,306 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 확인/생성 중 오류 발생: 'WhaleTranslator' object has no attribute 'find_window_by_title'
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 115, in ensure_virtual_desktop_2_exists
self.close_whale_window_if_exists()
File "H:\py\autoTrans\whale_translator.py", line 236, in close_whale_window_if_exists
whale_hwnd = self.find_window_by_title(whale_window_name)
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'WhaleTranslator' object has no attribute 'find_window_by_title'
2024-09-27 15:56:45,311 - whale_translator.py:42 - default_logger - DEBUG - Whale 브라우저 실행, PID: 24964
2024-09-27 15:56:48,426 - whale_translator.py:64 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 15:56:48,445 - whale_translator.py:144 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:56:48,751 - whale_translator.py:144 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:56:49,052 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:56:49,052 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:56:49,063 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:56:49,063 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 15:58:40,566 - whale_translator.py:135 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:58:40,873 - whale_translator.py:255 - default_logger - ERROR - 웨일 창을 종료하는 중 오류 발생: 'WhaleTranslator' object has no attribute 'whale_pid'
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 233, in close_whale_window_if_exists
if not self.whale_pid:
^^^^^^^^^^^^^^
AttributeError: 'WhaleTranslator' object has no attribute 'whale_pid'
2024-09-27 15:58:40,873 - whale_translator.py:116 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:58:40,873 - whale_translator.py:135 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 15:58:41,176 - whale_translator.py:255 - default_logger - ERROR - 웨일 창을 종료하는 중 오류 발생: 'WhaleTranslator' object has no attribute 'whale_pid'
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 233, in close_whale_window_if_exists
if not self.whale_pid:
^^^^^^^^^^^^^^
AttributeError: 'WhaleTranslator' object has no attribute 'whale_pid'
2024-09-27 15:58:41,177 - whale_translator.py:116 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 15:58:41,181 - whale_translator.py:42 - default_logger - DEBUG - Whale 브라우저 실행, PID: 24376
2024-09-27 15:58:44,296 - whale_translator.py:64 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 15:58:44,314 - whale_translator.py:144 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:58:44,619 - whale_translator.py:144 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 15:58:44,920 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 15:58:44,920 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 15:58:44,931 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 15:58:44,932 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:01:32,583 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:01:32,885 - whale_translator.py:258 - default_logger - ERROR - 웨일 창을 종료하는 중 오류 발생: 'WhaleTranslator' object has no attribute 'whale_pid'
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 236, in close_whale_window_if_exists
if not self.whale_pid:
^^^^^^^^^^^^^^
AttributeError: 'WhaleTranslator' object has no attribute 'whale_pid'
2024-09-27 16:01:32,885 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:01:32,887 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:01:33,188 - whale_translator.py:258 - default_logger - ERROR - 웨일 창을 종료하는 중 오류 발생: 'WhaleTranslator' object has no attribute 'whale_pid'
Traceback (most recent call last):
File "H:\py\autoTrans\whale_translator.py", line 236, in close_whale_window_if_exists
if not self.whale_pid:
^^^^^^^^^^^^^^
AttributeError: 'WhaleTranslator' object has no attribute 'whale_pid'
2024-09-27 16:01:33,188 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:01:33,191 - whale_translator.py:45 - default_logger - DEBUG - Whale 브라우저 실행, PID: 13748
2024-09-27 16:01:36,307 - whale_translator.py:67 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 16:01:36,331 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:01:36,636 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:01:36,938 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:01:36,938 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:01:36,947 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:01:36,947 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:02:19,598 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:02:19,900 - whale_translator.py:237 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 16:02:19,900 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:02:19,900 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:02:20,203 - whale_translator.py:237 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 16:02:20,203 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:02:20,205 - whale_translator.py:45 - default_logger - DEBUG - Whale 브라우저 실행, PID: 16764
2024-09-27 16:02:23,324 - whale_translator.py:67 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 16:02:23,350 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:02:23,651 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:02:23,953 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:02:23,953 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:02:23,963 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:02:23,965 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:02:58,996 - whale_translator.py:114 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 16:03:00,000 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:03:00,301 - whale_translator.py:237 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 16:03:00,301 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:03:00,304 - whale_translator.py:45 - default_logger - DEBUG - Whale 브라우저 실행, PID: 17060
2024-09-27 16:03:03,421 - whale_translator.py:67 - default_logger - DEBUG - Whale 창을 찾을 수 없습니다.
2024-09-27 16:03:03,440 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:03:03,746 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:03:04,046 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:03:04,046 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:03:04,052 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:03:04,052 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:11:20,099 - whale_translator.py:138 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:11:20,400 - whale_translator.py:237 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 16:11:20,400 - whale_translator.py:119 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:11:20,428 - whale_translator.py:147 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:11:20,730 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:11:20,730 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:11:20,736 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:11:20,736 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:13:06,527 - whale_translator.py:134 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 16:13:06,829 - whale_translator.py:233 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 16:13:06,829 - whale_translator.py:115 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 16:13:06,865 - whale_translator.py:143 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 16:13:07,167 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:13:07,167 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:13:07,178 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:13:07,179 - gui.py:67 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:17:29,068 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:17:29,068 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:17:29,082 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:17:29,083 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:17:49,737 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:17:49,739 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:17:49,748 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:17:49,748 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:22:38,328 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:22:38,328 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:22:38,333 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:22:38,333 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:35:07,951 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:35:07,956 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:35:07,960 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:35:07,960 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:35:34,735 - gui.py:489 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 16:35:34,738 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 16:35:42,633 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:35:42,633 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:35:42,643 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:35:42,644 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:36:48,758 - gui.py:489 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 16:36:48,761 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 16:37:15,621 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:37:15,621 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:37:15,632 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:37:15,634 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:37:19,186 - gui.py:489 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 16:37:19,188 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 16:37:44,031 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 16:37:44,031 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 16:37:44,041 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 16:37:44,041 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 16:37:51,341 - gui.py:489 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 16:37:51,344 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:01:55,241 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:01:55,241 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:01:55,251 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:01:55,252 - gui.py:68 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:04:59,793 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:04:59,793 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:04:59,797 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:04:59,797 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:05:03,424 - gui.py:490 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:05:03,426 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:06:29,320 - whale_translator.py:89 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 17:07:00,925 - whale_translator.py:113 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 17:07:01,229 - whale_translator.py:212 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 17:07:01,230 - whale_translator.py:94 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 17:07:01,232 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 9592
2024-09-27 17:07:03,278 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:07:15,727 - whale_translator.py:113 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 17:07:16,028 - whale_translator.py:212 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 17:07:16,028 - whale_translator.py:94 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 17:07:16,031 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 17896
2024-09-27 17:07:18,060 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:07:18,378 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:07:18,378 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:07:18,386 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:07:18,389 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:07:42,451 - whale_translator.py:113 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 17:07:42,752 - whale_translator.py:212 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 17:07:42,752 - whale_translator.py:94 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 17:07:42,755 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 16000
2024-09-27 17:07:44,794 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:07:45,110 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:07:45,110 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:07:45,119 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:07:45,121 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:08:19,466 - gui.py:490 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:08:19,472 - whale_translator.py:230 - default_logger - DEBUG - 웨일 창을 찾을 수 없습니다.
2024-09-27 17:08:20,577 - whale_translator.py:248 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1
2024-09-27 17:08:20,578 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:10:02,955 - whale_translator.py:89 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 17:10:03,961 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 27276
2024-09-27 17:10:06,002 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:10:06,320 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:10:06,320 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:10:06,328 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:10:06,328 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:10:08,785 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:10:08,787 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:10:08,787 - browser_control.py:27 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:11:11,189 - gui.py:502 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:11:11,191 - whale_translator.py:230 - default_logger - DEBUG - 웨일 창을 찾을 수 없습니다.
2024-09-27 17:11:12,298 - whale_translator.py:248 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1
2024-09-27 17:11:12,298 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:11:16,131 - whale_translator.py:89 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 17:11:17,134 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 5848
2024-09-27 17:11:19,193 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:11:19,508 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:11:19,508 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:11:19,521 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:11:19,523 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:11:20,888 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:11:20,888 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:11:20,888 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:11:24,933 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:11:24,944 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:11:24,944 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 2231546
2024-09-27 17:11:53,962 - whale_translator.py:113 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 17:11:54,272 - whale_translator.py:212 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 17:11:54,272 - whale_translator.py:94 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 17:11:54,277 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 27360
2024-09-27 17:11:56,325 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:11:56,637 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:11:56,637 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:11:56,651 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:11:56,652 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:12:00,732 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:12:00,732 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:12:00,732 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:12:04,557 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:12:04,567 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:12:04,569 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 10226020
2024-09-27 17:12:05,611 - browser_control.py:61 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 17:12:25,641 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:12:25,643 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:12:25,643 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:12:29,749 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:12:29,761 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:12:29,761 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 3738120
2024-09-27 17:12:30,632 - browser_control.py:61 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 17:15:18,444 - whale_translator.py:113 - default_logger - DEBUG - 가상 데스크톱 2로 전환되었습니다.
2024-09-27 17:15:18,745 - whale_translator.py:212 - default_logger - DEBUG - 웨일 프로세스 ID가 설정되지 않았습니다.
2024-09-27 17:15:18,745 - whale_translator.py:94 - default_logger - DEBUG - 가상 데스크톱 2가 이미 존재합니다.
2024-09-27 17:15:18,749 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 4980
2024-09-27 17:15:20,782 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:15:21,096 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:15:21,097 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:15:21,107 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:15:21,108 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:15:22,817 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:15:22,819 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:15:22,819 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:15:26,767 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:15:26,777 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:15:26,780 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 11141514
2024-09-27 17:15:27,685 - browser_control.py:61 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 17:15:47,132 - gui.py:502 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:15:47,138 - whale_translator.py:230 - default_logger - DEBUG - 웨일 창을 찾을 수 없습니다.
2024-09-27 17:15:48,241 - whale_translator.py:248 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1
2024-09-27 17:15:48,242 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:16:53,166 - whale_translator.py:89 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 17:16:54,167 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 8164
2024-09-27 17:16:56,399 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:16:56,723 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:16:56,723 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:16:56,736 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:16:56,741 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:16:58,085 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:16:58,087 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:16:58,087 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:17:02,363 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:17:02,372 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:17:02,375 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 1771492
2024-09-27 17:17:03,770 - browser_control.py:61 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 17:17:18,802 - gui.py:502 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:17:18,808 - whale_translator.py:230 - default_logger - DEBUG - 웨일 창을 찾을 수 없습니다.
2024-09-27 17:17:19,912 - whale_translator.py:248 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1
2024-09-27 17:17:19,912 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.
2024-09-27 17:17:26,435 - whale_translator.py:89 - default_logger - DEBUG - 가상 데스크톱 2가 생성되었습니다.
2024-09-27 17:17:27,437 - whale_translator.py:34 - default_logger - DEBUG - Whale 브라우저 실행, PID: 21756
2024-09-27 17:17:29,486 - whale_translator.py:122 - default_logger - DEBUG - 가상 데스크톱 1로 전환되었습니다.
2024-09-27 17:17:29,806 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-09-27 17:17:29,806 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-09-27 17:17:29,818 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-09-27 17:17:29,819 - gui.py:69 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-09-27 17:17:30,971 - gui.py:256 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-09-27 17:17:30,973 - gui.py:262 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-09-27 17:17:30,973 - browser_control.py:28 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-09-27 17:17:34,581 - browser_control.py:43 - default_logger - DEBUG - newPage 로딩 ...
2024-09-27 17:17:34,593 - browser_control.py:48 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-09-27 17:17:34,594 - browser_control.py:55 - default_logger - DEBUG - 크롬 창 핸들: 338757512
2024-09-27 17:17:36,093 - browser_control.py:61 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-09-27 17:17:36,300 - browser_control.py:79 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-09-27 17:17:38,077 - browser_control.py:254 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-09-27 17:17:38,201 - browser_control.py:260 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-09-27 17:19:44,844 - gui.py:502 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-09-27 17:19:44,851 - whale_translator.py:230 - default_logger - DEBUG - 웨일 창을 찾을 수 없습니다.
2024-09-27 17:19:45,956 - whale_translator.py:248 - default_logger - DEBUG - 남은 가상 데스크톱 수: 1
2024-09-27 17:19:45,957 - whale_translator.py:250 - default_logger - DEBUG - 모든 가상 데스크톱이 종료되었습니다.

View File

@ -1,10 +1,11 @@
from playwright.sync_api import sync_playwright # from playwright.sync_api import sync_playwright
from playwright.async_api import async_playwright
import re import re
import pyautogui import pyautogui
import time import time
import win32gui, win32con import win32gui, win32con
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import pyperclip import asyncio
class BrowserController: class BrowserController:
def __init__(self, app, logger): def __init__(self, app, logger):
@ -22,28 +23,28 @@ class BrowserController:
def get_page(self): def get_page(self):
return self.page return self.page
def start_browser(self): async def start_browser(self):
"""크롬 브라우저 실행 및 페이지 로딩""" """크롬 브라우저 실행 및 페이지 로딩"""
self.logger.debug('크롬 브라우저 실행 중...') self.logger.debug('크롬 브라우저 실행 중...')
# Playwright를 수동으로 실행하여 브라우저 유지 # Playwright를 수동으로 실행하여 브라우저 유지
self.playwright = sync_playwright().start() self.playwright = await async_playwright().start()
self.browser = self.playwright.chromium.launch(headless=False) # 브라우저 비헤드리스 모드 실행 self.browser = await self.playwright.chromium.launch(headless=False) # 브라우저 비헤드리스 모드 실행
# 창 크기 설정 (1920x1080) # 창 크기 설정 (1920x1080)
context = self.browser.new_context( context = await self.browser.new_context(
viewport={"width": 1920, "height": 1080} viewport={"width": 1920, "height": 1080}
) )
# 페이지 열기 # 페이지 열기
self.page = context.new_page() self.page = await context.new_page()
# self.page.goto('https://percenty.co.kr/') # 원하는 페이지로 이동 # self.page.goto('https://percenty.co.kr/') # 원하는 페이지로 이동
self.page.goto('https://percenty.co.kr/signin') # 원하는 페이지로 이동 await self.page.goto('https://percenty.co.kr/signin') # 원하는 페이지로 이동
self.logger.debug('newPage 로딩 ...') self.logger.debug('newPage 로딩 ...')
# 사용자는 이 시점에 로그인 및 상세페이지 편집 모드로 들어감 # 사용자는 이 시점에 로그인 및 상세페이지 편집 모드로 들어감
# 페이지 제목을 가져와서 창 제목으로 활용 # 페이지 제목을 가져와서 창 제목으로 활용
page_title = self.page.title() page_title = await self.page.title()
self.logger.debug(f'페이지 제목: {page_title}') self.logger.debug(f'페이지 제목: {page_title}')
# 창 핸들 찾기 (동적으로 얻은 페이지 제목 사용) # 창 핸들 찾기 (동적으로 얻은 페이지 제목 사용)
@ -53,40 +54,40 @@ class BrowserController:
else: else:
self.logger.debug(f'크롬 창 핸들: {self.chrome_hwnd}') self.logger.debug(f'크롬 창 핸들: {self.chrome_hwnd}')
self.page.wait_for_load_state('networkidle') await self.page.wait_for_load_state('networkidle')
def login(self, admin_id, user_id, admin_password, user_password, is_admin=False): async def login(self, admin_id, user_id, admin_password, user_password, is_admin=False):
"""로그인 처리""" """로그인 처리"""
self.logger.debug(f'로그인 시도 중: {"관리자" if is_admin else "직원"} 계정') self.logger.debug(f'로그인 시도 중: {"관리자" if is_admin else "직원"} 계정')
if is_admin: if is_admin:
# 관리자 로그인 처리 # 관리자 로그인 처리
self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력 await self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력
self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', admin_password) # 관리자 비밀번호 입력 await self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', admin_password) # 관리자 비밀번호 입력
self.page.click('button:has-text("로그인 하기")') # 관리자 로그인 버튼 클릭 await self.page.click('button:has-text("로그인 하기")') # 관리자 로그인 버튼 클릭
else: else:
# 관리자 토글 버튼을 클릭해서 직원 로그인 화면 활성화 # 관리자 토글 버튼을 클릭해서 직원 로그인 화면 활성화
admin_toggle = self.page.locator('button[role="switch"]') admin_toggle = self.page.locator('button[role="switch"]')
if admin_toggle.get_attribute("aria-checked") == "true": if await admin_toggle.get_attribute("aria-checked") == "true":
admin_toggle.click() # 관리자 모드에서 직원 모드로 전환 await admin_toggle.click() # 관리자 모드에서 직원 모드로 전환
self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력 await self.page.fill('input[placeholder="이메일 주소 입력"]', admin_id) # 관리자 ID 입력
self.page.fill('input[placeholder="직원 아이디 입력"]', user_id) # 직원 ID 입력 await self.page.fill('input[placeholder="직원 아이디 입력"]', user_id) # 직원 ID 입력
self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', user_password) # 직원 비밀번호 입력 await self.page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', user_password) # 직원 비밀번호 입력
self.page.click('button:has-text("직원 로그인 하기")') # 직원 로그인 버튼 클릭 await self.page.click('button:has-text("직원 로그인 하기")') # 직원 로그인 버튼 클릭
self.logger.debug(f'로그인 완료: {"관리자" if is_admin else "직원"} 계정') self.logger.debug(f'로그인 완료: {"관리자" if is_admin else "직원"} 계정')
self.page.wait_for_load_state('networkidle') await self.page.wait_for_load_state('networkidle')
self.close_ad_if_exists() await self.close_ad_if_exists()
def close_browser(self): async def close_browser(self):
"""브라우저 종료""" """브라우저 종료"""
if self.browser: if self.browser:
self.browser.close() await self.browser.close()
self.playwright.stop() await self.playwright.stop()
self.logger.debug('브라우저 종료됨.') self.logger.debug('브라우저 종료됨.')
def find_window_by_title(self, window_name): def find_window_by_title(self, window_name):
@ -108,10 +109,10 @@ class BrowserController:
self.logger.debug('크롬 창을 찾을 수 없습니다.') self.logger.debug('크롬 창을 찾을 수 없습니다.')
def get_total_product_count(self): async def get_total_product_count(self):
try: try:
# JavaScript로 해당 요소의 텍스트를 가져옴 # JavaScript로 해당 요소의 텍스트를 가져옴
element_text = self.page.evaluate('''() => { element_text = await self.page.evaluate('''() => {
let element = document.querySelector('#root > div > div > div > div > main > div > div.sc-ezreuY.kYrYVh > div.sc-dChVcU.cRrUlt > div.sc-izQBue.dxiUJm > div > div:nth-child(1) > label > span:nth-child(2)'); let element = document.querySelector('#root > div > div > div > div > main > div > div.sc-ezreuY.kYrYVh > div.sc-dChVcU.cRrUlt > div.sc-izQBue.dxiUJm > div > div:nth-child(1) > label > span:nth-child(2)');
return element ? element.innerText : null; return element ? element.innerText : null;
}''') }''')
@ -129,17 +130,17 @@ class BrowserController:
return 0 return 0
def get_total_product_count1(self): async def get_total_product_count1(self):
"""총 상품 개수를 반환""" """총 상품 개수를 반환"""
try: try:
self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기 await self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기
total_count_css_selector = '//label/span[contains(text(),"")]' total_count_css_selector = '//label/span[contains(text(),"")]'
total_element = self.page.wait_for_selector('//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div[1]/label/span[2]', timeout=5000) total_element = await self.page.wait_for_selector('//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div[1]/label/span[2]', timeout=5000)
total_element2 = self.page.query_selector(total_count_css_selector) total_element2 = await self.page.query_selector(total_count_css_selector)
# JavaScript로 해당 요소의 텍스트를 가져옴 # JavaScript로 해당 요소의 텍스트를 가져옴
total_count_text3 = self.page.evaluate('''() => { total_count_text3 = await self.page.evaluate('''() => {
let element = document.querySelector('#root > div > div > div > div > main > div > div.sc-ezreuY.kYrYVh > div.sc-dChVcU.cRrUlt > div.sc-izQBue.dxiUJm > div > div:nth-child(1) > label > span:nth-child(2)'); let element = document.querySelector('#root > div > div > div > div > main > div > div.sc-ezreuY.kYrYVh > div.sc-dChVcU.cRrUlt > div.sc-izQBue.dxiUJm > div > div:nth-child(1) > label > span:nth-child(2)');
return element ? element.innerText : null; return element ? element.innerText : null;
}''') }''')
@ -156,27 +157,27 @@ class BrowserController:
self.logger.debug(f"총 상품 개수 수집 중 오류 발생: {e}", exc_info=True) self.logger.debug(f"총 상품 개수 수집 중 오류 발생: {e}", exc_info=True)
return 0 return 0
def get_product_name(self, index): async def get_product_name(self, index):
"""해당 상품의 이름을 가져옵니다. 오류 발생 시 '수집 오류 발생' 반환""" """해당 상품의 이름을 가져옵니다. 오류 발생 시 '수집 오류 발생' 반환"""
try: try:
product_name_xpath = f"//div[{index}]/li/div/div/div[2]/div/div/div[1]/div[1]/span[2]" product_name_xpath = f"//div[{index}]/li/div/div/div[2]/div/div/div[1]/div[1]/span[2]"
product_name_element = self.page.query_selector(product_name_xpath) product_name_element = await self.page.query_selector(product_name_xpath)
return product_name_element.inner_text().strip() return await product_name_element.inner_text().strip()
except Exception as e: except Exception as e:
self.logger.debug(f"상품명 수집 중 오류: {e}", exc_info=True) self.logger.debug(f"상품명 수집 중 오류: {e}", exc_info=True)
return "수집 오류 발생" return "수집 오류 발생"
def extract_image_urls(self): async def extract_image_urls(self):
"""HTML에서 이미지 URL 추출 및 img 태그 삭제 후 소스 버튼 다시 클릭""" """HTML에서 이미지 URL 추출 및 img 태그 삭제 후 소스 버튼 다시 클릭"""
self.logger.debug('이미지 URL을 추출 중...') self.logger.debug('이미지 URL을 추출 중...')
# 소스 버튼 클릭 # 소스 버튼 클릭
self.page.click("button[data-cke-tooltip-text='소스']") await self.page.click("button[data-cke-tooltip-text='소스']")
self.logger.debug('소스 버튼 클릭 완료.') self.logger.debug('소스 버튼 클릭 완료.')
# 'data-value' 속성 값을 추출 (textarea 요소) # 'data-value' 속성 값을 추출 (textarea 요소)
textarea = self.page.wait_for_selector('div.ck-source-editing-area') textarea = await self.page.wait_for_selector('div.ck-source-editing-area')
data_value = textarea.get_attribute("data-value") data_value = await textarea.get_attribute("data-value")
if data_value: if data_value:
self.logger.debug('data-value 속성에서 HTML 수집 완료.') self.logger.debug('data-value 속성에서 HTML 수집 완료.')
@ -187,20 +188,20 @@ class BrowserController:
# 추출된 URL 반환 # 추출된 URL 반환
self.logger.debug('img 태그를 삭제 중...') self.logger.debug('img 태그를 삭제 중...')
self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기 await self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기
# data-value 속성을 가진 요소 선택 # data-value 속성을 가진 요소 선택
data_value_element = self.page.query_selector('div.ck-source-editing-area') data_value_element = await self.page.query_selector('div.ck-source-editing-area')
new_value = "" new_value = ""
if data_value_element: if data_value_element:
# 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경) # 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경)
# self.page.evaluate('(element, value) => element.setAttribute("data-value", value)', data_value_element, new_value) # 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}")') await 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') updated_value = await data_value_element.get_attribute('data-value')
self.logger(f'Updated data-value: {updated_value}') self.logger(f'Updated data-value: {updated_value}')
else: else:
@ -210,7 +211,7 @@ class BrowserController:
self.logger.debug('img 태그 삭제 완료.') self.logger.debug('img 태그 삭제 완료.')
# 소스 버튼 다시 클릭 # 소스 버튼 다시 클릭
self.page.click("button[data-cke-tooltip-text='소스']") await self.page.click("button[data-cke-tooltip-text='소스']")
self.logger.debug('소스 버튼 재 클릭 완료.') self.logger.debug('소스 버튼 재 클릭 완료.')
return image_urls return image_urls
@ -240,7 +241,7 @@ class BrowserController:
return image_urls return image_urls
def close_ad_if_exists(self): async def close_ad_if_exists(self):
"""광고 다이얼로그가 있으면 닫기 버튼을 클릭하는 메서드""" """광고 다이얼로그가 있으면 닫기 버튼을 클릭하는 메서드"""
try: try:
@ -249,13 +250,13 @@ class BrowserController:
close_button_selector = "div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default" close_button_selector = "div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default"
# 3초 동안 다이얼로그 대기 # 3초 동안 다이얼로그 대기
self.page.wait_for_selector(dialog_selector, timeout=3000) await self.page.wait_for_selector(dialog_selector, timeout=3000)
self.logger.debug("다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.") self.logger.debug("다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.")
# 닫기 버튼 클릭 # 닫기 버튼 클릭
close_button = self.page.query_selector(close_button_selector) close_button = await self.page.query_selector(close_button_selector)
if close_button: if close_button:
close_button.click() await close_button.click()
self.logger.debug("다이얼로그를 성공적으로 닫았습니다.") self.logger.debug("다이얼로그를 성공적으로 닫았습니다.")
else: else:
self.logger.debug("닫기 버튼을 찾지 못했습니다.") self.logger.debug("닫기 버튼을 찾지 못했습니다.")
@ -264,22 +265,22 @@ class BrowserController:
# 다이얼로그가 없거나 다른 문제가 발생한 경우 # 다이얼로그가 없거나 다른 문제가 발생한 경우
self.logger.debug(f"다이얼로그가 발견되지 않았거나 오류 발생: {e}", exc_info=True) self.logger.debug(f"다이얼로그가 발견되지 않았거나 오류 발생: {e}", exc_info=True)
def go_to_new_product_page(self): async def go_to_new_product_page(self):
"""신규 상품 등록 페이지로 이동""" """신규 상품 등록 페이지로 이동"""
try: try:
self.page.click('span.ant-menu-title-content:has-text("신규 상품 등록")') await self.page.click('span.ant-menu-title-content:has-text("신규 상품 등록")')
self.logger.debug("신규 상품 등록 페이지로 이동 완료.") self.logger.debug("신규 상품 등록 페이지로 이동 완료.")
except Exception as e: except Exception as e:
self.logger.debug(f"신규 상품 등록 페이지 이동 중 오류: {e}", exc_info=True) self.logger.debug(f"신규 상품 등록 페이지 이동 중 오류: {e}", exc_info=True)
def get_product_edit_buttons(self): async def get_product_edit_buttons(self):
"""현재 페이지의 세부사항 수정 및 업로드 버튼을 찾기""" """현재 페이지의 세부사항 수정 및 업로드 버튼을 찾기"""
try: try:
# 페이지 로딩을 기다림 # 페이지 로딩을 기다림
self.page.wait_for_load_state('networkidle') # 네트워크 요청이 모두 끝날 때까지 대기 await self.page.wait_for_load_state('networkidle') # 네트워크 요청이 모두 끝날 때까지 대기
# 페이지 끝까지 스크롤하여 모든 동적 요소 로드 # 페이지 끝까지 스크롤하여 모든 동적 요소 로드
self.scroll_page_to_bottom() await self.scroll_page_to_bottom()
# # 스크롤하여 모든 버튼을 화면에 표시 (가장 하단까지 스크롤) # # 스크롤하여 모든 버튼을 화면에 표시 (가장 하단까지 스크롤)
@ -288,72 +289,72 @@ class BrowserController:
# 버튼 선택 (확실한 선택자를 사용하여 확인) # 버튼 선택 (확실한 선택자를 사용하여 확인)
buttons = self.page.locator('button:has-text("세부사항 수정 및 업로드")') buttons = self.page.locator('button:has-text("세부사항 수정 및 업로드")')
count = buttons.count() count = await buttons.count()
self.logger.debug(f"수정할 상품 개수: {count}") self.logger.debug(f"수정할 상품 개수: {count}")
# 모든 버튼을 리스트로 반환 # 모든 버튼을 리스트로 반환
return [buttons.nth(i) for i in range(count)] return [await buttons.nth(i) for i in range(count)]
except Exception as e: except Exception as e:
self.logger.debug(f"상품 수정 버튼을 찾는 중 오류: {e}", exc_info=True) self.logger.debug(f"상품 수정 버튼을 찾는 중 오류: {e}", exc_info=True)
return [] return []
def open_product_edit_dialog(self, button): async def open_product_edit_dialog(self, button):
"""상품 수정 다이얼로그 열기""" """상품 수정 다이얼로그 열기"""
try: try:
# 요소가 화면에 없을 경우 스크롤하여 보이도록 함 # 요소가 화면에 없을 경우 스크롤하여 보이도록 함
button.scroll_into_view_if_needed() await button.scroll_into_view_if_needed()
self.logger.debug("상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.") self.logger.debug("상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.")
button.click() await button.click()
self.logger.debug("세부사항 수정 다이얼로그 열기 완료.") self.logger.debug("세부사항 수정 다이얼로그 열기 완료.")
self.page.wait_for_selector('div.ant-tabs-nav') # 다이얼로그가 완전히 로딩될 때까지 기다림 await self.page.wait_for_selector('div.ant-tabs-nav') # 다이얼로그가 완전히 로딩될 때까지 기다림
except Exception as e: except Exception as e:
self.logger.debug(f"세부사항 수정 다이얼로그 열기 중 오류: {e}", exc_info=True) self.logger.debug(f"세부사항 수정 다이얼로그 열기 중 오류: {e}", exc_info=True)
def click_detail_tab(self): async def click_detail_tab(self):
"""상세페이지 탭 클릭""" """상세페이지 탭 클릭"""
try: try:
self.page.click('div.ant-tabs-tab:has-text("상세페이지")') await self.page.click('div.ant-tabs-tab:has-text("상세페이지")')
self.logger.debug("상세페이지 탭 클릭 완료.") self.logger.debug("상세페이지 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.debug(f"상세페이지 탭 클릭 중 오류: {e}", exc_info=True) self.logger.debug(f"상세페이지 탭 클릭 중 오류: {e}", exc_info=True)
def click_option_tab(self): async def click_option_tab(self):
"""상세페이지 탭 클릭""" """상세페이지 탭 클릭"""
try: try:
self.page.click('div.ant-tabs-tab:has-text("옵션")') await self.page.click('div.ant-tabs-tab:has-text("옵션")')
self.logger.debug("옵션 탭 클릭 완료.") self.logger.debug("옵션 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.debug(f"옵션 탭 클릭 중 오류: {e}", exc_info=True) self.logger.debug(f"옵션 탭 클릭 중 오류: {e}", exc_info=True)
def extract_image_urls(self): async def extract_image_urls(self):
"""상세페이지에서 이미지 URL 추출""" """상세페이지에서 이미지 URL 추출"""
try: try:
# 소스 편집 모드로 전환 # 소스 편집 모드로 전환
self.page.click('button[data-cke-tooltip-text="소스"]') await self.page.click('button[data-cke-tooltip-text="소스"]')
self.logger.debug("소스 버튼 클릭 완료.") self.logger.debug("소스 버튼 클릭 완료.")
# 'data-value' 속성 값을 추출 (textarea 요소) # 'data-value' 속성 값을 추출 (textarea 요소)
textarea = self.page.wait_for_selector('div.ck-source-editing-area') textarea = await self.page.wait_for_selector('div.ck-source-editing-area')
data_value = textarea.get_attribute("data-value") data_value = await textarea.get_attribute("data-value")
# HTML 소스에서 이미지 URL 추출 # HTML 소스에서 이미지 URL 추출
image_urls = self.fetch_image_urls(data_value) image_urls = await self.fetch_image_urls(data_value)
self.logger.debug(f'추출된 이미지 URL 수: {len(image_urls)}') self.logger.debug(f'추출된 이미지 URL 수: {len(image_urls)}')
# HTML 소스에서 이미지 URL 삭제 # HTML 소스에서 이미지 URL 삭제
self.logger.debug('img 태그를 삭제 중...') self.logger.debug('img 태그를 삭제 중...')
self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기 await self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩 완료 대기
# data-value 속성을 가진 요소 선택 # data-value 속성을 가진 요소 선택
data_value_element = self.page.query_selector('div.ck-source-editing-area') data_value_element = await self.page.query_selector('div.ck-source-editing-area')
new_value = "" new_value = ""
if data_value_element: if data_value_element:
# 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경) # 속성 변경 (원하는 텍스트로 변경하거나 ""으로 변경)
# self.page.evaluate('(element, value) => element.setAttribute("data-value", value)', data_value_element, new_value) # 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}")') await 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') updated_value = await data_value_element.get_attribute('data-value')
self.logger.debug(f'Updated data-value: {updated_value}') self.logger.debug(f'Updated data-value: {updated_value}')
else: else:
self.logger.debug('Element with data-value not found.') self.logger.debug('Element with data-value not found.')
@ -361,7 +362,7 @@ class BrowserController:
# img 태그의 class 삭제 후 다시 소스 버튼 클릭 # img 태그의 class 삭제 후 다시 소스 버튼 클릭
self.page.click('button[data-cke-tooltip-text="소스"]') await self.page.click('button[data-cke-tooltip-text="소스"]')
self.logger.debug('소스 버튼 재 클릭 완료.') self.logger.debug('소스 버튼 재 클릭 완료.')
return image_urls return image_urls
@ -369,14 +370,6 @@ class BrowserController:
self.logger.debug(f"이미지 URL 추출 중 오류: {e}", exc_info=True) self.logger.debug(f"이미지 URL 추출 중 오류: {e}", exc_info=True)
return [] 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"이미지 번역 중 오류: {e}", exc_info=True)
def paste_image_in_chrome(self, clipboardImageManager, url): def paste_image_in_chrome(self, clipboardImageManager, url):
"""크롬으로 포커스를 옮기고 클립보드의 이미지를 붙여넣고 엔터 입력""" """크롬으로 포커스를 옮기고 클립보드의 이미지를 붙여넣고 엔터 입력"""
try: try:
@ -394,35 +387,35 @@ class BrowserController:
except Exception as e: except Exception as e:
self.logger.debug(f"이미지 붙여넣기 중 오류: {e}", exc_info=True) self.logger.debug(f"이미지 붙여넣기 중 오류: {e}", exc_info=True)
def save_product_edit(self): async def save_product_edit(self):
"""상품 수정 후 저장 버튼 클릭""" """상품 수정 후 저장 버튼 클릭"""
try: try:
self.page.click('button:has-text("저장하기")') await self.page.click('button:has-text("저장하기")')
self.logger.debug("상품 수정 내용 저장 완료.") self.logger.debug("상품 수정 내용 저장 완료.")
self.page.keyboard.press("Escape") # ESC로 다이얼로그 닫기 await self.page.keyboard.press("Escape") # ESC로 다이얼로그 닫기
except Exception as e: except Exception as e:
self.logger.debug(f"저장 버튼 클릭 중 오류: {e}", exc_info=True) self.logger.debug(f"저장 버튼 클릭 중 오류: {e}", exc_info=True)
def go_to_next_page(self): async def go_to_next_page(self):
"""다음 페이지로 이동""" """다음 페이지로 이동"""
try: try:
# 현재 페이지가 몇 번째 페이지인지 확인 (클래스에 'ant-pagination-item-active'가 있는 요소) # 현재 페이지가 몇 번째 페이지인지 확인 (클래스에 'ant-pagination-item-active'가 있는 요소)
current_page = self.page.query_selector('li.ant-pagination-item.ant-pagination-item-active') current_page = await self.page.query_selector('li.ant-pagination-item.ant-pagination-item-active')
if not current_page: if not current_page:
self.logger.debug("현재 페이지 정보를 찾을 수 없습니다.") self.logger.debug("현재 페이지 정보를 찾을 수 없습니다.")
return False return False
# 현재 활성화된 페이지 번호를 가져옴 # 현재 활성화된 페이지 번호를 가져옴
current_page_number = int(current_page.get_attribute("title")) current_page_number = int(await current_page.get_attribute("title"))
next_page_number = current_page_number + 1 next_page_number = current_page_number + 1
# 다음 페이지 버튼을 찾음 (title 속성으로 다음 페이지를 찾음) # 다음 페이지 버튼을 찾음 (title 속성으로 다음 페이지를 찾음)
next_page_button = self.page.query_selector(f'li.ant-pagination-item[title="{next_page_number}"]') next_page_button = await self.page.query_selector(f'li.ant-pagination-item[title="{next_page_number}"]')
if next_page_button: if next_page_button:
next_page_button.click() # 페이지 버튼 클릭 await next_page_button.click() # 페이지 버튼 클릭
self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩이 완료될 때까지 대기 await self.page.wait_for_load_state('domcontentloaded') # 페이지 로딩이 완료될 때까지 대기
self.logger.debug(f"페이지 {next_page_number}로 이동 완료.") self.logger.debug(f"페이지 {next_page_number}로 이동 완료.")
return True return True
else: else:
@ -452,7 +445,7 @@ class BrowserController:
def scroll_with_wheel(self, direction="down", pause_time=0.5, max_scrolls=20): async def scroll_with_wheel(self, direction="down", pause_time=0.5, max_scrolls=20):
""" """
스크롤을 사용하여 페이지를 위나 아래로 천천히 스크롤. 스크롤을 사용하여 페이지를 위나 아래로 천천히 스크롤.
@ -462,7 +455,7 @@ class BrowserController:
- max_scrolls: 최대 스크롤 횟수. - max_scrolls: 최대 스크롤 횟수.
""" """
scroll_count = 0 scroll_count = 0
last_height = self.page.evaluate("document.body.scrollHeight") last_height = await self.page.evaluate("document.body.scrollHeight")
while scroll_count < max_scrolls: while scroll_count < max_scrolls:
if direction == "down": if direction == "down":
@ -474,10 +467,10 @@ class BrowserController:
else: else:
raise ValueError("direction 인자는 'down' 또는 'up'만 허용됩니다.") raise ValueError("direction 인자는 'down' 또는 'up'만 허용됩니다.")
time.sleep(pause_time) asyncio.sleep(pause_time)
# 스크롤 후 높이 확인 # 스크롤 후 높이 확인
new_height = self.page.evaluate("document.body.scrollHeight") new_height = await self.page.evaluate("document.body.scrollHeight")
# 아래로 스크롤 시, 페이지의 끝에 도달한 경우 종료 # 아래로 스크롤 시, 페이지의 끝에 도달한 경우 종료
if direction == "down" and new_height == last_height: if direction == "down" and new_height == last_height:
@ -488,14 +481,14 @@ class BrowserController:
last_height = new_height last_height = new_height
scroll_count += 1 scroll_count += 1
def collect_product_info(self): async def collect_product_info(self):
""" """
상품 정보를 수집하는 메서드 상품 정보를 수집하는 메서드
""" """
try: try:
# 페이지를 아래로 스크롤하여 모든 상품 로드 # 페이지를 아래로 스크롤하여 모든 상품 로드
self.scroll_with_wheel('down') await self.scroll_with_wheel('down')
self.scroll_with_wheel('up') await self.scroll_with_wheel('up')
product_infos = [] product_infos = []
for i in range(1, 51): # 1부터 최대 50까지 상품 처리 for i in range(1, 51): # 1부터 최대 50까지 상품 처리
@ -511,9 +504,9 @@ class BrowserController:
if product_name_element and product_price_element and product_image_element: if product_name_element and product_price_element and product_image_element:
product_info = { product_info = {
"name": product_name_element.text_content().strip(), "name": await product_name_element.text_content().strip(),
"price": product_price_element.text_content().strip(), "price": await product_price_element.text_content().strip(),
"image_url": product_image_element.get_attribute('src') "image_url": await product_image_element.get_attribute('src')
} }
self.logger.debug(f"상품 {i}: {product_info}") self.logger.debug(f"상품 {i}: {product_info}")
product_infos.append(product_info) product_infos.append(product_info)
@ -526,16 +519,16 @@ class BrowserController:
self.logger.error(f"상품 정보 수집 중 오류 발생: {e}", exc_info=True) self.logger.error(f"상품 정보 수집 중 오류 발생: {e}", exc_info=True)
return [] return []
def click_modify_button_by_text(self, index): async def click_modify_button_by_text(self, index):
"""인덱스에 해당하는 '세부사항 수정 및 업로드' 버튼 클릭""" """인덱스에 해당하는 '세부사항 수정 및 업로드' 버튼 클릭"""
try: try:
button_selector = f'(//button[span[text()="세부사항 수정 및 업로드"]])[{index}]' button_selector = f'(//button[span[text()="세부사항 수정 및 업로드"]])[{index}]'
# 버튼이 화면에 보이도록 스크롤 후 클릭 # 버튼이 화면에 보이도록 스크롤 후 클릭
button = self.page.query_selector(button_selector) button = await self.page.query_selector(button_selector)
if button: if button:
button.scroll_into_view_if_needed() await button.scroll_into_view_if_needed()
self.page.evaluate('arguments[0].click();', button) await self.page.evaluate('arguments[0].click();', button)
self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 완료') self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 완료')
else: else:
self.logger.debug(f'{index}번째 상품의 수정 버튼을 찾지 못했습니다.') self.logger.debug(f'{index}번째 상품의 수정 버튼을 찾지 못했습니다.')
@ -543,15 +536,15 @@ class BrowserController:
self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 중 오류: {str(e)}') self.logger.debug(f'{index}번째 상품의 수정 버튼 클릭 중 오류: {str(e)}')
def scroll_page_to_bottom(self, pause_time=1): async def scroll_page_to_bottom(self, pause_time=1):
"""페이지의 맨 아래까지 스크롤하여 모든 동적 요소를 로드""" """페이지의 맨 아래까지 스크롤하여 모든 동적 요소를 로드"""
self.logger.debug('페이지 스크롤 시작...') self.logger.debug('페이지 스크롤 시작...')
previous_height = self.page.evaluate("() => document.body.scrollHeight") previous_height = await self.page.evaluate("() => document.body.scrollHeight")
while True: while True:
self.page.evaluate("window.scrollBy(0, window.innerHeight);") # 한 화면씩 스크롤 await self.page.evaluate("window.scrollBy(0, window.innerHeight);") # 한 화면씩 스크롤
time.sleep(pause_time) # 페이지 로딩 대기 asyncio.sleep(pause_time) # 페이지 로딩 대기
current_height = self.page.evaluate("() => document.body.scrollHeight") current_height = await self.page.evaluate("() => document.body.scrollHeight")
if current_height == previous_height: if current_height == previous_height:
break # 더 이상 스크롤할 내용이 없으면 종료 break # 더 이상 스크롤할 내용이 없으면 종료
previous_height = current_height previous_height = current_height

View File

@ -10,6 +10,7 @@ import time
import os import os
from datetime import datetime from datetime import datetime
import random import random
import asyncio
class ClipboardImageManager: class ClipboardImageManager:
def __init__(self, app, logger, browser_controller, debug=False): def __init__(self, app, logger, browser_controller, debug=False):
@ -20,7 +21,7 @@ class ClipboardImageManager:
self.debug = True self.debug = True
def get_clipboard_data(self): async def get_clipboard_data(self):
"""클립보드의 텍스트 데이터를 가져옵니다.""" """클립보드의 텍스트 데이터를 가져옵니다."""
try: try:
return pyperclip.paste() # 클립보드의 텍스트 데이터를 가져옴 return pyperclip.paste() # 클립보드의 텍스트 데이터를 가져옴
@ -41,7 +42,7 @@ class ClipboardImageManager:
# win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data) # win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
# win32clipboard.CloseClipboard() # win32clipboard.CloseClipboard()
def set_image_to_clipboard(self, image, crop_percentage=0.03, debug=False): async def set_image_to_clipboard(self, image, crop_percentage=0.03, debug=False):
""" """
이미지를 클립보드에 넣는 함수 (Windows 전용, 크롭 ) 이미지를 클립보드에 넣는 함수 (Windows 전용, 크롭 )
@ -93,7 +94,7 @@ class ClipboardImageManager:
self.logger.debug(f"{crop_percentage*100}% 크롭된 이미지가 클립보드에 저장되었습니다.") self.logger.debug(f"{crop_percentage*100}% 크롭된 이미지가 클립보드에 저장되었습니다.")
def base64_to_image(self, base64_data): async def base64_to_image(self, base64_data):
"""Base64 데이터를 이미지로 변환하는 함수""" """Base64 데이터를 이미지로 변환하는 함수"""
if base64_data.startswith('data:image'): if base64_data.startswith('data:image'):
header, encoded = base64_data.split(',', 1) header, encoded = base64_data.split(',', 1)
@ -104,7 +105,7 @@ class ClipboardImageManager:
self.logger.debug("유효하지 않은 Base64 이미지 데이터입니다.") self.logger.debug("유효하지 않은 Base64 이미지 데이터입니다.")
return None return None
def download_image_from_url(self, url, max_retries=3): async def download_image_from_url(self, url, max_retries=3):
"""URL에서 이미지를 다운로드하고 PIL 이미지 객체로 반환""" """URL에서 이미지를 다운로드하고 PIL 이미지 객체로 반환"""
headers = { 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", "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",
@ -139,23 +140,23 @@ class ClipboardImageManager:
else: else:
self.logger.debug(f"이미지 로딩 실패, HTTP 상태 코드: {response.status_code}. 재시도 {retries + 1}/{max_retries}") self.logger.debug(f"이미지 로딩 실패, HTTP 상태 코드: {response.status_code}. 재시도 {retries + 1}/{max_retries}")
retries += 1 retries += 1
time.sleep(random.randint(2, 5)) # 2~5초 대기 후 재시도 await asyncio.sleep(random.randint(2, 5)) # 2~5초 대기 후 재시도
except Exception as e: except Exception as e:
self.logger.debug(f"이미지 로딩 중 오류 발생: {e}. 재시도 {retries + 1}/{max_retries}") self.logger.debug(f"이미지 로딩 중 오류 발생: {e}. 재시도 {retries + 1}/{max_retries}")
retries += 1 retries += 1
time.sleep(random.randint(2, 5)) # 예외 발생 시 대기 후 재시도 await asyncio.sleep(random.randint(2, 5)) # 예외 발생 시 대기 후 재시도
self.logger.debug("이미지 다운로드 최대 재시도 횟수를 초과했습니다.") self.logger.debug("이미지 다운로드 최대 재시도 횟수를 초과했습니다.")
return None return None
def process_clipboard(self, original_url): async def process_clipboard(self, original_url):
"""클립보드의 내용을 처리하고, 필요한 경우 이미지 변환, 크롭 또는 클립보드 비우기""" """클립보드의 내용을 처리하고, 필요한 경우 이미지 변환, 크롭 또는 클립보드 비우기"""
clipboard_data = self.get_clipboard_data() clipboard_data = await self.get_clipboard_data()
# 1. 클립보드의 데이터가 Base64 이미지일 경우 # 1. 클립보드의 데이터가 Base64 이미지일 경우
if clipboard_data.startswith('data:image'): if clipboard_data.startswith('data:image'):
self.logger.info("data:image 감지 : 이미지 데이터로 변환") self.logger.info("data:image 감지 : 이미지 데이터로 변환")
image = self.base64_to_image(clipboard_data) image = await self.base64_to_image(clipboard_data)
if image: if image:
width, _ = image.size width, _ = image.size
self.logger.debug(f"Base64 이미지 크기: {width}px") self.logger.debug(f"Base64 이미지 크기: {width}px")
@ -164,10 +165,10 @@ class ClipboardImageManager:
if width >= 200: if width >= 200:
self.logger.debug("이미지 가로 크기 200픽셀 이상: 크롭 진행 중...") self.logger.debug("이미지 가로 크기 200픽셀 이상: 크롭 진행 중...")
cropped_image = self.crop_image(image) # 크롭 메서드 사용 cropped_image = self.crop_image(image) # 크롭 메서드 사용
self.set_image_to_clipboard(cropped_image) # 클립보드에 저장 await self.set_image_to_clipboard(cropped_image) # 클립보드에 저장
else: else:
self.logger.debug("이미지 가로 크기 200픽셀 이하: 클립보드 비움.") self.logger.debug("이미지 가로 크기 200픽셀 이하: 클립보드 비움.")
self.clear_clipboard() await self.clear_clipboard()
else: else:
self.logger.debug("Base64 이미지 변환 실패.") self.logger.debug("Base64 이미지 변환 실패.")
@ -182,19 +183,19 @@ class ClipboardImageManager:
if width >= 200: if width >= 200:
self.logger.debug("이미지 가로 크기 200픽셀 이상: 크롭 진행 중...") self.logger.debug("이미지 가로 크기 200픽셀 이상: 크롭 진행 중...")
cropped_image = self.crop_image(image) # 크롭 메서드 사용 cropped_image = self.crop_image(image) # 크롭 메서드 사용
self.set_image_to_clipboard(cropped_image) # 클립보드에 저장 await self.set_image_to_clipboard(cropped_image) # 클립보드에 저장
else: else:
self.logger.debug("이미지 가로 크기 200픽셀 이하: 클립보드 비움.") self.logger.debug("이미지 가로 크기 200픽셀 이하: 클립보드 비움.")
self.clear_clipboard() await self.clear_clipboard()
# 3. html > whale-ocr 처리 # 3. html > whale-ocr 처리
elif clipboard_data.strip() == "html > whale-ocr": elif clipboard_data.strip() == "html > whale-ocr":
self.logger.info("html > whale-ocr 감지 : 이미지 번역 실패 확인") self.logger.info("html > whale-ocr 감지 : 이미지 번역 실패 확인")
if original_url: if original_url:
image = self.download_image_from_url(original_url) image = await self.download_image_from_url(original_url)
if image: if image:
self.logger.debug("원본 이미지 다운로드 성공, 클립보드에 저장 중...") self.logger.debug("원본 이미지 다운로드 성공, 클립보드에 저장 중...")
self.set_image_to_clipboard(image) # 크롭 없이 저장 await self.set_image_to_clipboard(image) # 크롭 없이 저장
else: else:
self.logger.debug("원본 이미지 다운로드 실패.") self.logger.debug("원본 이미지 다운로드 실패.")
else: else:
@ -224,7 +225,7 @@ class ClipboardImageManager:
return None return None
def clear_clipboard(self): async def clear_clipboard(self):
"""클립보드를 비우는 함수""" """클립보드를 비우는 함수"""
try: try:
win32clipboard.OpenClipboard() win32clipboard.OpenClipboard()
@ -265,32 +266,4 @@ class ClipboardImageManager:
cropped_alt_image.save(cropped_image_path) cropped_alt_image.save(cropped_image_path)
self.logger.debug(f"{int(crop*100)}% 크롭된 이미지 저장됨: {cropped_image_path}") self.logger.debug(f"{int(crop*100)}% 크롭된 이미지 저장됨: {cropped_image_path}")
return cropped_image return cropped_image
def set_image_to_clipboard(self, image):
"""이미지를 클립보드에 넣는 함수"""
output = BytesIO()
image.save(output, "BMP")
data = output.getvalue()[14:] # BMP 헤더 제거
output.close()
try:
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
self.logger.debug("이미지가 클립보드에 저장되었습니다.")
except Exception as e:
self.logger.error(f"이미지를 클립보드에 저장하는 중 오류 발생: {e}", exc_info=True)
finally:
win32clipboard.CloseClipboard()
def base64_to_image(self, base64_data):
"""Base64 데이터를 이미지로 변환하는 함수"""
try:
header, encoded = base64_data.split(',', 1)
img_data = base64.b64decode(encoded)
image = Image.open(BytesIO(img_data))
return image
except Exception as e:
self.logger.error(f"Base64 이미지를 변환하는 중 오류 발생: {e}", exc_info=True)
return None

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

68
gui.py
View File

@ -8,16 +8,19 @@ from vertexAI import VertexAITranslator
from option import OptionHandler from option import OptionHandler
from logger_module import QTextEditLogger # 추가 from logger_module import QTextEditLogger # 추가
import logging import logging
import asyncio
class TranslationApp(QWidget): class TranslationApp(QWidget):
def __init__(self, logger=None): def __init__(self, logger=None, whale_translator=None):
super().__init__() super().__init__()
self.initUI() self.initUI()
self.logger = logger self.logger = logger
key_path = 'leensoo1nt.json' key_path = 'leensoo1nt.json'
self.settings = QSettings("WhenRideMycar", "TranslationApp") # QSettings 초기화 self.settings = QSettings("WhenRideMycar", "TranslationApp") # QSettings 초기화
self.browser_controller = BrowserController(self, self.logger) self.browser_controller = BrowserController(self, self.logger)
self.whale_translator = WhaleTranslator(self, self.logger, secret_mode=True,vd_mode=True) # 디버그 모드 켜기 # self.whale_translator = WhaleTranslator(self, self.logger, secret_mode=True,vd_mode=True) # 디버그 모드 켜기
self.whale_translator = whale_translator
self.vertexAI = VertexAITranslator(self.logger, key_path) self.vertexAI = VertexAITranslator(self.logger, key_path)
self.optionHandler = None self.optionHandler = None
@ -50,6 +53,11 @@ class TranslationApp(QWidget):
# 프로그래스바 초기화 # 프로그래스바 초기화
self.update_total_progress(0,0) self.update_total_progress(0,0)
async def run_async_tasks(self):
"""비동기 작업을 실행"""
while True:
await asyncio.sleep(0.1) # 비동기적으로 잠시 대기하여 응답성을 유지
def add_text_edit_logger(self): def add_text_edit_logger(self):
"""QTextEdit에 로그를 출력하기 위한 핸들러 추가""" """QTextEdit에 로그를 출력하기 위한 핸들러 추가"""
text_edit_logger = QTextEditLogger() text_edit_logger = QTextEditLogger()
@ -213,11 +221,18 @@ class TranslationApp(QWidget):
self.on_toggle_clicked(False) self.on_toggle_clicked(False)
# 버튼 이벤트 연결 # 버튼 이벤트 연결
self.start_chrome_button.clicked.connect(self.start_browser) # self.start_chrome_button.clicked.connect(self.start_browser)
self.start_chrome_button.clicked.connect(self.on_start_chrome_button_clicked)
self.translate_button.clicked.connect(self.start_translation) self.translate_button.clicked.connect(self.start_translation)
self.pause_button.clicked.connect(self.pause_translation) self.pause_button.clicked.connect(self.pause_translation)
self.exit_button.clicked.connect(self.close) self.exit_button.clicked.connect(self.close)
async def run_async_tasks(self):
"""비동기 작업을 실행"""
while True:
await asyncio.sleep(0.1) # 비동기적으로 잠시 대기하여 응답성을 유지
def on_toggle_clicked(self, is_checked): def on_toggle_clicked(self, is_checked):
"""관리자 토글 상태에 따라 관리자와 직원 필드를 표시/숨김""" """관리자 토글 상태에 따라 관리자와 직원 필드를 표시/숨김"""
if is_checked: if is_checked:
@ -236,11 +251,18 @@ class TranslationApp(QWidget):
if widget: if widget:
widget.setVisible(visible) widget.setVisible(visible)
def on_start_chrome_button_clicked(self):
"""크롬 실행 버튼 클릭 시 호출"""
self.logger.debug('크롬 실행 버튼 클릭됨')
# 비동기 함수 실행을 위해 asyncio.create_task 사용
asyncio.create_task(self.start_browser())
def start_browser(self): async def start_browser(self):
"""크롬 브라우저 실행 후 로그인""" """크롬 브라우저 실행 후 로그인"""
self.logger.debug('크롬 브라우저를 실행합니다...') self.logger.debug('크롬 브라우저를 실행합니다...')
self.browser_controller.start_browser() # await self.whale_translator.start_whale_browser()
await self.browser_controller.start_browser()
# 관리자 토글 상태에 따라 로그인 # 관리자 토글 상태에 따라 로그인
@ -249,13 +271,13 @@ class TranslationApp(QWidget):
admin_pw = self.admin_pw_input.text() admin_pw = self.admin_pw_input.text()
user_id = self.user_id_input.text() user_id = self.user_id_input.text()
user_pw = self.user_pw_input.text() user_pw = self.user_pw_input.text()
self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=True) await self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=True)
else: else:
admin_id = self.admin_id_input.text() admin_id = self.admin_id_input.text()
admin_pw = self.admin_pw_input.text() admin_pw = self.admin_pw_input.text()
user_id = self.user_id_input.text() user_id = self.user_id_input.text()
user_pw = self.user_pw_input.text() user_pw = self.user_pw_input.text()
self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=False) await self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=False)
# 로그인 정보 저장 # 로그인 정보 저장
self.save_settings() self.save_settings()
@ -386,17 +408,17 @@ class TranslationApp(QWidget):
# self.logger.debug(f"번역 작업 중 오류 발생: {e}", exc_info=True) # self.logger.debug(f"번역 작업 중 오류 발생: {e}", exc_info=True)
# self.running = False # self.running = False
def start_translation(self): async def start_translation(self):
self.logger.debug('번역 작업을 시작합니다...') self.logger.debug('번역 작업을 시작합니다...')
self.running = True # 번역 작업이 시작됨 self.running = True # 번역 작업이 시작됨
try: try:
# 1. "신규 상품 등록" 페이지로 이동 # 1. "신규 상품 등록" 페이지로 이동
self.logger.debug('신규 상품 등록 페이지로 이동 중...') self.logger.debug('신규 상품 등록 페이지로 이동 중...')
self.browser_controller.go_to_new_product_page() await self.browser_controller.go_to_new_product_page()
# 2. 총 상품 수 수집 # 2. 총 상품 수 수집
self.browser_controller.scroll_page_to_bottom() await self.browser_controller.scroll_page_to_bottom()
total_products = self.browser_controller.get_total_product_count() total_products = self.browser_controller.get_total_product_count()
if total_products == 0: if total_products == 0:
self.logger.debug('수집할 상품이 없습니다. 작업을 종료합니다.') self.logger.debug('수집할 상품이 없습니다. 작업을 종료합니다.')
@ -412,7 +434,7 @@ class TranslationApp(QWidget):
while self.running or completed_count < total_products: while self.running or completed_count < total_products:
# 4. 현재 페이지의 모든 "세부사항 수정 및 업로드" 버튼 찾기 # 4. 현재 페이지의 모든 "세부사항 수정 및 업로드" 버튼 찾기
self.logger.debug(f'현재 페이지: {page_number}') self.logger.debug(f'현재 페이지: {page_number}')
product_buttons = self.browser_controller.get_product_edit_buttons() product_buttons = await self.browser_controller.get_product_edit_buttons()
if not product_buttons: if not product_buttons:
self.logger.debug('수정할 상품이 없습니다. 번역 작업을 종료합니다.') self.logger.debug('수정할 상품이 없습니다. 번역 작업을 종료합니다.')
@ -427,27 +449,27 @@ class TranslationApp(QWidget):
self.logger.debug(f'{index}/{len(product_buttons)}: 세부사항 수정 작업 중...') self.logger.debug(f'{index}/{len(product_buttons)}: 세부사항 수정 작업 중...')
# 상품명 수집 및 수집 오류 처리 # 상품명 수집 및 수집 오류 처리
product_name = self.browser_controller.get_product_name(index) product_name = await self.browser_controller.get_product_name(index)
if product_name == "수집 오류 발생": if product_name == "수집 오류 발생":
self.logger.debug('상품 수집 오류, 다음 상품으로 넘어갑니다.') self.logger.debug('상품 수집 오류, 다음 상품으로 넘어갑니다.')
continue continue
# 상품 수정 다이얼로그 열기 # 상품 수정 다이얼로그 열기
self.browser_controller.open_product_edit_dialog(button) await self.browser_controller.open_product_edit_dialog(button)
# 옵션 수정 # 옵션 수정
self.start_stage(0) self.start_stage(0)
self.edit_option() await self.edit_option()
self.complete_stage(0) self.complete_stage(0)
# 상세페이지 수정 # 상세페이지 수정
self.start_stage(1) self.start_stage(1)
self.detail_trans() await self.detail_trans()
self.complete_stage(1) self.complete_stage(1)
# 수정 후 저장 # 수정 후 저장
self.logger.debug('상품 세부사항 저장 중...') self.logger.debug('상품 세부사항 저장 중...')
self.browser_controller.save_product_edit() await self.browser_controller.save_product_edit()
completed_count += 1 completed_count += 1
self.update_total_progress(completed_count, total_products) self.update_total_progress(completed_count, total_products)
@ -459,7 +481,7 @@ class TranslationApp(QWidget):
break break
# 6. 다음 페이지로 이동 (있으면) # 6. 다음 페이지로 이동 (있으면)
if not self.browser_controller.go_to_next_page(): if not await self.browser_controller.go_to_next_page():
self.logger.debug('더 이상 페이지가 없습니다. 작업을 종료합니다.') self.logger.debug('더 이상 페이지가 없습니다. 작업을 종료합니다.')
break break
page_number += 1 page_number += 1
@ -483,9 +505,9 @@ class TranslationApp(QWidget):
self.whale_translator.close_all_virtual_desktops() self.whale_translator.close_all_virtual_desktops()
super().close() super().close()
def detail_trans(self): async def detail_trans(self):
# 상세페이지 탭 클릭 # 상세페이지 탭 클릭
self.browser_controller.click_detail_tab() await self.browser_controller.click_detail_tab()
self.detail_progress_bar.setValue(0) self.detail_progress_bar.setValue(0)
self.detail_progress_bar.setVisible(True) self.detail_progress_bar.setVisible(True)
@ -505,21 +527,21 @@ class TranslationApp(QWidget):
break break
self.whale_translator.translate_image(url) self.whale_translator.translate_image(url)
self.browser_controller.paste_image_in_chrome(self.clipboardImageManager, url) await self.browser_controller.paste_image_in_chrome(self.clipboardImageManager, url)
self.update_detail_progress(i,total_images) self.update_detail_progress(i,total_images)
current_image_count += 1 current_image_count += 1
# 수정 후 저장 # 수정 후 저장
self.logger.debug('상품 세부사항 저장 중...') self.logger.debug('상품 세부사항 저장 중...')
self.browser_controller.save_product_edit() await self.browser_controller.save_product_edit()
self.detail_progress_bar.setVisible(False) self.detail_progress_bar.setVisible(False)
self.detail_progress_bar.setValue(0) self.detail_progress_bar.setValue(0)
def edit_option(self): async def edit_option(self):
# 상세페이지 탭 클릭 # 상세페이지 탭 클릭
self.browser_controller.click_option_tab() await self.browser_controller.click_option_tab()
self.detail_progress_bar.setVisible(True) self.detail_progress_bar.setVisible(True)
# 옵션 최대선택갯수 # 옵션 최대선택갯수

37
main.py
View File

@ -1,7 +1,11 @@
import ctypes import ctypes
from PySide6.QtWidgets import QApplication from PySide6.QtWidgets import QApplication
from gui import TranslationApp from gui import TranslationApp # 기존 TranslationApp UI 사용
from logger_module import setup_logger from logger_module import setup_logger
import asyncio
import os
from whale_translator import WhaleTranslator
# 절전모드를 방지하는 설정 값 # 절전모드를 방지하는 설정 값
ES_CONTINUOUS = 0x80000000 ES_CONTINUOUS = 0x80000000
@ -15,7 +19,13 @@ def allow_sleep():
"""절전모드 방지 설정을 해제""" """절전모드 방지 설정을 해제"""
ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS) ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS)
def main(): async def process_qt_events(app):
"""PySide6의 이벤트를 처리하는 비동기 함수"""
while True:
app.processEvents()
await asyncio.sleep(0.01) # 10ms마다 Qt 이벤트 처리
async def main():
# 로깅 설정 # 로깅 설정
logger = setup_logger('default_logger', f'appTranslator.log') logger = setup_logger('default_logger', f'appTranslator.log')
@ -25,12 +35,29 @@ def main():
try: try:
# PySide6 앱 실행 # PySide6 앱 실행
app = QApplication([]) app = QApplication([])
window = TranslationApp(logger) # 로거를 TranslationApp에 전달
# DPI 설정
try:
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
ctypes.windll.shcore.SetProcessDpiAwareness(2)
except Exception as e:
print(f"DPI 인식 설정 실패: {e}")
# 기존 TranslationApp UI 사용
whale_translator = WhaleTranslator(app, logger, secret_mode=True,vd_mode=True) # 디버그 모드 켜기
await whale_translator.start_whale_browser()
window = TranslationApp(logger, whale_translator) # PySide6 UI
window.show() window.show()
app.exec_()
# asyncio와 PySide6 이벤트 루프를 통합
await asyncio.gather(
process_qt_events(app), # PySide6 이벤트 처리
window.run_async_tasks() # 비동기 작업
)
finally: finally:
# 앱 종료 시 절전모드 방지 해제 # 앱 종료 시 절전모드 방지 해제
allow_sleep() allow_sleep()
if __name__ == '__main__': if __name__ == '__main__':
main() asyncio.run(main()) # 비동기 함수는 asyncio.run()으로 실행

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

View File

View File

@ -1,9 +1,9 @@
from PySide6.QtCore import Qt, QRect, QPropertyAnimation, pyqtProperty, pyqtSignal, QPoint from PySide6.QtCore import Qt, QRect, QPropertyAnimation, Property, Signal, QPoint
from PySide6.QtGui import QPainter, QColor from PySide6.QtGui import QPainter, QColor
from PySide6.QtWidgets import QWidget from PySide6.QtWidgets import QWidget
class ToggleSwitch(QWidget): class ToggleSwitch(QWidget):
clicked = pyqtSignal(bool) clicked = Signal(bool)
def __init__(self, parent=None): def __init__(self, parent=None):
super(ToggleSwitch, self).__init__(parent) super(ToggleSwitch, self).__init__(parent)
@ -18,7 +18,7 @@ class ToggleSwitch(QWidget):
self._init_position() self._init_position()
@pyqtProperty(QPoint) @Property(QPoint)
def circle_pos(self): def circle_pos(self):
return self._circle_pos return self._circle_pos

View File

@ -1,20 +0,0 @@
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)} 이미지 번역 중...')
# 번역 로직

View File

@ -1,5 +1,7 @@
import os import os
import json import json
import asyncio
from vertexai.generative_models import GenerativeModel from vertexai.generative_models import GenerativeModel
class VertexAITranslator: class VertexAITranslator:
@ -24,7 +26,7 @@ class VertexAITranslator:
self.logger.debug("prompt.json 파일을 불러옵니다.") self.logger.debug("prompt.json 파일을 불러옵니다.")
self.prompt_data = self.load_prompt() self.prompt_data = self.load_prompt()
def load_prompt(self): async def load_prompt(self):
""" """
prompt.json 파일을 읽어와 파싱하는 메서드. prompt.json 파일을 읽어와 파싱하는 메서드.
@ -33,7 +35,7 @@ class VertexAITranslator:
try: try:
prompt_path = os.path.join(os.path.dirname(__file__), 'prompt.json') prompt_path = os.path.join(os.path.dirname(__file__), 'prompt.json')
self.logger.debug(f"프롬프트 파일 경로: {prompt_path}") self.logger.debug(f"프롬프트 파일 경로: {prompt_path}")
with open(prompt_path, 'r', encoding='utf-8') as file: async with open(prompt_path, 'r', encoding='utf-8') as file:
prompt_data = json.load(file) prompt_data = json.load(file)
self.logger.debug("prompt.json 파일이 성공적으로 로드되었습니다.") self.logger.debug("prompt.json 파일이 성공적으로 로드되었습니다.")
return prompt_data return prompt_data
@ -44,7 +46,7 @@ class VertexAITranslator:
self.logger.error(f"prompt.json 파일 파싱 중 오류 발생: {e}", exc_info=True) self.logger.error(f"prompt.json 파일 파싱 중 오류 발생: {e}", exc_info=True)
raise e raise e
def clean_special_chars(self, text): async def clean_special_chars(self, text):
""" """
텍스트에서 허용되지 않는 특수 문자를 제거하고, 텍스트에서 허용되지 않는 특수 문자를 제거하고,
필요한 특수 문자를 대체하는 메서드. 필요한 특수 문자를 대체하는 메서드.
@ -73,7 +75,7 @@ class VertexAITranslator:
self.logger.debug(f"정리된 텍스트: {cleaned_text_str}") self.logger.debug(f"정리된 텍스트: {cleaned_text_str}")
return cleaned_text_str return cleaned_text_str
def translate_options(self, original_data): async def translate_options(self, original_data):
""" """
주어진 옵션 데이터를 Vertex AI 모델을 통해 번역하는 메서드. 주어진 옵션 데이터를 Vertex AI 모델을 통해 번역하는 메서드.
@ -83,7 +85,7 @@ class VertexAITranslator:
self.logger.debug(f"옵션 데이터를 번역 중: {original_data}") self.logger.debug(f"옵션 데이터를 번역 중: {original_data}")
# 데이터 정리 # 데이터 정리
cleaned_data = {key: self.clean_special_chars(value) for key, value in original_data.items()} cleaned_data = {key: await self.clean_special_chars(value) for key, value in original_data.items()}
self.logger.debug(f"정리된 옵션 데이터: {cleaned_data}") self.logger.debug(f"정리된 옵션 데이터: {cleaned_data}")
# 원본 데이터를 프롬프트 템플릿에 넣는다. # 원본 데이터를 프롬프트 템플릿에 넣는다.
@ -93,7 +95,7 @@ class VertexAITranslator:
# Vertex AI 모델에 프롬프트 전달하여 응답 받기 # Vertex AI 모델에 프롬프트 전달하여 응답 받기
self.logger.debug("Vertex AI 모델에 프롬프트를 전달하여 응답을 기다리는 중...") self.logger.debug("Vertex AI 모델에 프롬프트를 전달하여 응답을 기다리는 중...")
response = self.model.generate_content(prompt) response = await self.model.generate_content(prompt)
self.logger.debug(f"모델 응답: {response.text}") self.logger.debug(f"모델 응답: {response.text}")
# 응답 데이터에서 JSON 형식 추출 # 응답 데이터에서 JSON 형식 추출

View File

@ -1,9 +1,10 @@
import pyautogui import pyautogui
import ctypes import ctypes
import time import time
import win32gui, win32con import win32gui, win32con, win32process
from pyvda import VirtualDesktop, get_virtual_desktops from pyvda import VirtualDesktop, get_virtual_desktops
import subprocess import subprocess
import asyncio
class WhaleTranslator: class WhaleTranslator:
def __init__(self, app, logger, secret_mode=True, vd_mode=False): def __init__(self, app, logger, secret_mode=True, vd_mode=False):
@ -11,7 +12,7 @@ class WhaleTranslator:
self.logger = logger self.logger = logger
self.vd_mode = vd_mode self.vd_mode = vd_mode
self.newtab = "about:newtab" self.newtab = "about:newtab"
self.whale_pid = None
isSecret = secret_mode isSecret = secret_mode
if isSecret: if isSecret:
@ -21,53 +22,59 @@ class WhaleTranslator:
self.whale_hwnd = None self.whale_hwnd = None
async def start_whale_browser(self):
"""비동기 브라우저 시작 및 가상 데스크탑 처리"""
if self.vd_mode: if self.vd_mode:
self.ensure_virtual_desktop_2_exists() self.ensure_virtual_desktop_2_exists() # 가상 데스크탑 2 생성
self.start_whale_browser()
if self.vd_mode:
self.return_to_virtual_desktop_1()
def start_whale_browser(self):
# Whale 브라우저 실행 # Whale 브라우저 실행
whale_path = r"C:\\Program Files\\Naver\\Naver Whale\\Application\\whale.exe" # whale.exe 경로 지정 whale_path = r"C:\\Program Files\\Naver\\Naver Whale\\Application\\whale.exe"
# 웨일을 시크릿 모드로 실행 process = subprocess.Popen([whale_path, '--incognito'])
subprocess.Popen([whale_path, '--incognito']) self.whale_pid = process.pid
self.find_whale_window() self.logger.debug(f"Whale 브라우저 실행, PID: {self.whale_pid}")
pyautogui.hotkey('ctrl', 'l') # 혹은 'ctrl', 'shift'를 사용할 수도 있음 await asyncio.sleep(2) # 브라우저가 실행될 때까지 대기
"""입력기를 영어로 전환한 후 pyautogui로 URL 입력""" hwnd = win32gui.FindWindow(None, self.whale_window_name)
# 입력기를 영어로 전환 (한영 전환키 사용)
self.switch_language()
time.sleep(0.3)
pyautogui.typewrite(self.newtab)
# 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: if hwnd:
win32gui.ShowWindow(hwnd, win32con.SW_NORMAL) win32gui.ShowWindow(hwnd, win32con.SW_NORMAL)
win32gui.SetWindowPos(hwnd, None, 0, 0, 1920, 1080, win32con.SWP_NOZORDER) win32gui.SetWindowPos(hwnd, None, 0, 0, 1920, 1080, win32con.SWP_NOZORDER)
else: else:
self.logger.debug("Whale 창을 찾을 수 없습니다.") self.logger.debug("Whale 창을 찾을 수 없습니다.")
if self.vd_mode:
self.return_to_virtual_desktop_1() # 가상 데스크탑 1로 복귀
def find_window_by_pid(self, pid):
"""프로세스 ID를 기반으로 창 핸들을 찾는 메서드"""
def enum_windows_callback(hwnd, pid_list):
tid, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
pid_list.append(hwnd)
hwnd_list = []
win32gui.EnumWindows(enum_windows_callback, hwnd_list)
return hwnd_list[0] if hwnd_list else None
def find_whale_window(self): def find_whale_window(self):
"""웨일 창 핸들을 찾는 메서드""" """프로세스 ID를 기반으로 웨일 창 핸들을 찾는 메서드"""
if not self.whale_hwnd: if not self.whale_hwnd:
self.whale_hwnd = self.find_window_by_title(self.whale_window_name) self.whale_hwnd = self.find_window_by_pid(self.whale_pid)
return self.whale_hwnd return self.whale_hwnd
def find_window_by_title(self, window_name): # def find_whale_window(self):
def enum_windows_callback(hwnd, result): # """웨일 창 핸들을 찾는 메서드"""
if win32gui.IsWindowVisible(hwnd) and window_name in win32gui.GetWindowText(hwnd): # if not self.whale_hwnd:
result.append(hwnd) # self.whale_hwnd = self.find_window_by_title(self.whale_window_name)
result = [] # return self.whale_hwnd
win32gui.EnumWindows(enum_windows_callback, result)
return result[0] if result else None # 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): def ensure_virtual_desktop_2_exists(self):
"""가상 데스크톱 2가 존재하는지 확인하고, 없으면 생성""" """가상 데스크톱 2가 존재하는지 확인하고, 없으면 생성"""
@ -104,7 +111,7 @@ class WhaleTranslator:
try: try:
VirtualDesktop(2).go() VirtualDesktop(2).go()
self.logger.debug("가상 데스크톱 2로 전환되었습니다.") self.logger.debug("가상 데스크톱 2로 전환되었습니다.")
time.sleep(1) time.sleep(0.3)
except Exception as e: except Exception as e:
self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}", exc_info=True) self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}", exc_info=True)
@ -113,36 +120,36 @@ class WhaleTranslator:
try: try:
VirtualDesktop(1).go() VirtualDesktop(1).go()
self.logger.debug("가상 데스크톱 1로 전환되었습니다.") self.logger.debug("가상 데스크톱 1로 전환되었습니다.")
time.sleep(1) time.sleep(0.3)
except Exception as e: except Exception as e:
self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}", exc_info=True) self.logger.debug(f"가상 데스크톱 전환 중 오류 발생: {e}", exc_info=True)
def translate_image(self, url): async def translate_image(self, url):
if self.vd_mode: if self.vd_mode:
self.switch_to_virtual_desktop_2() await self.switch_to_virtual_desktop_2()
if self.find_whale_window(): if self.find_whale_window():
win32gui.ShowWindow(self.whale_hwnd, win32con.SW_RESTORE) # 웨일 창 활성화 win32gui.ShowWindow(self.whale_hwnd, win32con.SW_RESTORE) # 웨일 창 활성화
win32gui.SetForegroundWindow(self.whale_hwnd) win32gui.SetForegroundWindow(self.whale_hwnd)
pyautogui.moveTo(960,580) # 마우스 센터로 이동 pyautogui.moveTo(960,580) # 마우스 센터로 이동
pyautogui.hotkey('ctrl', 'l') # 웨일 브라우저의 주소창으로 이동 pyautogui.hotkey('ctrl', 'l') # 웨일 브라우저의 주소창으로 이동
self.enter_url(url) self.enter_url(url)
time.sleep(1) # page Loading await asyncio.sleep(1) # 페이지 로딩 대기
# pyautogui.rightClick()
# await asyncio.sleep(0.2) # 페이지 로딩 대기
# pyautogui.press('c') # 원본 이미지 클립보드에 복사
# await asyncio.sleep(1) # 페이지 로딩 대기
pyautogui.rightClick() pyautogui.rightClick()
time.sleep(0.2) # 컨텍스트 메뉴 대기 await asyncio.sleep(0.2) # 페이지 로딩 대기
pyautogui.press('c') # 번역된 이미지 클립보드에 복사
time.sleep(1) # 이미지 로딩 대기
pyautogui.rightClick()
time.sleep(0.2) # 컨텍스트 메뉴 대기
pyautogui.press('r') # 번역 클릭 pyautogui.press('r') # 번역 클릭
time.sleep(7) # 번역 완료 대기 await asyncio.sleep(7) # 페이지 로딩 대기
pyautogui.rightClick() pyautogui.rightClick()
time.sleep(0.2) # 컨텍스트 메뉴 대기 await asyncio.sleep(0.2) # 페이지 로딩 대기
pyautogui.press('c') # 번역된 이미지 클립보드에 복사 pyautogui.press('c') # 번역된 이미지 클립보드에 복사
pyautogui.hotkey('ctrl', 'l') # 새 탭으로 이동 pyautogui.hotkey('ctrl', 'l') # 새 탭으로 이동
pyautogui.typewrite(self.newtab) # URL을 입력 pyautogui.typewrite(self.newtab) # URL을 입력
@ -150,7 +157,7 @@ class WhaleTranslator:
self.logger.debug(f'번역 완료: {url}') self.logger.debug(f'번역 완료: {url}')
if self.vd_mode: if self.vd_mode:
self.return_to_virtual_desktop_1() await self.return_to_virtual_desktop_1()
else: else:
self.logger.debug('웨일 창을 찾을 수 없습니다.') self.logger.debug('웨일 창을 찾을 수 없습니다.')
@ -188,7 +195,7 @@ class WhaleTranslator:
# 주소창에 URL 입력하기 전에 영어로 변경 # 주소창에 URL 입력하기 전에 영어로 변경
# self.set_input_language('EN') # self.set_input_language('EN')
# time.sleep(0.5) # 입력 모드 전환 후 잠시 대기 # await asyncio.sleep(0.5) # 입력 모드 전환 후 잠시 대기
# 주소창으로 이동 후 URL 입력 # 주소창으로 이동 후 URL 입력
pyautogui.hotkey('ctrl', 'l') # 주소창으로 이동 pyautogui.hotkey('ctrl', 'l') # 주소창으로 이동
@ -199,28 +206,31 @@ class WhaleTranslator:
def close_whale_window_if_exists(self): def close_whale_window_if_exists(self):
"""'새 탭 - Whale' 창이 존재하면 종료""" """웨일 브라우저 창을 프로세스 ID(pid)로 찾아 종료"""
"""'새 시크릿 탭 - Whale' 창이 존재하면 종료""" try:
whale_window_name = "새 탭 - Whale" if not self.whale_pid:
sec_whale_window_name = "새 시크릿 탭 - Whale" self.logger.debug("웨일 프로세스 ID가 설정되지 않았습니다.")
return
def enum_windows_callback(hwnd, result):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == self.whale_pid and win32gui.IsWindowVisible(hwnd):
result.append(hwnd)
whale_hwnd = self.find_window_by_title(whale_window_name) result = []
sec_whale_hwnd = self.find_window_by_title(sec_whale_window_name) win32gui.EnumWindows(enum_windows_callback, result)
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}' 창을 종료했습니다.")
elif sec_whale_hwnd:
self.logger.debug(f"'{sec_whale_window_name}' 창을 찾았습니다. 종료 중...")
win32gui.PostMessage(sec_whale_hwnd, win32con.WM_CLOSE, 0, 0) # 창을 종료하는 메시지 전송
time.sleep(1)
self.logger.debug(f"'{sec_whale_window_name}' 창을 종료했습니다.")
else: if result:
self.logger.debug(f"'{whale_window_name}' 또는 '{sec_whale_window_name}' 창을 찾지 못했습니다.") hwnd = result[0]
self.logger.debug(f"웨일 창을 찾았습니다. 핸들: {hwnd}. 종료 중...")
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) # 창을 종료하는 메시지 전송
time.sleep(1)
self.logger.debug(f"웨일 창이 성공적으로 종료되었습니다.")
else:
self.logger.debug("웨일 창을 찾을 수 없습니다.")
except Exception as e:
self.logger.error(f"웨일 창을 종료하는 중 오류 발생: {e}", exc_info=True)
def close_all_virtual_desktops(self): def close_all_virtual_desktops(self):
"""모든 가상 데스크톱을 종료""" """모든 가상 데스크톱을 종료"""