From cd4df1e061c1fa33d5385d9310e485e8f1e1d03d Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sun, 5 Nov 2023 14:41:12 +0000 Subject: [PATCH 01/30] Bump version 3.3.7 (#944) --- CHANGELOG.md | 6 +++++- Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5149c..1c55f47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -## v3.3.5 (2023/09/15) +## v3.3.7 (2023/11/05) + +* Bump to rebuild. Thanks @JoachimDorchies + +## v3.3.6 (2023/09/15) * Update checkbox selector, again diff --git a/Dockerfile b/Dockerfile index 5c0b670..0dc0bc1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.6 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.6 +# docker build -t ngosang/flaresolverr:3.3.7 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.7 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.6 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.7 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.6 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.6 +# docker buildx build -t ngosang/flaresolverr:3.3.7 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.7 diff --git a/package.json b/package.json index bac0518..e5191ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.6", + "version": "3.3.7", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From 5085ca69902afb870d56ffddd965dfbec606b003 Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Mon, 13 Nov 2023 07:33:56 +0330 Subject: [PATCH 02/30] Fix headless=true for Chrome 117+. Fixes #910 (#921) --- src/utils.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/utils.py b/src/utils.py index 79cf6f6..73c21f3 100644 --- a/src/utils.py +++ b/src/utils.py @@ -113,7 +113,7 @@ def create_proxy_extension(proxy: dict) -> str: def get_webdriver(proxy: dict = None) -> WebDriver: - global PATCHED_DRIVER_PATH + global PATCHED_DRIVER_PATH, USER_AGENT logging.debug('Launching web browser...') # undetected_chromedriver @@ -136,6 +136,10 @@ def get_webdriver(proxy: dict = None) -> WebDriver: # https://peter.sh/experiments/chromium-command-line-switches/#use-gl options.add_argument('--use-gl=swiftshader') + # Fix for Chrome 117 | https://github.com/FlareSolverr/FlareSolverr/issues/910 + if USER_AGENT is not None: + options.add_argument('--user-agent=%s' % USER_AGENT) + proxy_extension_dir = None if proxy and all(key in proxy for key in ['url', 'username', 'password']): proxy_extension_dir = create_proxy_extension(proxy) @@ -295,6 +299,8 @@ def get_user_agent(driver=None) -> str: if driver is None: driver = get_webdriver() USER_AGENT = driver.execute_script("return navigator.userAgent") + # Fix for Chrome 117 | https://github.com/FlareSolverr/FlareSolverr/issues/910 + USER_AGENT = re.sub('HEADLESS', '', USER_AGENT, flags=re.IGNORECASE) return USER_AGENT except Exception as e: raise Exception("Error getting browser User-Agent. " + str(e)) From 04858c22fd1b84d04b1af992dfdbb3a4f07c1dd0 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 13 Nov 2023 04:23:06 +0000 Subject: [PATCH 03/30] Support running Chrome 119 from source (#960) --- src/undetected_chromedriver/__init__.py | 6 ++---- src/undetected_chromedriver/patcher.py | 12 +++++++++++- src/utils.py | 4 ---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/undetected_chromedriver/__init__.py b/src/undetected_chromedriver/__init__.py index 4d2e85a..5ae4f4a 100644 --- a/src/undetected_chromedriver/__init__.py +++ b/src/undetected_chromedriver/__init__.py @@ -464,11 +464,9 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): ) self.browser_pid = browser.pid - # Fix for Chrome 115 - # https://github.com/seleniumbase/SeleniumBase/pull/1967 + service = selenium.webdriver.chromium.service.ChromiumService( - executable_path=self.patcher.executable_path, - service_args=["--disable-build-check"] + self.patcher.executable_path ) super(Chrome, self).__init__( diff --git a/src/undetected_chromedriver/patcher.py b/src/undetected_chromedriver/patcher.py index 5776d19..b388954 100644 --- a/src/undetected_chromedriver/patcher.py +++ b/src/undetected_chromedriver/patcher.py @@ -62,7 +62,17 @@ class Patcher(object): prefix = "undetected" self.user_multi_procs = user_multi_procs - self.is_old_chromedriver = version_main and version_main <= 114 + try: + # Try to convert version_main into an integer + version_main_int = int(version_main) + # check if version_main_int is less than or equal to e.g 114 + self.is_old_chromedriver = version_main and version_main_int <= 114 + except ValueError: + # If the conversion fails, print an error message + print("version_main cannot be converted to an integer") + # Set self.is_old_chromedriver to False if the conversion fails + self.is_old_chromedriver = False + # Needs to be called before self.exe_name is accessed self._set_platform_name() diff --git a/src/utils.py b/src/utils.py index 73c21f3..86bd6ad 100644 --- a/src/utils.py +++ b/src/utils.py @@ -166,10 +166,6 @@ def get_webdriver(proxy: dict = None) -> WebDriver: driver_exe_path = "/app/chromedriver" else: version_main = get_chrome_major_version() - # Fix for Chrome 115 - # https://github.com/seleniumbase/SeleniumBase/pull/1967 - if int(version_main) > 114: - version_main = 114 if PATCHED_DRIVER_PATH is not None: driver_exe_path = PATCHED_DRIVER_PATH From 3fa9631559485ac484b9b1a8031f50956b36477f Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 13 Nov 2023 04:28:19 +0000 Subject: [PATCH 04/30] Fix "OSError: [WinError 6] The handle is invalid" on exit --- src/undetected_chromedriver/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/undetected_chromedriver/__init__.py b/src/undetected_chromedriver/__init__.py index 5ae4f4a..af92b73 100644 --- a/src/undetected_chromedriver/__init__.py +++ b/src/undetected_chromedriver/__init__.py @@ -811,7 +811,11 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): else: logger.debug("successfully removed %s" % self.user_data_dir) break - time.sleep(0.1) + + try: + time.sleep(0.1) + except OSError: + pass # dereference patcher, so patcher can start cleaning up as well. # this must come last, otherwise it will throw 'in use' errors From ab4365894bba880bb91f9c6fbbfee838c3d30f5d Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 13 Nov 2023 04:55:49 +0000 Subject: [PATCH 05/30] Bump version 3.3.8 (#961) --- CHANGELOG.md | 6 ++++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c55f47..b0b617e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v3.3.8 (2023/11/13) + +* Fix headless=true for Chrome 117+. Thanks @NabiKAZ +* Support running Chrome 119 from source. Thanks @koleg and @Chris7X +* Fix "OSError: [WinError 6] The handle is invalid" on exit. Thanks @enesgorkemgenc + ## v3.3.7 (2023/11/05) * Bump to rebuild. Thanks @JoachimDorchies diff --git a/Dockerfile b/Dockerfile index 0dc0bc1..702c07a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.7 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.7 +# docker build -t ngosang/flaresolverr:3.3.8 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.8 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.7 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.8 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.7 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.7 +# docker buildx build -t ngosang/flaresolverr:3.3.8 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.8 diff --git a/package.json b/package.json index e5191ea..5fe1f70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.7", + "version": "3.3.8", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From d772cf3f505f98eaf6f56f8d3eea586bca203cf9 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 13 Nov 2023 07:14:13 +0000 Subject: [PATCH 06/30] Fix for Docker build, capture TypeError. Fixes #962 --- src/undetected_chromedriver/patcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/undetected_chromedriver/patcher.py b/src/undetected_chromedriver/patcher.py index b388954..78b7617 100644 --- a/src/undetected_chromedriver/patcher.py +++ b/src/undetected_chromedriver/patcher.py @@ -67,7 +67,7 @@ class Patcher(object): version_main_int = int(version_main) # check if version_main_int is less than or equal to e.g 114 self.is_old_chromedriver = version_main and version_main_int <= 114 - except ValueError: + except (ValueError,TypeError): # If the conversion fails, print an error message print("version_main cannot be converted to an integer") # Set self.is_old_chromedriver to False if the conversion fails From 220f2599aebf2ef18e1220f97162c30252d84c92 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 13 Nov 2023 07:17:28 +0000 Subject: [PATCH 07/30] Bump version 3.3.9 (#963) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0b617e..f45a90b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.9 (2023/11/13) + +* Fix for Docker build, capture TypeError + ## v3.3.8 (2023/11/13) * Fix headless=true for Chrome 117+. Thanks @NabiKAZ diff --git a/Dockerfile b/Dockerfile index 702c07a..63ba494 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.8 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.8 +# docker build -t ngosang/flaresolverr:3.3.9 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.9 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.8 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.9 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.8 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.8 +# docker buildx build -t ngosang/flaresolverr:3.3.9 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.9 diff --git a/package.json b/package.json index 5fe1f70..fd6a1ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.8", + "version": "3.3.9", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From 8d7ed48f217aa4afe5eb6d0ae4e9c62b37b3a35b Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Tue, 14 Nov 2023 03:56:57 +0000 Subject: [PATCH 08/30] Add LANG ENV. resolves #951 --- src/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/utils.py b/src/utils.py index 86bd6ad..dc71e3b 100644 --- a/src/utils.py +++ b/src/utils.py @@ -136,6 +136,10 @@ def get_webdriver(proxy: dict = None) -> WebDriver: # https://peter.sh/experiments/chromium-command-line-switches/#use-gl options.add_argument('--use-gl=swiftshader') + language = os.environ.get('LANG', None) + if language is not None: + options.add_argument('--lang=%s' % language) + # Fix for Chrome 117 | https://github.com/FlareSolverr/FlareSolverr/issues/910 if USER_AGENT is not None: options.add_argument('--user-agent=%s' % USER_AGENT) From daec97532d7ba83ea28981444190d922f47f3629 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Tue, 14 Nov 2023 04:00:01 +0000 Subject: [PATCH 09/30] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 845ab77..68fa53d 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,7 @@ This is the same as `request.get` but it takes one more param: | LOG_HTML | false | Only for debugging. If `true` all HTML that passes through the proxy will be logged to the console in `debug` level. | | CAPTCHA_SOLVER | none | Captcha solving method. It is used when a captcha is encountered. See the Captcha Solvers section. | | TZ | UTC | Timezone used in the logs and the web browser. Example: `TZ=Europe/London`. | +| LANG | none | Language used in the web browser. Example: `LANG=fr_FR`. | | HEADLESS | true | Only for debugging. To run the web browser in headless mode or visible. | | BROWSER_TIMEOUT | 40000 | If you are experiencing errors/timeouts because your system is slow, you can try to increase this value. Remember to increase the `maxTimeout` parameter too. | | TEST_URL | https://www.google.com | FlareSolverr makes a request on start to make sure the web browser is working. You can change that URL if it is blocked in your country. | From 7af311b73cec62077eb5e1a62b6a7a64dd7305e8 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Tue, 14 Nov 2023 04:04:42 +0000 Subject: [PATCH 10/30] Bump version 3.3.10 (#969) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f45a90b..d74aa4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.10 (2023/11/14) + +* Add LANG ENV - resolves issues with YGGtorrent + ## v3.3.9 (2023/11/13) * Fix for Docker build, capture TypeError diff --git a/Dockerfile b/Dockerfile index 63ba494..501389c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.9 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.9 +# docker build -t ngosang/flaresolverr:3.3.10 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.10 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.9 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.10 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.9 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.9 +# docker buildx build -t ngosang/flaresolverr:3.3.10 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.10 diff --git a/package.json b/package.json index fd6a1ca..6e2e72d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.9", + "version": "3.3.10", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From 16c8ab5f3da3030121b98de885bcac8b4d564f22 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Tue, 14 Nov 2023 07:54:09 +0000 Subject: [PATCH 11/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68fa53d..1aada89 100644 --- a/README.md +++ b/README.md @@ -232,7 +232,7 @@ This is the same as `request.get` but it takes one more param: | LOG_HTML | false | Only for debugging. If `true` all HTML that passes through the proxy will be logged to the console in `debug` level. | | CAPTCHA_SOLVER | none | Captcha solving method. It is used when a captcha is encountered. See the Captcha Solvers section. | | TZ | UTC | Timezone used in the logs and the web browser. Example: `TZ=Europe/London`. | -| LANG | none | Language used in the web browser. Example: `LANG=fr_FR`. | +| LANG | none | Language used in the web browser. Example: `LANG=en_GB`. | | HEADLESS | true | Only for debugging. To run the web browser in headless mode or visible. | | BROWSER_TIMEOUT | 40000 | If you are experiencing errors/timeouts because your system is slow, you can try to increase this value. Remember to increase the `maxTimeout` parameter too. | | TEST_URL | https://www.google.com | FlareSolverr makes a request on start to make sure the web browser is working. You can change that URL if it is blocked in your country. | From f7e316fd5a6618596d03816198b1127f6d1a6156 Mon Sep 17 00:00:00 2001 From: txtsd Date: Mon, 11 Dec 2023 20:51:16 +0000 Subject: [PATCH 12/30] updates: UC 3.5.4 & Selenium 4.15.2 (#970) Co-authored-by: GaspardRuan <1039553124@qq.com> Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- requirements.txt | 2 +- src/undetected_chromedriver/__init__.py | 6 +++--- src/utils.py | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index af8845a..212df01 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ bottle==0.12.25 waitress==2.1.2 -selenium==4.11.2 +selenium==4.15.2 func-timeout==4.3.5 prometheus-client==0.17.1 # required by undetected_chromedriver diff --git a/src/undetected_chromedriver/__init__.py b/src/undetected_chromedriver/__init__.py index af92b73..9bd9823 100644 --- a/src/undetected_chromedriver/__init__.py +++ b/src/undetected_chromedriver/__init__.py @@ -17,7 +17,7 @@ by UltrafunkAmsterdam (https://github.com/ultrafunkamsterdam) from __future__ import annotations -__version__ = "3.5.3" +__version__ = "3.5.4" import json import logging @@ -396,7 +396,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): if no_sandbox: options.arguments.extend(["--no-sandbox", "--test-type"]) - if headless or options.headless: + if headless or getattr(options, 'headless', None): #workaround until a better checking is found try: v_main = int(self.patcher.version_main) if self.patcher.version_main else 108 @@ -491,7 +491,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): else: self._web_element_cls = WebElement - if options.headless: + if headless or getattr(options, 'headless', None): self._configure_headless() def _configure_headless(self): diff --git a/src/utils.py b/src/utils.py index dc71e3b..3672511 100644 --- a/src/utils.py +++ b/src/utils.py @@ -153,7 +153,7 @@ def get_webdriver(proxy: dict = None) -> WebDriver: logging.debug("Using webdriver proxy: %s", proxy_url) options.add_argument('--proxy-server=%s' % proxy_url) - # note: headless mode is detected (options.headless = True) + # note: headless mode is detected (headless = True) # we launch the browser in head-full mode with the window hidden windows_headless = False if get_config_headless(): @@ -161,6 +161,8 @@ def get_webdriver(proxy: dict = None) -> WebDriver: windows_headless = True else: start_xvfb_display() + # For normal headless mode: + # options.add_argument('--headless') # if we are inside the Docker container, we avoid downloading the driver driver_exe_path = None From 745c69491f9c794b888e990b7913c8a507ee3157 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Mon, 11 Dec 2023 20:56:14 +0000 Subject: [PATCH 13/30] Bump version 3.3.11 (#999) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d74aa4f..d9b9b4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.11 (2023/12/11) + +* Update UC 3.5.4 & Selenium 4.15.2. Thanks @txtsd + ## v3.3.10 (2023/11/14) * Add LANG ENV - resolves issues with YGGtorrent diff --git a/Dockerfile b/Dockerfile index 501389c..9e5b06c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.10 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.10 +# docker build -t ngosang/flaresolverr:3.3.11 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.11 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.10 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.11 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.10 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.10 +# docker buildx build -t ngosang/flaresolverr:3.3.11 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.11 diff --git a/package.json b/package.json index 6e2e72d..7de4537 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.10", + "version": "3.3.11", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From 1c855b8af0b0e4ea4d80b4950fec974fbcd02fc8 Mon Sep 17 00:00:00 2001 From: 21hsmw <153914136+21hsmw@users.noreply.github.com> Date: Fri, 15 Dec 2023 22:11:58 +0000 Subject: [PATCH 14/30] Fix looping challenges and invalid cookies. resolves #1006 (#1010) Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- src/flaresolverr_service.py | 3 +++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9b9b4a..65d34df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.12 (2023/12/15) + +* Fix looping challenges and invalid cookies + ## v3.3.11 (2023/12/11) * Update UC 3.5.4 & Selenium 4.15.2. Thanks @txtsd diff --git a/Dockerfile b/Dockerfile index 9e5b06c..562e000 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.11 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.11 +# docker build -t ngosang/flaresolverr:3.3.12 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.12 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.11 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.12 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.11 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.11 +# docker buildx build -t ngosang/flaresolverr:3.3.12 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.12 diff --git a/package.json b/package.json index 7de4537..01758e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.11", + "version": "3.3.12", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" diff --git a/src/flaresolverr_service.py b/src/flaresolverr_service.py index acc920b..6415104 100644 --- a/src/flaresolverr_service.py +++ b/src/flaresolverr_service.py @@ -294,6 +294,9 @@ def _evil_logic(req: V1RequestBase, driver: WebDriver, method: str) -> Challenge # navigate to the page logging.debug(f'Navigating to... {req.url}') + # Workaround for "challenge not detected" caused by the devtools window + driver.get(req.url) + driver.start_session() # required to bypass Cloudflare if method == 'POST': _post_request(req, driver) else: From a4d42d783426fbf1146e56fa93c57808b86d3b1e Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:33:06 +0000 Subject: [PATCH 15/30] Remove unnecessary comment --- src/flaresolverr_service.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/flaresolverr_service.py b/src/flaresolverr_service.py index 6415104..6cef3e4 100644 --- a/src/flaresolverr_service.py +++ b/src/flaresolverr_service.py @@ -294,7 +294,6 @@ def _evil_logic(req: V1RequestBase, driver: WebDriver, method: str) -> Challenge # navigate to the page logging.debug(f'Navigating to... {req.url}') - # Workaround for "challenge not detected" caused by the devtools window driver.get(req.url) driver.start_session() # required to bypass Cloudflare if method == 'POST': From 993b8c41ac99f0a02878de15801bcfec91c8f24a Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:22:14 +0000 Subject: [PATCH 16/30] Fix too many open files error. resolves #983 (#1033) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- src/undetected_chromedriver/dprocess.py | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65d34df..a7a18f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.13 (2024/01/07) + +* Fix too many open files error + ## v3.3.12 (2023/12/15) * Fix looping challenges and invalid cookies diff --git a/Dockerfile b/Dockerfile index 562e000..791e144 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.12 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.12 +# docker build -t ngosang/flaresolverr:3.3.13 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.13 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.12 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.13 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.12 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.12 +# docker buildx build -t ngosang/flaresolverr:3.3.13 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.13 diff --git a/package.json b/package.json index 01758e6..531f810 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.12", + "version": "3.3.13", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" diff --git a/src/undetected_chromedriver/dprocess.py b/src/undetected_chromedriver/dprocess.py index 0fb93a8..6d053fa 100644 --- a/src/undetected_chromedriver/dprocess.py +++ b/src/undetected_chromedriver/dprocess.py @@ -41,6 +41,7 @@ def start_detached(executable, *args): # close pipes writer.close() reader.close() + process.close() return pid From df06d13cf8f9e4ea71a22057af12e570ff3e98d4 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Fri, 12 Jan 2024 23:38:18 +0000 Subject: [PATCH 17/30] Update README.md --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1aada89..b5208fc 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ We provide an example Systemd unit file `flaresolverr.service` as reference. You ## Usage -Example request: +Example Bash request: ```bash curl -L -X POST 'http://localhost:8191/v1' \ -H 'Content-Type: application/json' \ @@ -100,6 +100,21 @@ curl -L -X POST 'http://localhost:8191/v1' \ }' ``` +Example Python request: +```py +import requests + +url = "http://localhost:8191/v1" +headers = {"Content-Type": "application/json"} +data = { + "cmd": "request.get", + "url": "http://www.google.com/", + "maxTimeout": 60000 +} +response = requests.post(url, headers=headers, json=data) +print(response.text) +``` + ### Commands #### + `sessions.create` From e6a08584c05579e5ff0dedf6ca8f6d7ae57dcdc5 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Fri, 16 Feb 2024 04:35:37 +0000 Subject: [PATCH 18/30] Update README.md thanks @kimboslice99 --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b5208fc..38526fc 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,17 @@ response = requests.post(url, headers=headers, json=data) print(response.text) ``` +Example PowerShell request: +```ps1 +$body = @{ + cmd = "request.get" + url = "http://www.google.com/" + maxTimeout = 60000 +} | ConvertTo-Json + +irm -UseBasicParsing 'http://localhost:8191/v1' -Headers @{"Content-Type"="application/json"} -Method Post -Body $body +``` + ### Commands #### + `sessions.create` From 227bd7ac72ad390de52dd12fc5cd7e81498beb2e Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sat, 17 Feb 2024 00:50:14 +0000 Subject: [PATCH 19/30] Update Chrome downloads (#1070) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- src/build_package.py | 2 +- src/undetected_chromedriver/patcher.py | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7a18f2..b0eef1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.14 (2024/02/17) + +* Update Chrome downloads. Thanks @opemvbs + ## v3.3.13 (2024/01/07) * Fix too many open files error diff --git a/Dockerfile b/Dockerfile index 791e144..97d21ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.13 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.13 +# docker build -t ngosang/flaresolverr:3.3.14 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.13 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.14 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.13 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.13 +# docker buildx build -t ngosang/flaresolverr:3.3.14 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14 diff --git a/package.json b/package.json index 531f810..a551f80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.13", + "version": "3.3.14", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" diff --git a/src/build_package.py b/src/build_package.py index db85a30..5462a7b 100644 --- a/src/build_package.py +++ b/src/build_package.py @@ -25,7 +25,7 @@ def clean_files(): def download_chromium(): # https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/ - revision = "1140001" if os.name == 'nt' else '1140000' + revision = "1250005" if os.name == 'nt' else '1250006' arch = 'Win_x64' if os.name == 'nt' else 'Linux_x64' dl_file = 'chrome-win' if os.name == 'nt' else 'chrome-linux' dl_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist_chrome') diff --git a/src/undetected_chromedriver/patcher.py b/src/undetected_chromedriver/patcher.py index 78b7617..4114e56 100644 --- a/src/undetected_chromedriver/patcher.py +++ b/src/undetected_chromedriver/patcher.py @@ -290,7 +290,7 @@ class Patcher(object): download_url = "%s/%s/%s" % (self.url_repo, self.version_full.vstring, zip_name) else: zip_name = zip_name.replace("_", "-", 1) - download_url = "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/%s/%s/%s" + download_url = "https://storage.googleapis.com/chrome-for-testing-public/%s/%s/%s" download_url %= (self.version_full.vstring, self.platform_name, zip_name) logger.debug("downloading from %s" % download_url) From 3ca6d08f4160273380b81eb9949ee72897c8bdeb Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sat, 17 Feb 2024 01:15:32 +0000 Subject: [PATCH 20/30] Hotfix for Linux build - some Chrome files no longer exist (#1071) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- src/build_package.py | 3 +-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0eef1a..4c69c29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.14-hotfix (2024/02/17) + +* Hotfix for Linux build - some Chrome files no longer exist + ## v3.3.14 (2024/02/17) * Update Chrome downloads. Thanks @opemvbs diff --git a/Dockerfile b/Dockerfile index 97d21ac..f615072 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.14 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14 +# docker build -t ngosang/flaresolverr:3.3.14-hotfix . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14-hotfix # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14 +# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14-hotfix diff --git a/package.json b/package.json index a551f80..8dfe3fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.14", + "version": "3.3.14-hotfix", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" diff --git a/src/build_package.py b/src/build_package.py index 5462a7b..94b6416 100644 --- a/src/build_package.py +++ b/src/build_package.py @@ -59,8 +59,7 @@ def download_chromium(): # Give executable permissions for *nix # file * | grep executable | cut -d: -f1 print("Giving executable permissions...") - execs = ['chrome', 'chrome_crashpad_handler', 'chrome_sandbox', 'chrome-wrapper', 'nacl_helper', - 'nacl_helper_bootstrap', 'nacl_irt_x86_64.nexe', 'xdg-mime', 'xdg-settings'] + execs = ['chrome', 'chrome_crashpad_handler', 'chrome_sandbox', 'chrome-wrapper', 'xdg-mime', 'xdg-settings'] for exec_file in execs: exec_path = os.path.join(chrome_path, exec_file) os.chmod(exec_path, 0o755) From d21a332519de6f9dfc6bdc875d112930e7f475ca Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sat, 17 Feb 2024 05:53:45 +0000 Subject: [PATCH 21/30] Hotfix 2 - bad Chromium build, instances failed to terminate (#1072) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- src/build_package.py | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c69c29..3a974e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.14-hotfix2 (2024/02/17) + +* Hotfix 2 - bad Chromium build, instances failed to terminate + ## v3.3.14-hotfix (2024/02/17) * Hotfix for Linux build - some Chrome files no longer exist diff --git a/Dockerfile b/Dockerfile index f615072..0ffd16e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.14-hotfix . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14-hotfix +# docker build -t ngosang/flaresolverr:3.3.14-hotfix2 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14-hotfix2 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix2 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14-hotfix +# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix2 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14-hotfix2 diff --git a/package.json b/package.json index 8dfe3fd..0cac948 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.14-hotfix", + "version": "3.3.14-hotfix2", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" diff --git a/src/build_package.py b/src/build_package.py index 94b6416..5ff4956 100644 --- a/src/build_package.py +++ b/src/build_package.py @@ -25,7 +25,7 @@ def clean_files(): def download_chromium(): # https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/ - revision = "1250005" if os.name == 'nt' else '1250006' + revision = "1260008" if os.name == 'nt' else '1260015' arch = 'Win_x64' if os.name == 'nt' else 'Linux_x64' dl_file = 'chrome-win' if os.name == 'nt' else 'chrome-linux' dl_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist_chrome') From 043f18b231b4f409080b2b5c4421ce0f4cac7dec Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Sat, 17 Feb 2024 19:28:06 +0000 Subject: [PATCH 22/30] Bump UC version to 3.5.5 --- src/undetected_chromedriver/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/undetected_chromedriver/__init__.py b/src/undetected_chromedriver/__init__.py index 9bd9823..755f7a4 100644 --- a/src/undetected_chromedriver/__init__.py +++ b/src/undetected_chromedriver/__init__.py @@ -17,7 +17,7 @@ by UltrafunkAmsterdam (https://github.com/ultrafunkamsterdam) from __future__ import annotations -__version__ = "3.5.4" +__version__ = "3.5.5" import json import logging From 800866d03390c70c14c4caa0955080284ca3b604 Mon Sep 17 00:00:00 2001 From: Tadas Gedgaudas <83356979+tadasgedgaudas@users.noreply.github.com> Date: Wed, 21 Feb 2024 01:41:02 +0200 Subject: [PATCH 23/30] Fix looping challenges. #1036 (#1065) Co-authored-by: Tadas Gedgaudas Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- src/flaresolverr_service.py | 28 ++++++++++++++++++++++------ src/utils.py | 2 ++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/flaresolverr_service.py b/src/flaresolverr_service.py index 6cef3e4..0987fed 100644 --- a/src/flaresolverr_service.py +++ b/src/flaresolverr_service.py @@ -287,20 +287,35 @@ def click_verify(driver: WebDriver): time.sleep(2) +def get_correct_window(driver: WebDriver) -> WebDriver: + if len(driver.window_handles) > 1: + for window_handle in driver.window_handles: + driver.switch_to.window(window_handle) + current_url = driver.current_url + if not current_url.startswith("devtools://devtools"): + return driver + return driver + + +def access_page(driver: WebDriver, url: str) -> None: + driver.get(url) + driver.start_session() + driver.start_session() # required to bypass Cloudflare + + def _evil_logic(req: V1RequestBase, driver: WebDriver, method: str) -> ChallengeResolutionT: res = ChallengeResolutionT({}) res.status = STATUS_OK res.message = "" + # navigate to the page logging.debug(f'Navigating to... {req.url}') - driver.get(req.url) - driver.start_session() # required to bypass Cloudflare if method == 'POST': _post_request(req, driver) else: - driver.get(req.url) - driver.start_session() # required to bypass Cloudflare + access_page(driver, req.url) + driver = get_correct_window(driver) # set cookies if required if req.cookies is not None and len(req.cookies) > 0: @@ -312,8 +327,8 @@ def _evil_logic(req: V1RequestBase, driver: WebDriver, method: str) -> Challenge if method == 'POST': _post_request(req, driver) else: - driver.get(req.url) - driver.start_session() # required to bypass Cloudflare + access_page(driver, req.url) + driver = get_correct_window(driver) # wait for the page if utils.get_config_log_html(): @@ -433,4 +448,5 @@ def _post_request(req: V1RequestBase, driver: WebDriver): """ driver.get("data:text/html;charset=utf-8," + html_content) + driver.start_session() driver.start_session() # required to bypass Cloudflare diff --git a/src/utils.py b/src/utils.py index 3672511..b812387 100644 --- a/src/utils.py +++ b/src/utils.py @@ -164,6 +164,8 @@ def get_webdriver(proxy: dict = None) -> WebDriver: # For normal headless mode: # options.add_argument('--headless') + options.add_argument("--auto-open-devtools-for-tabs") + # if we are inside the Docker container, we avoid downloading the driver driver_exe_path = None version_main = None From aaf29be8e169c170de4df9502a516b93e94c9648 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Tue, 20 Feb 2024 23:48:23 +0000 Subject: [PATCH 24/30] Bump version 3.3.15 (#1088) --- CHANGELOG.md | 4 ++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a974e1..b215861 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v3.3.15 (2024/02/20) + +* Fix looping challenges + ## v3.3.14-hotfix2 (2024/02/17) * Hotfix 2 - bad Chromium build, instances failed to terminate diff --git a/Dockerfile b/Dockerfile index 0ffd16e..2bbacda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.14-hotfix2 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.14-hotfix2 +# docker build -t ngosang/flaresolverr:3.3.15 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.15 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix2 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.15 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.14-hotfix2 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.14-hotfix2 +# docker buildx build -t ngosang/flaresolverr:3.3.15 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.15 diff --git a/package.json b/package.json index 0cac948..fcfa5c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.14-hotfix2", + "version": "3.3.15", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From c5a5f6d65e95540c4f70dd8ae932297c7b50ce4a Mon Sep 17 00:00:00 2001 From: Xewdy Date: Wed, 21 Feb 2024 15:14:25 -0600 Subject: [PATCH 25/30] Add platform specifiers to dependencies (#877) --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 212df01..fc002d1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ prometheus-client==0.17.1 requests==2.31.0 certifi==2023.7.22 websockets==11.0.3 -# only required for linux -xvfbwrapper==0.2.9 +# only required for linux and macos +xvfbwrapper==0.2.9; platform_system != "Windows" # only required for windows -pefile==2023.2.7 +pefile==2023.2.7; platform_system == "Windows" From 0bc7a4498c0c19aaf051458c6e3333cc127b348b Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Fri, 23 Feb 2024 05:01:00 +0000 Subject: [PATCH 26/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38526fc..a88e69e 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ curl -L -X POST 'http://localhost:8191/v1' \ -H 'Content-Type: application/json' \ --data-raw '{ "cmd": "request.get", - "url":"http://www.google.com/", + "url": "http://www.google.com/", "maxTimeout": 60000 }' ``` From afdc1c7a8e6cbb693fb790a0cdcb3650015c2ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl?= Date: Wed, 28 Feb 2024 03:45:04 +0100 Subject: [PATCH 27/30] Add FreeBSD support (#1054) --- README.md | 7 +++ src/undetected_chromedriver/__init__.py | 4 +- src/undetected_chromedriver/patcher.py | 84 ++++++++++++++++++------- src/utils.py | 10 ++- 4 files changed, 78 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index a88e69e..be86f32 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,13 @@ This is the recommended way for Windows users. * Run `pip install -r requirements.txt` command to install FlareSolverr dependencies. * Run `python src/flaresolverr.py` command to start FlareSolverr. +### From source code (FreeBSD/TrueNAS CORE) + +* Run `pkg install chromium python39 py39-pip xorg-vfbserver` command to install the required dependencies. +* Clone this repository and open a shell in that path. +* Run `python3.9 -m pip install -r requirements.txt` command to install FlareSolverr dependencies. +* Run `python3.9 src/flaresolverr.py` command to start FlareSolverr. + ### Systemd service We provide an example Systemd unit file `flaresolverr.service` as reference. You have to modify the file to suit your needs: paths, user and environment variables. diff --git a/src/undetected_chromedriver/__init__.py b/src/undetected_chromedriver/__init__.py index 755f7a4..1382758 100644 --- a/src/undetected_chromedriver/__init__.py +++ b/src/undetected_chromedriver/__init__.py @@ -451,8 +451,10 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver): options.binary_location, *options.arguments ) else: - startupinfo = subprocess.STARTUPINFO() + startupinfo = None if os.name == 'nt' and windows_headless: + # STARTUPINFO() is Windows only + startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW browser = subprocess.Popen( [options.binary_location, *options.arguments], diff --git a/src/undetected_chromedriver/patcher.py b/src/undetected_chromedriver/patcher.py index 4114e56..a6eeab2 100644 --- a/src/undetected_chromedriver/patcher.py +++ b/src/undetected_chromedriver/patcher.py @@ -21,7 +21,7 @@ from multiprocessing import Lock logger = logging.getLogger(__name__) -IS_POSIX = sys.platform.startswith(("darwin", "cygwin", "linux", "linux2")) +IS_POSIX = sys.platform.startswith(("darwin", "cygwin", "linux", "linux2", "freebsd")) class Patcher(object): @@ -80,9 +80,14 @@ class Patcher(object): os.makedirs(self.data_path, exist_ok=True) if not executable_path: - self.executable_path = os.path.join( - self.data_path, "_".join([prefix, self.exe_name]) - ) + if sys.platform.startswith("freebsd"): + self.executable_path = os.path.join( + self.data_path, self.exe_name + ) + else: + self.executable_path = os.path.join( + self.data_path, "_".join([prefix, self.exe_name]) + ) if not IS_POSIX: if executable_path: @@ -127,6 +132,9 @@ class Patcher(object): else: self.platform_name = "mac-x64" self.exe_name %= "" + if self.platform.startswith("freebsd"): + self.platform_name = "freebsd" + self.exe_name %= "" def auto(self, executable_path=None, force=False, version_main=None, _=None): """ @@ -166,26 +174,56 @@ class Patcher(object): if force is True: self.force = force - try: - os.unlink(self.executable_path) - except PermissionError: - if self.force: - self.force_kill_instances(self.executable_path) - return self.auto(force=not self.force) - try: - if self.is_binary_patched(): - # assumes already running AND patched - return True - except PermissionError: - pass - # return False - except FileNotFoundError: - pass - release = self.fetch_release_number() - self.version_main = release.version[0] - self.version_full = release - self.unzip_package(self.fetch_package()) + if self.platform_name == "freebsd": + chromedriver_path = shutil.which("chromedriver") + + if not os.path.isfile(chromedriver_path) or not os.access(chromedriver_path, os.X_OK): + logging.error("Chromedriver not installed!") + return + + version_path = os.path.join(os.path.dirname(self.executable_path), "version.txt") + + process = os.popen(f'"{chromedriver_path}" --version') + chromedriver_version = process.read().split(' ')[1].split(' ')[0] + process.close() + + current_version = None + if os.path.isfile(version_path) or os.access(version_path, os.X_OK): + with open(version_path, 'r') as f: + current_version = f.read() + + if current_version != chromedriver_version: + logging.info("Copying chromedriver executable...") + shutil.copy(chromedriver_path, self.executable_path) + os.chmod(self.executable_path, 0o755) + + with open(version_path, 'w') as f: + f.write(chromedriver_version) + + logging.info("Chromedriver executable copied!") + else: + try: + os.unlink(self.executable_path) + except PermissionError: + if self.force: + self.force_kill_instances(self.executable_path) + return self.auto(force=not self.force) + try: + if self.is_binary_patched(): + # assumes already running AND patched + return True + except PermissionError: + pass + # return False + except FileNotFoundError: + pass + + release = self.fetch_release_number() + self.version_main = release.version[0] + self.version_full = release + self.unzip_package(self.fetch_package()) + return self.patch() def driver_binary_in_use(self, path: str = None) -> bool: diff --git a/src/utils.py b/src/utils.py index b812387..e8b39db 100644 --- a/src/utils.py +++ b/src/utils.py @@ -5,6 +5,7 @@ import re import shutil import urllib.parse import tempfile +import sys from selenium.webdriver.chrome.webdriver import WebDriver import undetected_chromedriver as uc @@ -182,9 +183,12 @@ def get_webdriver(proxy: dict = None) -> WebDriver: # downloads and patches the chromedriver # if we don't set driver_executable_path it downloads, patches, and deletes the driver each time - driver = uc.Chrome(options=options, browser_executable_path=browser_executable_path, - driver_executable_path=driver_exe_path, version_main=version_main, - windows_headless=windows_headless, headless=windows_headless) + try: + driver = uc.Chrome(options=options, browser_executable_path=browser_executable_path, + driver_executable_path=driver_exe_path, version_main=version_main, + windows_headless=windows_headless, headless=windows_headless) + except Exception as e: + logging.error("Error starting Chrome: %s" % e) # save the patched driver to avoid re-downloads if driver_exe_path is None: From 35c7bff3c873034bbfb5696fb814dd85a38548e8 Mon Sep 17 00:00:00 2001 From: Justin Kromlinger Date: Wed, 28 Feb 2024 21:36:38 +0100 Subject: [PATCH 28/30] Use headless configuration properly (#1104) --- src/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.py b/src/utils.py index e8b39db..9d02d58 100644 --- a/src/utils.py +++ b/src/utils.py @@ -186,7 +186,7 @@ def get_webdriver(proxy: dict = None) -> WebDriver: try: driver = uc.Chrome(options=options, browser_executable_path=browser_executable_path, driver_executable_path=driver_exe_path, version_main=version_main, - windows_headless=windows_headless, headless=windows_headless) + windows_headless=windows_headless, headless=get_config_headless()) except Exception as e: logging.error("Error starting Chrome: %s" % e) From fd773e59097c1aca4e08edc07c1ed30164f88bd3 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:38:53 +0000 Subject: [PATCH 29/30] Bump version 3.3.16 (#1105) --- CHANGELOG.md | 6 ++++++ Dockerfile | 10 +++++----- package.json | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b215861..8535429 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v3.3.16 (2024/02/28) + +* Fix of the subprocess.STARTUPINFO() call. Thanks @ceconelo +* Add FreeBSD support. Thanks @Asthowen +* Use headless configuration properly. Thanks @hashworks + ## v3.3.15 (2024/02/20) * Fix looping challenges diff --git a/Dockerfile b/Dockerfile index 2bbacda..fde140c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,17 +62,17 @@ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/usr/local/bin/python", "-u", "/app/flaresolverr.py"] # Local build -# docker build -t ngosang/flaresolverr:3.3.15 . -# docker run -p 8191:8191 ngosang/flaresolverr:3.3.15 +# docker build -t ngosang/flaresolverr:3.3.16 . +# docker run -p 8191:8191 ngosang/flaresolverr:3.3.16 # Multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.15 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . +# docker buildx build -t ngosang/flaresolverr:3.3.16 --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 . # add --push to publish in DockerHub # Test multi-arch build # docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # docker buildx create --use -# docker buildx build -t ngosang/flaresolverr:3.3.15 --platform linux/arm/v7 --load . -# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.15 +# docker buildx build -t ngosang/flaresolverr:3.3.16 --platform linux/arm/v7 --load . +# docker run -p 8191:8191 --platform linux/arm/v7 ngosang/flaresolverr:3.3.16 diff --git a/package.json b/package.json index fcfa5c4..7d08a19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flaresolverr", - "version": "3.3.15", + "version": "3.3.16", "description": "Proxy server to bypass Cloudflare protection", "author": "Diego Heras (ngosang / ngosang@hotmail.es)", "license": "MIT" From 20cd2944a790eeb7d3d1b5b87f5f0b17fbf1c628 Mon Sep 17 00:00:00 2001 From: francisco-lafe <90066435+francisco-lafe@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:05:11 -0300 Subject: [PATCH 30/30] Update README.md (#1127) Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index be86f32..12f0589 100644 --- a/README.md +++ b/README.md @@ -276,8 +276,8 @@ This is the same as `request.get` but it takes one more param: Environment variables are set differently depending on the operating system. Some examples: * Docker: Take a look at the Docker section in this document. Environment variables can be set in the `docker-compose.yml` file or in the Docker CLI command. -* Linux: Run `export LOG_LEVEL=debug` and then start FlareSolverr in the same shell. -* Windows: Open `cmd.exe`, run `set LOG_LEVEL=debug` and then start FlareSolverr in the same shell. +* Linux: Run `export LOG_LEVEL=debug` and then run `flaresolverr` in the same shell. +* Windows: Open `cmd.exe`, run `set LOG_LEVEL=debug` and then run `flaresolverr.exe` in the same shell. ## Prometheus exporter