import os import time import uuid import base64 from flask import Flask, request, jsonify from flask_cors import CORS from playwright.sync_api import sync_playwright from groq import Groq app = Flask(__name__) CORS(app) GROQ_API_KEY = "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" # Global Variables # Hum dictionary use nahi karenge, sirf 1 session active rakhenge taake server heavy na ho active_session = { "playwright": None, "browser": None, "page": None, "id": None } groq_client = Groq(api_key=GROQ_API_KEY) # --- ROUTES --- @app.route('/') def home(): return "Server is Online & Ready" @app.route('/start', methods=['POST']) def start_session(): global active_session # 1. Close Old Session if exists if active_session["browser"]: try: active_session["browser"].close() active_session["playwright"].stop() except: pass try: # 2. Start New Session pw = sync_playwright().start() # Standard Mobile Settings browser = pw.chromium.launch( headless=True, args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] ) context = browser.new_context( viewport={'width': 375, 'height': 812}, # iPhone X size (Good standard) user_agent='Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1', is_mobile=True, has_touch=True, device_scale_factor=2 ) page = context.new_page() page.goto("https://www.startpage.com/sp/search", timeout=60000) # Save to global sid = str(uuid.uuid4()) active_session["playwright"] = pw active_session["browser"] = browser active_session["page"] = page active_session["id"] = sid return jsonify({"session_id": sid}) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/snapshot/', methods=['GET']) def get_snapshot(session_id): # Safety Check if active_session["id"] != session_id or not active_session["page"]: return jsonify({"error": "Session Invalid"}), 404 try: page = active_session["page"] # Quality 40 is best balance screenshot = base64.b64encode(page.screenshot(type='jpeg', quality=40)).decode('utf-8') return jsonify({"screenshot": screenshot, "url": page.url}) except: return jsonify({"error": "Capture Failed"}), 500 @app.route('/interact', methods=['POST']) def interact(): data = request.json sid = data.get('session_id') if active_session["id"] != sid or not active_session["page"]: return jsonify({"error": "Invalid"}), 404 page = active_session["page"] action = data.get('action') try: if action == 'tap': # Viewport size nikalo viewport = page.viewport_size x = data.get('x') * viewport['width'] y = data.get('y') * viewport['height'] # Simple Tap page.mouse.click(x, y) elif action == 'type': page.keyboard.type(data.get('text')) page.keyboard.press("Enter") elif action == 'key': page.keyboard.press(data.get('key')) elif action == 'scroll': page.evaluate("window.scrollBy(0, 300)") elif action == 'back': page.go_back() # Action ke foran baad naya screenshot screenshot = base64.b64encode(page.screenshot(type='jpeg', quality=40)).decode('utf-8') return jsonify({"status": "ok", "screenshot": screenshot}) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)