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()