From 113c7d4ba5fe351ad80ff9c09aef760193e4d10a Mon Sep 17 00:00:00 2001 From: biggestsonicfan <9744201+biggestsonicfan@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:31:43 -0700 Subject: [PATCH 1/5] Gracefully handle FANBOX Cloudflare check failures. --- PixivBrowserFactory.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/PixivBrowserFactory.py b/PixivBrowserFactory.py index ece6c582..a1ec1db6 100644 --- a/PixivBrowserFactory.py +++ b/PixivBrowserFactory.py @@ -206,12 +206,18 @@ def open_with_retry(self, url, data=None, timeout=60, retry=0): try: res = self.open(url, data, timeout) return res - except urllib.error.HTTPError: + except urllib.error.HTTPError as error: if res is not None: print(f"Error Code: {res.code}") print(f"Response Headers: {res.headers}") if res.code == '302': print(f"Redirect to {res.headers['location']}") + else: + # Issue #1342 + errorCode = error.getcode() + errorMessage = error.get_data() + if "challenge_basic_security_FANBOX" in str(errorMessage) and errorCode == 403: + return errorMessage raise except BaseException: exc_value = sys.exc_info()[1] @@ -382,6 +388,7 @@ def fanboxLoginUsingCookie(self, login_cookie=None): if login_cookie is None or len(login_cookie) == 0: login_cookie = self._config.cookieFanbox + # Issue #1342 if self._config.cf_clearance != "": ck1 = http.cookiejar.Cookie(version=0, name='cf_clearance', value=self._config.cf_clearance, port=None, port_specified=False, domain='fanbox.cc', domain_specified=False, @@ -418,6 +425,12 @@ def fanboxLoginUsingCookie(self, login_cookie=None): if '"user":{"isLoggedIn":true' in str(parsed.decode('utf-8')): result = True self._is_logged_in_to_FANBOX = True + # Issue #1342 + elif "challenge_basic_security_FANBOX" in str(parsed.decode('utf-8')): + result = False + self._is_logged_in_to_FANBOX = False + raise PixivException("Failed FANBOX Cloudflare CAPTCHA challenge, please check your cookie and user-agent settings.", + errorCode=PixivException.CANNOT_LOGIN, htmlPage=parsed.decode('utf-8')) parsed.decompose() del parsed From 37a82fbfa95b96c0c9e728e09e1a85d2670680f5 Mon Sep 17 00:00:00 2001 From: biggestsonicfan <9744201+biggestsonicfan@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:40:11 -0700 Subject: [PATCH 2/5] Remove redundant code. --- PixivBrowserFactory.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/PixivBrowserFactory.py b/PixivBrowserFactory.py index a1ec1db6..0e7f7903 100644 --- a/PixivBrowserFactory.py +++ b/PixivBrowserFactory.py @@ -427,8 +427,6 @@ def fanboxLoginUsingCookie(self, login_cookie=None): self._is_logged_in_to_FANBOX = True # Issue #1342 elif "challenge_basic_security_FANBOX" in str(parsed.decode('utf-8')): - result = False - self._is_logged_in_to_FANBOX = False raise PixivException("Failed FANBOX Cloudflare CAPTCHA challenge, please check your cookie and user-agent settings.", errorCode=PixivException.CANNOT_LOGIN, htmlPage=parsed.decode('utf-8')) parsed.decompose() From c36db23eeb14759e125a56ef6807953faba7ad0e Mon Sep 17 00:00:00 2001 From: biggestsonicfan <9744201+biggestsonicfan@users.noreply.github.com> Date: Sun, 30 Jun 2024 14:04:16 -0700 Subject: [PATCH 3/5] Cleanly handle parsed BS (BeautifulSoup) before raising exception --- PixivBrowserFactory.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PixivBrowserFactory.py b/PixivBrowserFactory.py index 0e7f7903..cd852d58 100644 --- a/PixivBrowserFactory.py +++ b/PixivBrowserFactory.py @@ -427,8 +427,11 @@ def fanboxLoginUsingCookie(self, login_cookie=None): self._is_logged_in_to_FANBOX = True # Issue #1342 elif "challenge_basic_security_FANBOX" in str(parsed.decode('utf-8')): + fanboxErrorPage = parsed.decode('utf-8') + parsed.decompose() + del parsed raise PixivException("Failed FANBOX Cloudflare CAPTCHA challenge, please check your cookie and user-agent settings.", - errorCode=PixivException.CANNOT_LOGIN, htmlPage=parsed.decode('utf-8')) + errorCode=PixivException.CANNOT_LOGIN, htmlPage=fanboxErrorPage) parsed.decompose() del parsed From a5315daddad045596a5c223ce8f9f4aa27059dd5 Mon Sep 17 00:00:00 2001 From: biggestsonicfan <9744201+biggestsonicfan@users.noreply.github.com> Date: Sun, 30 Jun 2024 14:16:55 -0700 Subject: [PATCH 4/5] Fix AttributeError caused by passing as bytes and correcting 4 year old typo. --- PixivBrowserFactory.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/PixivBrowserFactory.py b/PixivBrowserFactory.py index cd852d58..166c5459 100644 --- a/PixivBrowserFactory.py +++ b/PixivBrowserFactory.py @@ -214,10 +214,8 @@ def open_with_retry(self, url, data=None, timeout=60, retry=0): print(f"Redirect to {res.headers['location']}") else: # Issue #1342 - errorCode = error.getcode() - errorMessage = error.get_data() - if "challenge_basic_security_FANBOX" in str(errorMessage) and errorCode == 403: - return errorMessage + if "challenge_basic_security_FANBOX" in str(error.get_data()) and error.getcode() == 403: + return error raise except BaseException: exc_value = sys.exc_info()[1] @@ -416,7 +414,7 @@ def fanboxLoginUsingCookie(self, login_cookie=None): try: res = self.open_with_retry(req) parsed = BeautifulSoup(res, features="html5lib") - PixivHelper.get_logger().info('Logging in with cookit to Fanbox, return url: %s', res.geturl()) + PixivHelper.get_logger().info('Logging in with cookie to Fanbox, return url: %s', res.geturl()) res.close() except BaseException: PixivHelper.get_logger().error('Error at fanboxLoginUsingCookie(): %s', sys.exc_info()) From 62cd767a18a9af063e755db34f9402e5ca542371 Mon Sep 17 00:00:00 2001 From: biggestsonicfan <9744201+biggestsonicfan@users.noreply.github.com> Date: Sun, 30 Jun 2024 14:20:46 -0700 Subject: [PATCH 5/5] Change to to specifiy it's a Fanbox related error --- PixivBrowserFactory.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PixivBrowserFactory.py b/PixivBrowserFactory.py index 166c5459..5425c848 100644 --- a/PixivBrowserFactory.py +++ b/PixivBrowserFactory.py @@ -206,7 +206,7 @@ def open_with_retry(self, url, data=None, timeout=60, retry=0): try: res = self.open(url, data, timeout) return res - except urllib.error.HTTPError as error: + except urllib.error.HTTPError as fanboxError: if res is not None: print(f"Error Code: {res.code}") print(f"Response Headers: {res.headers}") @@ -214,8 +214,8 @@ def open_with_retry(self, url, data=None, timeout=60, retry=0): print(f"Redirect to {res.headers['location']}") else: # Issue #1342 - if "challenge_basic_security_FANBOX" in str(error.get_data()) and error.getcode() == 403: - return error + if "challenge_basic_security_FANBOX" in str(fanboxError.get_data()) and fanboxError.getcode() == 403: + return fanboxError raise except BaseException: exc_value = sys.exc_info()[1]