plan291037 commited on
Commit
d343076
·
verified ·
1 Parent(s): 9c1e360

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -29
app.py CHANGED
@@ -1,14 +1,12 @@
1
  import os, asyncio
2
  from fastapi import FastAPI, HTTPException, Header, Response
3
  from pydantic import BaseModel, HttpUrl
4
- from selenium import webdriver
5
- from selenium.webdriver.chrome.service import Service
6
- from selenium.webdriver.chrome.options import Options
7
 
8
  API_KEY = os.getenv("OPENER_API_KEY", "")
9
- PROFILE = os.getenv("CHROME_PROFILE_DIR", "/tmp/chrome-profile")
10
  UA = os.getenv("UA", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36")
11
- CHROMEDRIVER = os.getenv("CHROMEDRIVER", "/usr/bin/chromedriver")
12
 
13
  app = FastAPI()
14
  drv = None
@@ -18,27 +16,7 @@ worker = None
18
  class OpenPayload(BaseModel):
19
  url: HttpUrl
20
 
21
- def clean_profile(p):
22
- os.makedirs(p, exist_ok=True)
23
- for n in ("SingletonLock", "SingletonCookie", "SingletonSocket", "DevToolsActivePort"):
24
- f = os.path.join(p, n)
25
- if os.path.exists(f): os.remove(f)
26
-
27
- def build_driver():
28
- clean_profile(PROFILE)
29
- opts = Options()
30
- opts.add_argument("--headless=new")
31
- opts.add_argument("--no-sandbox")
32
- opts.add_argument("--disable-gpu")
33
- opts.add_argument("--disable-dev-shm-usage")
34
- opts.add_argument("--no-first-run")
35
- opts.add_argument("--no-default-browser-check")
36
- opts.add_argument(f"--user-agent={UA}")
37
- opts.add_argument(f"--user-data-dir={PROFILE}")
38
- svc = Service(executable_path=CHROMEDRIVER)
39
- return webdriver.Chrome(service=svc, options=opts)
40
-
41
- async def worker_fn():
42
  while True:
43
  url = await queue.get()
44
  try:
@@ -50,11 +28,19 @@ async def worker_fn():
50
  @app.on_event("startup")
51
  async def startup():
52
  global drv, queue, worker
53
- os.environ["XDG_RUNTIME_DIR"] = "/tmp"
54
- drv = build_driver()
 
 
 
 
 
 
 
 
55
  drv.get("data:text/html,ready")
56
  queue = asyncio.Queue()
57
- worker = asyncio.create_task(worker_fn())
58
  print("[startup] browser ready")
59
 
60
  @app.on_event("shutdown")
 
1
  import os, asyncio
2
  from fastapi import FastAPI, HTTPException, Header, Response
3
  from pydantic import BaseModel, HttpUrl
4
+ import undetected_chromedriver as uc
 
 
5
 
6
  API_KEY = os.getenv("OPENER_API_KEY", "")
7
+ PROFILE = os.getenv("UC_PROFILE_DIR", "/tmp/uc-profile")
8
  UA = os.getenv("UA", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36")
9
+ CHROME_BIN = os.getenv("CHROME_BIN", "/usr/bin/chromium")
10
 
11
  app = FastAPI()
12
  drv = None
 
16
  class OpenPayload(BaseModel):
17
  url: HttpUrl
18
 
19
+ async def _worker():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  while True:
21
  url = await queue.get()
22
  try:
 
28
  @app.on_event("startup")
29
  async def startup():
30
  global drv, queue, worker
31
+ os.makedirs(PROFILE, exist_ok=True)
32
+ o = uc.ChromeOptions()
33
+ o.headless = True
34
+ o.binary_location = CHROME_BIN
35
+ o.add_argument(f"--user-data-dir={PROFILE}")
36
+ o.add_argument("--no-sandbox")
37
+ o.add_argument("--disable-dev-shm-usage")
38
+ o.add_argument("--disable-gpu")
39
+ o.add_argument(f"--user-agent={UA}")
40
+ drv = uc.Chrome(options=o, use_subprocess=True)
41
  drv.get("data:text/html,ready")
42
  queue = asyncio.Queue()
43
+ worker = asyncio.create_task(_worker())
44
  print("[startup] browser ready")
45
 
46
  @app.on_event("shutdown")