AutoTao/sms.py

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