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)