71 lines
3.4 KiB
Python
71 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
import argparse
|
|
import asyncio
|
|
import getpass
|
|
import textwrap
|
|
from playwright.async_api import async_playwright
|
|
|
|
DEFAULT_DELAY = 1
|
|
MESSAGES_URL = 'https://messages.google.com/web/conversations/new'
|
|
|
|
parser = argparse.ArgumentParser(
|
|
prog='messages-for-web-playwright',
|
|
description='Playwright를 사용하여 Google Messages for Web에서 SMS 전송 자동화',
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog=textwrap.dedent('''\
|
|
예시:
|
|
python script.py --to 010-1234-5678 "안녕하세요, 테스트 메시지입니다."
|
|
''')
|
|
)
|
|
parser.add_argument('MESSAGE', type=str, help='전송할 문자 메시지 내용 (따옴표로 감싸서 입력)')
|
|
parser.add_argument('--to', type=str, required=True, help='받는 사람의 전화번호 (예: 010-1234-5678)')
|
|
parser.add_argument('-d', '--delay', type=int, default=DEFAULT_DELAY, help='동작 사이의 지연 시간 (초)')
|
|
parser.add_argument('--dry_run', action='store_true', help='실제 전송 없이 테스트 모드 실행')
|
|
args = parser.parse_args()
|
|
|
|
async def main():
|
|
async with async_playwright() as p:
|
|
# persistent context를 사용하여 로그인 세션을 재사용 (로그인 되어 있어야 함)
|
|
user_data_dir = f"C:\\Users\\{getpass.getuser()}\\AppData\\Local\\ms-playwright"
|
|
context = await p.chromium.launch_persistent_context(user_data_dir=user_data_dir, headless=False)
|
|
page = await context.new_page()
|
|
print("Playwright로 Google Messages for Web에 접속합니다.")
|
|
|
|
# 1. Google Messages for Web 새 대화 페이지로 이동
|
|
await page.goto(MESSAGES_URL)
|
|
print("Google Messages for Web 페이지로 이동합니다.")
|
|
await page.wait_for_timeout(args.delay * 1000)
|
|
print("Google Messages for Web에 접속했습니다.")
|
|
|
|
# 2. "이름, 전화번호 또는 이메일 입력" input에 받는 사람 정보 입력
|
|
recipient_input_selector = 'input[placeholder="이름, 전화번호 또는 이메일 입력"]'
|
|
await page.wait_for_selector(recipient_input_selector, timeout=45000)
|
|
print("받는 사람 정보 입력란을 찾았습니다.")
|
|
await page.fill(recipient_input_selector, args.to)
|
|
print(f"받는 사람 정보를 입력했습니다: {args.to}")
|
|
|
|
# 3. 새 대화 요소
|
|
new_conv_selector = "span:has-text('번으로 보내기')"
|
|
await page.wait_for_selector(new_conv_selector, timeout=45000)
|
|
print("새 대화 버튼을 찾았습니다.")
|
|
await page.click(new_conv_selector)
|
|
print("새 대화 버튼을 클릭했습니다.")
|
|
|
|
# 4. "문자메시지" 입력란이 나타날 때까지 기다림
|
|
message_input_selector = 'textarea[placeholder="문자메시지"]'
|
|
await page.wait_for_selector(message_input_selector, timeout=45000)
|
|
await page.fill(message_input_selector, args.MESSAGE)
|
|
await page.wait_for_timeout(args.delay * 1000)
|
|
|
|
if args.dry_run:
|
|
print("Dry run: 실제 전송 없이 메시지 입력만 수행했습니다.")
|
|
else:
|
|
await page.click('mws-message-compose > div > mws-message-send-button > div > mw-message-send-button > button')
|
|
print("메시지가 전송되었습니다.")
|
|
|
|
await page.wait_for_timeout(args.delay * 1000)
|
|
await context.close()
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(main())
|