import os import re import gradio as gr from e2b_desktop import Sandbox E2B_API_KEY = os.environ.get("E2B_API_KEY") if not E2B_API_KEY: raise ValueError("E2B_API_KEY belum diset di Secrets Hugging Face.") desktop = None vnc_url = None vnc_host_port = None def extract_host_port(url): m = re.search(r"https?://([^/:]+)(?::(\d+))?", url) if m: host = m.group(1) port = m.group(2) or "5900" return f"{host}:{port}" return None def start_vnc(): global desktop, vnc_url, vnc_host_port if desktop is None: desktop = Sandbox.create( template=None, resolution=(1024, 768), dpi=96, allow_internet_access=True ) desktop.stream.start(require_auth=False) vnc_url = desktop.stream.get_url() vnc_host_port = extract_host_port(vnc_url) return ( f"", f"✅ VNC Started — Use RealVNC: {vnc_host_port}" ) else: return ( f"", f"⚠️ VNC Already Running — Use RealVNC: {vnc_host_port}" ) def stop_vnc(): global desktop, vnc_url, vnc_host_port if desktop: desktop.kill() desktop = None vnc_url = None vnc_host_port = None return "

VNC Stopped

", "✅ Sandbox Stopped" else: return "

No active VNC

", "⚠️ Nothing to Stop" def kirim_teks(teks): global desktop if not teks.strip(): return "

⚠️ Teks kosong

" if not desktop: return "

❌ VNC belum berjalan

" try: desktop.write(teks) desktop.press("enter") return f"

✅ Teks '{teks}' berhasil dikirim

" except Exception as ex: return f"

Error: {ex}

" with gr.Blocks() as demo: gr.HTML("

E2B VNC Sandbox

") iframe_display = gr.HTML("

VNC belum dimulai

") status_display = gr.Textbox(value="Status: Idle", label="Status / VNC Viewer Address") start_btn = gr.Button("▶ Start VNC") stop_btn = gr.Button("⏹ Stop VNC") teks_input = gr.Textbox(placeholder="Ketik teks untuk VNC", label="VNC Keyboard") kirim_btn = gr.Button("📤 Masuk") kirim_status = gr.HTML("") start_btn.click(start_vnc, outputs=[iframe_display, status_display]) stop_btn.click(stop_vnc, outputs=[iframe_display, status_display]) kirim_btn.click(kirim_teks, inputs=teks_input, outputs=kirim_status) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)