plan291037 commited on
Commit
6cf23a0
·
verified ·
1 Parent(s): cb0ae98

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -15
app.py CHANGED
@@ -1,6 +1,12 @@
1
  from fastapi import FastAPI
2
  from pydantic import BaseModel
3
- import threading, queue, time, json
 
 
 
 
 
 
4
  from seleniumbase import SB
5
 
6
  app = FastAPI()
@@ -9,26 +15,50 @@ class URLRequest(BaseModel):
9
  url: str
10
 
11
  url_queue = queue.Queue()
12
- sb_ref = {"driver": None}
13
 
14
  def browser_worker():
15
- with SB(uc=True, headless=False) as sb:
16
- sb_ref["driver"] = sb
17
- sb.get("https://www.google.com")
18
- while True:
19
- url = url_queue.get()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  try:
21
- print(f"[open] {url}")
22
- sb.get(url)
23
- time.sleep(0.5)
24
- except Exception as e:
25
- print("[error]", e)
26
- url_queue.task_done()
27
 
28
  @app.get("/cookies")
29
  def get_cookies():
30
  sb = sb_ref.get("driver")
31
- return sb.get_cookies() if sb else {}
32
 
33
  @app.post("/open_url")
34
  async def open_url(request: URLRequest):
@@ -36,4 +66,12 @@ async def open_url(request: URLRequest):
36
  url_queue.put(request.url)
37
  return {"status": "queued", "url": request.url}
38
 
39
- threading.Thread(target=browser_worker, daemon=True).start()
 
 
 
 
 
 
 
 
 
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()
 
15
  url: str
16
 
17
  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):
 
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()