diff --git a/README.md b/README.md index 46e819e..23240f1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ An alternative to [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) as a drop-in replacement, built with [seleniumbase](https://seleniumbase.io/) and [FastAPI](https://fastapi.tiangolo.com). > [!IMPORTANT] -> Due to recent challenge changes, this software does not guarantee that the Cloudflare challenge will be bypassed. Cloudflare likely requires valid network traffic originating from the user’s public IP address to mark a connection as legitimate. While this tool may bypass the initial browser check, it does not ensure that requests will consistently pass Cloudflare's validation. More testing and data are required to understand how Cloudflare identifies connections and requests as valid. Invalid requests will result in Byparr's looping and eventually time-outing. +> This software does **not** guarantee that any challenge will be bypassed. While this tool passes the initial browser check, Cloudflare and other captcha providers likely require valid network traffic originating from the user’s public IP address to mark a connection as legitimate. If any website does not pass the challenge, please run troubleshooting steps and check if other websites work before you create an GitHub issue. > [!IMPORTANT] > Support for NAS devices (like Synology) is minimal. Please report issues, but do not expect it to be fixed quickly. The only ARM device I have is a free Ampere Oracle VM, so I can only test ARM support on that. See [#22](https://github.com/ThePhaseless/Byparr/issues/22) and [#3](https://github.com/ThePhaseless/Byparr/issues/3) @@ -33,11 +33,11 @@ An alternative to [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) a ## Options -| Env | Default | Description | -| -------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| `USE_XVFB` | `SeleniumBase default` | Use virtual desktop with Xvfb. (Linux only) (Can cause performance hog [#14](https://github.com/ThePhaseless/Byparr/issues/14)) | -| `USE_HEADLESS` | `SeleniumBase default` | Use headless chromium. | -| `PROXY` | None | Proxy to use. (format: `username:password@host:port`) | +| Environment Variable | Default | Description | +| -------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `USE_XVFB` | `SeleniumBase default` | Use virtual desktop with Xvfb. (Linux only) (Can cause performance hog [#14](https://github.com/ThePhaseless/Byparr/issues/14)) | +| `USE_HEADLESS` | `SeleniumBase default` | Use headless chromium. | +| `PROXY` | None | Proxy to use in format: `protocol://username:password@host:port`. [SOCKS5 with authentication is not supported by Chrome](https://stackoverflow.com/questions/75602916/connection-to-private-proxy-socks5-with-chrome-webrequest-onauthrequired-and), see `compose.yaml` file for a workaround | ## Tags diff --git a/compose.yaml b/compose.yaml index f926c0f..8a68076 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,12 +1,23 @@ services: byparr: image: ghcr.io/thephaseless/byparr + restart: unless-stopped build: context: . dockerfile: Dockerfile - environment: - - LOG_LEVEL=INFO + # environment: # Uncomment if using pproxy + # - proxy=http://pproxy:8080 volumes: - ./screenshots:/app/screenshots # For screenshots when exception occurs ports: - "8191:8191" + # # Uncomment the following lines to enable pproxy + # pproxy: + # tty: true # Required for pproxy to work + # container_name: pproxy + # restart: unless-stopped + # image: mosajjal/pproxy:latest + # command: + # - -vv + # - -l http://:8080 + # - -r socks5://host:port#username:password diff --git a/src/utils.py b/src/utils.py index 17ad6a4..1816247 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,7 +1,8 @@ import logging from time import gmtime, strftime -from fastapi import Header +from fastapi import Header, HTTPException +from httpx import codes from sbase import SB, BaseCase from src.consts import LOG_LEVEL, PROXY, USE_HEADLESS @@ -14,18 +15,24 @@ if len(logger.handlers) == 0: def get_sb( proxy: str | None = Header( - default=None, + default=PROXY, examples=["protocol://username:password@host:port"], - description="Override default proxy from env", + description="Override default proxy address", ), ): """Get SeleniumBase instance.""" + if proxy and proxy.startswith("socks5://") and "@" in proxy: + raise HTTPException( + status_code=codes.BAD_REQUEST, + detail="SOCKS5 proxy with authentication is not supported. Check README for more info.", + ) + with SB( uc=True, headless=USE_HEADLESS, locale_code="en", ad_block=True, - proxy=proxy or PROXY, + proxy=proxy, ) as sb: yield sb