1
0
Fork 0
AutoPercenty2/ai/deepl_class.py

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