Spaces:
Sleeping
Sleeping
| from flask import Flask, request, jsonify | |
| from playwright.sync_api import sync_playwright | |
| import base64 | |
| app = Flask(__name__) | |
| # Global variables to keep the browser session alive | |
| p = None | |
| browser = None | |
| page = None | |
| def initialize_browser(): | |
| """Browser start karta hai agar pehle se nahi chal raha.""" | |
| global p, browser, page | |
| if not page: | |
| p = sync_playwright().start() | |
| # Headless mode = True (Browser background me chalega) | |
| browser = p.chromium.launch(headless=True) | |
| # Context create karte hain taake history maintain rahe | |
| context = browser.new_context(viewport={'width': 1280, 'height': 720}) | |
| page = context.new_page() | |
| print("Browser Initialized") | |
| def get_page_data(): | |
| """Current page ka Screenshot aur HTML DOM return karta hai.""" | |
| global page | |
| # 1. HTML Content | |
| html_content = page.content() | |
| # 2. Screenshot (Base64 string format mein) | |
| screenshot_bytes = page.screenshot(full_page=False) | |
| screenshot_b64 = base64.b64encode(screenshot_bytes).decode('utf-8') | |
| return { | |
| "html": html_content, | |
| "screenshot": screenshot_b64 | |
| } | |
| def home(): | |
| return "Browser Server is Running. Use POST /command to interact." | |
| def handle_command(): | |
| global page | |
| # Ensure browser is running | |
| initialize_browser() | |
| data = request.json | |
| action = data.get('action') | |
| try: | |
| # --- 1. NAVIGATE (Website kholna) --- | |
| if action == 'navigate': | |
| url = data.get('url') | |
| if not url: | |
| return jsonify({"error": "URL is required"}), 400 | |
| page.goto(url, timeout=60000) | |
| page.wait_for_load_state('networkidle') # Wait until page settles | |
| # --- 2. CLICK / TAP --- | |
| elif action == 'click': | |
| selector = data.get('selector') | |
| if selector: | |
| page.click(selector) | |
| else: | |
| # Agar selector nahi to coordinates par click (optional) | |
| x = data.get('x') | |
| y = data.get('y') | |
| if x is not None and y is not None: | |
| page.mouse.click(x, y) | |
| # --- 3. TYPE (Likhna) --- | |
| elif action == 'type': | |
| selector = data.get('selector') | |
| text = data.get('text') | |
| if selector and text: | |
| page.fill(selector, text) | |
| # --- 4. ENTER KEY (Form submit waghera ke liye) --- | |
| elif action == 'enter': | |
| page.keyboard.press('Enter') | |
| # --- 5. SCROLL --- | |
| elif action == 'scroll': | |
| direction = data.get('direction', 'down') | |
| amount = data.get('amount', 500) | |
| if direction == 'down': | |
| page.mouse.wheel(0, amount) | |
| elif direction == 'up': | |
| page.mouse.wheel(0, -amount) | |
| # Thoda wait karein taake scroll render ho jaye | |
| page.wait_for_timeout(500) | |
| # --- 6. HOVER --- | |
| elif action == 'hover': | |
| selector = data.get('selector') | |
| if selector: | |
| page.hover(selector) | |
| # --- 7. WAIT (Agar manual delay chahiye) --- | |
| elif action == 'wait': | |
| duration = data.get('duration', 1000) | |
| page.wait_for_timeout(duration) | |
| else: | |
| return jsonify({"error": "Unknown action"}), 400 | |
| # --- RETURN DATA (Screenshot + DOM) --- | |
| response_data = get_page_data() | |
| return jsonify({ | |
| "status": "success", | |
| "action_performed": action, | |
| "current_url": page.url, | |
| "dom": response_data['html'], | |
| "screenshot_base64": response_data['screenshot'] | |
| }) | |
| except Exception as e: | |
| return jsonify({"status": "error", "message": str(e)}), 500 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |