File size: 1,598 Bytes
b1ce4d9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, request, jsonify
from playwright.sync_api import sync_playwright
import base64

app = Flask(__name__)

@app.route("/command", methods=["POST"])
def command():
    data = request.json
    action = data.get("action")
    value = data.get("value")

    # Stateless: fresh browser per request
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        try:
            if action == "goto":
                page.goto(value)
            elif action == "scroll":
                page.evaluate(f"window.scrollTo(0, {value})")
            elif action == "click":
                x, y = value["x"], value["y"]
                page.mouse.click(x, y)
            elif action == "type":
                selector, text = value["selector"], value["text"]
                page.fill(selector, text)
            elif action == "hold":
                x, y, duration = value["x"], value["y"], value["duration"]
                page.mouse.move(x, y)
                page.mouse.down()
                page.wait_for_timeout(duration)
                page.mouse.up()

            # Screenshot
            screenshot = page.screenshot()
            screenshot_b64 = base64.b64encode(screenshot).decode()

            # DOM HTML
            html = page.content()

            return jsonify({"screenshot": screenshot_b64, "html": html})

        except Exception as e:
            return jsonify({"error": str(e)}), 400
        finally:
            browser.close()

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)