Spaces:
Sleeping
Sleeping
| 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 --- | |
| def home(): | |
| return "Server is Online & Ready" | |
| 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 | |
| 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 | |
| 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) |