Agung1453 commited on
Commit
0550548
Β·
verified Β·
1 Parent(s): 04c2c48

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +145 -0
  2. requirements.txt +2 -0
app.py ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import re
3
+ import gradio as gr
4
+ from e2b_desktop import Sandbox
5
+
6
+ E2B_API_KEY = os.environ.get("E2B_API_KEY")
7
+ if not E2B_API_KEY:
8
+ raise ValueError("E2B_API_KEY belum diset di Secrets Hugging Face.")
9
+
10
+ desktop = None
11
+ vnc_url = None
12
+ vnc_host_port = None
13
+
14
+ def extract_host_port(url):
15
+ m = re.search(r"https?://([^/:]+)(?::(\d+))?", url)
16
+ if m:
17
+ host = m.group(1)
18
+ port = m.group(2) or "5900"
19
+ return f"{host}:{port}"
20
+ return None
21
+
22
+ def start_vnc():
23
+ global desktop, vnc_url, vnc_host_port
24
+ if desktop is None:
25
+ desktop = Sandbox.create(
26
+ template=None,
27
+ resolution=(1024, 768),
28
+ dpi=96,
29
+ allow_internet_access=True
30
+ )
31
+ desktop.stream.start(require_auth=False)
32
+ vnc_url = desktop.stream.get_url()
33
+ vnc_host_port = extract_host_port(vnc_url)
34
+ return (
35
+ f"<iframe src='{vnc_url}' width='100%' height='500px' style='border:none;'></iframe>",
36
+ f"βœ… VNC Started β€” Use RealVNC: {vnc_host_port}"
37
+ )
38
+ else:
39
+ return (
40
+ f"<iframe src='{vnc_url}' width='100%' height='500px' style='border:none;'></iframe>",
41
+ f"⚠️ VNC Already Running β€” Use RealVNC: {vnc_host_port}"
42
+ )
43
+
44
+ def stop_vnc():
45
+ global desktop, vnc_url, vnc_host_port
46
+ if desktop:
47
+ desktop.kill()
48
+ desktop = None
49
+ vnc_url = None
50
+ vnc_host_port = None
51
+ return "<p style='color:red;'>VNC Stopped</p>", "βœ… Sandbox Stopped"
52
+ else:
53
+ return "<p style='color:red;'>No active VNC</p>", "⚠️ Nothing to Stop"
54
+
55
+ def kirim_teks(teks):
56
+ global desktop
57
+ if not teks.strip():
58
+ return "<p style='color:red;'>⚠️ Teks kosong</p>"
59
+ if not desktop:
60
+ return "<p style='color:red;'>❌ VNC belum berjalan</p>"
61
+ try:
62
+ desktop.write(teks)
63
+ desktop.press("enter")
64
+ return f"<p style='color:green;'>βœ… Teks '{teks}' berhasil dikirim</p>"
65
+ except Exception as ex:
66
+ return f"<p style='color:red;'>Error: {ex}</p>"
67
+
68
+ # === FITUR BARU UNTUK BROWSER ===
69
+
70
+ def buka_browser():
71
+ if not desktop:
72
+ return "<p style='color:red;'>❌ VNC belum berjalan</p>"
73
+ try:
74
+ desktop.write("firefox")
75
+ desktop.press("enter")
76
+ return "<p style='color:green;'>βœ… Browser dibuka</p>"
77
+ except Exception as ex:
78
+ return f"<p style='color:red;'>Error: {ex}</p>"
79
+
80
+ def tutup_tab():
81
+ if not desktop:
82
+ return "<p style='color:red;'>❌ VNC belum berjalan</p>"
83
+ try:
84
+ desktop.press("ctrl+w")
85
+ return "<p style='color:green;'>βœ… Tab browser ditutup</p>"
86
+ except Exception as ex:
87
+ return f"<p style='color:red;'>Error: {ex}</p>"
88
+
89
+ def cari_dan_buka(keyword):
90
+ if not desktop:
91
+ return "<p style='color:red;'>❌ VNC belum berjalan</p>"
92
+ try:
93
+ # Ctrl+F untuk membuka search
94
+ desktop.press("ctrl+f")
95
+ desktop.write(keyword)
96
+ desktop.press("enter") # lompat ke hasil
97
+ desktop.press("esc") # tutup search bar
98
+ desktop.press("enter") # tekan tombol yang fokus
99
+ return f"<p style='color:green;'>βœ… Tombol '{keyword}' dicari & dibuka</p>"
100
+ except Exception as ex:
101
+ return f"<p style='color:red;'>Error: {ex}</p>"
102
+
103
+ with gr.Blocks() as demo:
104
+ gr.HTML("<h1 style='text-align:center'>E2B VNC Sandbox</h1>")
105
+
106
+ iframe_display = gr.HTML("<p style='color:gray;'>VNC belum dimulai</p>")
107
+ status_display = gr.Textbox(value="Status: Idle", label="Status / VNC Viewer Address")
108
+
109
+ with gr.Row():
110
+ start_btn = gr.Button("β–Ά Start VNC")
111
+ stop_btn = gr.Button("⏹ Stop VNC")
112
+
113
+ teks_input = gr.Textbox(placeholder="Ketik teks untuk VNC", label="VNC Keyboard")
114
+ kirim_btn = gr.Button("πŸ“€ Masuk")
115
+ kirim_status = gr.HTML("")
116
+
117
+ gr.HTML("<h2>🌐 Kontrol Browser</h2>")
118
+ with gr.Row():
119
+ browser_btn = gr.Button("🌎 Buka Browser")
120
+ tutup_btn = gr.Button("❌ Tutup Tab Browser")
121
+ browser_status = gr.HTML("")
122
+
123
+ with gr.Row():
124
+ open_btn = gr.Button("πŸ” Cari & Klik [OPEN]")
125
+ next_btn = gr.Button("➑️ Cari & Klik [NEXT]")
126
+ with gr.Row():
127
+ goto_btn = gr.Button("πŸ”— Cari & Klik [GO TO LINK]")
128
+ openlink_btn = gr.Button("πŸ”— Cari & Klik [OPEN LINK]")
129
+ find_status = gr.HTML("")
130
+
131
+ # === koneksi tombol ===
132
+ start_btn.click(start_vnc, outputs=[iframe_display, status_display])
133
+ stop_btn.click(stop_vnc, outputs=[iframe_display, status_display])
134
+ kirim_btn.click(kirim_teks, inputs=teks_input, outputs=kirim_status)
135
+
136
+ browser_btn.click(buka_browser, outputs=browser_status)
137
+ tutup_btn.click(tutup_tab, outputs=browser_status)
138
+
139
+ open_btn.click(lambda: cari_dan_buka("OPEN"), outputs=find_status)
140
+ next_btn.click(lambda: cari_dan_buka("NEXT"), outputs=find_status)
141
+ goto_btn.click(lambda: cari_dan_buka("GO TO LINK"), outputs=find_status)
142
+ openlink_btn.click(lambda: cari_dan_buka("OPEN LINK"), outputs=find_status)
143
+
144
+ if __name__ == "__main__":
145
+ demo.launch(server_name="0.0.0.0", server_port=7860)
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio
2
+ e2b-desktop>=2.0.0