Spaces:
Sleeping
Sleeping
File size: 4,000 Bytes
dde42ff 0aa2840 dde42ff c02b846 dde42ff da6c3db 5726ffb da6c3db 3806f77 283dab3 da6c3db dde42ff da6c3db 5726ffb da6c3db 77e5ff7 da6c3db e357ae3 da6c3db e357ae3 da6c3db e357ae3 da6c3db 5726ffb da6c3db dde42ff da6c3db dde42ff da6c3db | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | 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/<session_id>', 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) |