diff --git a/README.md b/README.md index 74898c4..16e4884 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,13 @@ | `PROXY_USERNAME` | None | Username for proxy authentication. | | `PROXY_PASSWORD` | None | Password for proxy authentication. | | `OWUI_API_KEY` | None | Bearer token for `/load` endpoint authentication. Must match `EXTERNAL_WEB_LOADER_API_KEY` in Open WebUI. | +| `BROWSER_LOCALE` | None | Override the browser's language with a [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) tag, e.g. `en-US`, `de-DE`, `fr-FR`. When unset, the locale is derived from the egress country. | + +#### Browser language + +Set `BROWSER_LOCALE` to a [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag like `en-US`, `de-DE`, `fr-FR`, `pl-PL`, or `zh-CN` to fix the browser's language and `Accept-Language` header. When unset, Byparr derives the locale from the egress country (e.g. a French proxy → `fr-FR`), keeping the browser language consistent with the exit IP. + +Valid tags are maintained in the [IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). For a friendlier list, see [List of ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (language) combined with an [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) region code for the full tag, e.g. `pt-BR`. ## Proxy Recommendation diff --git a/src/consts.py b/src/consts.py index 207139b..a1f123f 100644 --- a/src/consts.py +++ b/src/consts.py @@ -24,6 +24,7 @@ class Settings(BaseSettings): block_media: bool = False return_only_cookies: bool = False owui_api_key: str | None = None + browser_locale: str | None = None settings = Settings() @@ -45,6 +46,8 @@ RETURN_ONLY_COOKIES = settings.return_only_cookies OWUI_API_KEY = settings.owui_api_key +BROWSER_LOCALE = settings.browser_locale + CHALLENGE_TITLES_MAP: dict[CaptchaType, list[str]] = { # Cloudflare CaptchaType.CLOUDFLARE_INTERSTITIAL: ["Just a moment..."], diff --git a/src/utils.py b/src/utils.py index 5a23d86..e34bca9 100644 --- a/src/utils.py +++ b/src/utils.py @@ -13,6 +13,7 @@ from playwright_captcha import ( from pydantic import BaseModel, Field from src.consts import ( + BROWSER_LOCALE, LOG_LEVEL, MAX_ATTEMPTS, PROXY_PASSWORD, @@ -94,7 +95,7 @@ async def get_browser( headless=True, proxy=proxy_config, humanize=True, - locale="auto", + locale=BROWSER_LOCALE or "auto", ) as browser_raw: # InvisiblePlaywright yields a Browser instance browser = cast("Browser", browser_raw)