apibrowser2 / app.py
Akwbw's picture
Update app.py
77e5ff7 verified
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)