plan291037 commited on
Commit
990bdf1
·
verified ·
1 Parent(s): c3fd4b9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -53
app.py CHANGED
@@ -1,12 +1,6 @@
1
- from fastapi import FastAPI
2
  from pydantic import BaseModel
3
- import threading, queue, time, os
4
-
5
- try:
6
- from pyvirtualdisplay import Display
7
- except Exception:
8
- Display = None
9
-
10
  from seleniumbase import SB
11
 
12
  app = FastAPI()
@@ -18,60 +12,39 @@ url_queue = queue.Queue()
18
  sb_ref = {"driver": None}
19
 
20
  def browser_worker():
21
- display = None
22
- sb = None
23
- try:
24
- try:
25
- sb = SB(uc=True, headless=False, xvfb=True)
26
- except TypeError:
27
- if Display is None:
28
- raise RuntimeError("pyvirtualdisplay not available; cannot start Xvfb")
29
- display = Display(visible=0, size=(1920, 1080))
30
- display.start()
31
- sb = SB(uc=True, headless=False)
32
-
33
- with sb:
34
- sb_ref["driver"] = sb
35
- sb.get("https://www.google.com")
36
- while True:
37
- url = url_queue.get()
38
- try:
39
- print(f"[open] {url}")
40
- sb.get(url)
41
- time.sleep(0.5)
42
- except Exception as e:
43
- print("[error]", e)
44
- finally:
45
- url_queue.task_done()
46
- finally:
47
- try:
48
- if sb:
49
- sb.driver.quit()
50
- except Exception:
51
- pass
52
- if display:
53
  try:
54
- display.stop()
55
- except Exception:
56
- pass
 
 
 
 
 
 
 
 
57
 
58
  @app.get("/cookies")
59
  def get_cookies():
60
  sb = sb_ref.get("driver")
61
- return sb.get_cookies() if sb else []
 
 
62
 
63
  @app.post("/open_url")
64
  async def open_url(request: URLRequest):
 
 
65
  print(f"[queue] {request.url}")
66
  url_queue.put(request.url)
67
  return {"status": "queued", "url": request.url}
68
 
69
- def _start_worker_once():
70
- if not getattr(_start_worker_once, "started", False):
71
- t = threading.Thread(target=browser_worker, daemon=True)
72
- t.start()
73
- _start_worker_once.started = True
74
-
75
- @app.on_event("startup")
76
- def on_startup():
77
- _start_worker_once()
 
1
+ from fastapi import FastAPI, HTTPException
2
  from pydantic import BaseModel
3
+ import threading, queue, time
 
 
 
 
 
 
4
  from seleniumbase import SB
5
 
6
  app = FastAPI()
 
12
  sb_ref = {"driver": None}
13
 
14
  def browser_worker():
15
+ # ใช้เบราว์เซอร์จริง (ไม่ headless) แต่จอถูก Xvfb รับไว้จาก xvfb-run
16
+ # ระบุ browser="chromium" ให้ตรงกับแพ็กเกจที่ติดตั้ง
17
+ with SB(browser="chromium", uc=True, headless=False) as sb:
18
+ sb_ref["driver"] = sb
19
+ sb.get("https://www.google.com")
20
+ while True:
21
+ url = url_queue.get()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  try:
23
+ print(f"[open] {url}")
24
+ sb.get(url)
25
+ time.sleep(0.3)
26
+ except Exception as e:
27
+ print("[error]", e)
28
+ finally:
29
+ url_queue.task_done()
30
+
31
+ @app.get("/healthz")
32
+ def healthz():
33
+ return {"ok": bool(sb_ref.get("driver"))}
34
 
35
  @app.get("/cookies")
36
  def get_cookies():
37
  sb = sb_ref.get("driver")
38
+ if not sb:
39
+ raise HTTPException(503, "Browser not ready")
40
+ return sb.get_cookies()
41
 
42
  @app.post("/open_url")
43
  async def open_url(request: URLRequest):
44
+ if not sb_ref.get("driver"):
45
+ raise HTTPException(503, "Browser not ready")
46
  print(f"[queue] {request.url}")
47
  url_queue.put(request.url)
48
  return {"status": "queued", "url": request.url}
49
 
50
+ threading.Thread(target=browser_worker, daemon=True).start()