diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e2ec682 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +playwright +httpx diff --git a/screenshot_scout.py b/screenshot_scout.py new file mode 100644 index 0000000..3f7178b --- /dev/null +++ b/screenshot_scout.py @@ -0,0 +1,95 @@ +import asyncio +import httpx +from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError + +SCREENSHOT_PATH = "/tmp/screenshot.png" +TELEGRAM_BOT_TOKEN = "8865512961:AAG4VVJk7S58oAF5Ps00xgwfoPjXobbcm1E" +TELEGRAM_CHAT_ID = "-1004385538803" +TELEGRAM_API_URL = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendPhoto" +TARGET_URL = "https://www.google.com" + + +async def capture_screenshot() -> bool: + """Launch headless Chromium, navigate to target URL, and capture full-page screenshot.""" + print(f"[*] Launching headless Chromium browser...") + try: + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True) + page = await browser.new_page() + + print(f"[*] Navigating to {TARGET_URL}...") + # Wait until network is idle to ensure full page load + await page.goto(TARGET_URL, wait_until="networkidle", timeout=30000) + + print(f"[*] Capturing full-page screenshot to {SCREENSHOT_PATH}...") + await page.screenshot(path=SCREENSHOT_PATH, full_page=True) + + await browser.close() + print(f"[+] Screenshot saved successfully to {SCREENSHOT_PATH}") + return True + + except PlaywrightTimeoutError: + print(f"[-] Timeout error: Could not load {TARGET_URL} within the allowed time.") + return False + except Exception as e: + print(f"[-] Unexpected error during screenshot capture: {e}") + return False + + +def send_screenshot_via_telegram() -> bool: + """Send the captured screenshot to Telegram chat using sendPhoto API.""" + print(f"[*] Sending screenshot to Telegram chat {TELEGRAM_CHAT_ID}...") + try: + with open(SCREENSHOT_PATH, "rb") as photo_file: + with httpx.Client(timeout=30.0) as client: + response = client.post( + TELEGRAM_API_URL, + data={"chat_id": TELEGRAM_CHAT_ID, "caption": f"Screenshot of {TARGET_URL}"}, + files={"photo": ("screenshot.png", photo_file, "image/png")}, + ) + + if response.status_code == 200: + result = response.json() + if result.get("ok"): + print(f"[+] Screenshot sent successfully to Telegram!") + return True + else: + print(f"[-] Telegram API error: {result.get('description', 'Unknown error')}") + return False + else: + print(f"[-] HTTP error from Telegram API: {response.status_code} - {response.text}") + return False + + except httpx.TimeoutException: + print(f"[-] Network timeout: Failed to reach Telegram API within the allowed time.") + return False + except httpx.NetworkError as e: + print(f"[-] Network error while sending to Telegram: {e}") + return False + except FileNotFoundError: + print(f"[-] Screenshot file not found at {SCREENSHOT_PATH}. Was the capture step successful?") + return False + except Exception as e: + print(f"[-] Unexpected error while sending screenshot: {e}") + return False + + +async def main(): + print("=== Screenshot Scout Starting ===") + + # Step 1: Capture the screenshot + screenshot_ok = await capture_screenshot() + if not screenshot_ok: + print("[!] Aborting: Screenshot capture failed.") + return + + # Step 2: Send screenshot via Telegram + send_ok = send_screenshot_via_telegram() + if send_ok: + print("=== Screenshot Scout Completed Successfully ===") + else: + print("=== Screenshot Scout Finished With Errors ===") + + +if __name__ == "__main__": + asyncio.run(main())