forked from ckh08045/AutoPercenty
74 lines
3.7 KiB
Python
74 lines
3.7 KiB
Python
from playwright.sync_api import sync_playwright
|
|
|
|
import random
|
|
|
|
class DeepLTranslator:
|
|
def __init__(self):
|
|
self.playwright = sync_playwright().start()
|
|
self.browser = self.playwright.chromium.launch(headless=True) # 시연을 위해 headless 모드 비활성화
|
|
# 동영상 녹화 설정을 포함하여 브라우저 컨텍스트 생성
|
|
self.context = self.browser.new_context(
|
|
user_agent=random.choice([
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.0.0",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0",
|
|
"Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 OPR/85.0.0.0"
|
|
]),
|
|
# # 동영상 녹화 설정 추가
|
|
# record_video_dir="videos/", # 동영상이 저장될 디렉토리 지정
|
|
# record_video_size={"width": 1280, "height": 720} # 동영상 크기 지정
|
|
)
|
|
self.page = self.context.new_page()
|
|
self.page.goto("https://www.deepl.com/translator#zh/ko/")
|
|
|
|
def translate(self, texts):
|
|
# 단일 텍스트를 리스트로 변환하여 일관된 처리를 가능하게 함
|
|
if isinstance(texts, str):
|
|
texts = [texts]
|
|
|
|
translated_texts = []
|
|
for text in texts:
|
|
# 텍스트 입력 전 입력 필드 클리어
|
|
self.page.evaluate("""() => {
|
|
const editor = document.querySelector('[data-testid="translator-source-input"] div[contenteditable="true"]');
|
|
editor.textContent = ''; // 입력 필드 클리어
|
|
editor.dispatchEvent(new Event('input', {bubbles: true}));
|
|
}""")
|
|
|
|
# 텍스트 입력
|
|
# self.page.fill('[data-testid="translator-source-input"] div[contenteditable="true"]', text)
|
|
self.page.evaluate("""(text) => {
|
|
const editor = document.querySelector('[data-testid="translator-source-input"] div[contenteditable="true"]');
|
|
editor.textContent = text;
|
|
editor.dispatchEvent(new Event('input', {bubbles: true}));
|
|
editor.dispatchEvent(new Event('keydown', {bubbles: true}));
|
|
editor.dispatchEvent(new Event('keyup', {bubbles: true}));
|
|
editor.dispatchEvent(new Event('keypress', {bubbles: true}));
|
|
}""", text)
|
|
|
|
# 번역이 완료될 때까지 기다림
|
|
self.page.wait_for_function("document.querySelector(\"[data-testid='translator-target-input']\").textContent.length > 0", timeout=20000)
|
|
self.page.wait_for_selector('[data-testid="translator-target-input"]', state="visible", timeout=10000)
|
|
|
|
# 번역된 텍스트 추출
|
|
translated_text = self.page.text_content('[data-testid="translator-target-input"]')
|
|
translated_texts.append(translated_text.strip())
|
|
|
|
# translated_texts.append(translated_text)
|
|
|
|
return translated_texts
|
|
|
|
def close(self):
|
|
self.browser.close()
|
|
self.playwright.stop()
|
|
|
|
# # 사용 예시
|
|
# translator = DeepLTranslator()
|
|
# texts_to_translate = ["Hello, world!", "This is a test."]
|
|
# translated_texts = translator.translate(texts_to_translate)
|
|
# for original, translated in zip(texts_to_translate, translated_texts):
|
|
# print(f"Original: {original} | Translated: {translated}")
|
|
|
|
# translator.close()
|