From 1a0924c15d9c6731ea0ee704eec97d0571025688 Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:28:47 -0500 Subject: [PATCH 1/6] Fixing list index out of range when response is not an error but still empty --- ultima_scraper_api/apis/fansly/classes/auth_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultima_scraper_api/apis/fansly/classes/auth_model.py b/ultima_scraper_api/apis/fansly/classes/auth_model.py index 2d66b1c..9b592f4 100644 --- a/ultima_scraper_api/apis/fansly/classes/auth_model.py +++ b/ultima_scraper_api/apis/fansly/classes/auth_model.py @@ -128,7 +128,7 @@ async def get_user(self, identifier: int | str): url = endpoint_links(identifier).users_by_username pass response = await self.session_manager.json_request(url) - if "error" not in response: + if "error" not in response and len(response["response"]): response["session_manager"] = self.session_manager response = create_user(response["response"][0], self) return response From f8d60c1123d4bf3ad1aba5a0ad3d129462e9ff86 Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:38:51 -0500 Subject: [PATCH 2/6] Fixing missing "withUser" KeyError when AggregationData and Data don't align due to APIs returning deactivated users --- ultima_scraper_api/apis/fansly/classes/auth_model.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ultima_scraper_api/apis/fansly/classes/auth_model.py b/ultima_scraper_api/apis/fansly/classes/auth_model.py index 9b592f4..72c9571 100644 --- a/ultima_scraper_api/apis/fansly/classes/auth_model.py +++ b/ultima_scraper_api/apis/fansly/classes/auth_model.py @@ -300,6 +300,8 @@ async def get_chats( for account in aggregationData["accounts"]: if result["partnerAccountId"] == account["id"]: result["withUser"] = create_user(account, self) + if "withUser" not in result: + continue for group in aggregationData["groups"]: found_user = [ x @@ -311,7 +313,7 @@ async def get_chats( result["lastMessage"] = create_message( last_message, result["withUser"] ) - final_results = final_results["data"] + final_results = [x for x in final_results["data"] if "withUser" in x] final_results.sort(key=lambda x: x["withUser"].id, reverse=True) self.chats = final_results return final_results From 28ffa76f5f53f0f6f8c6f9c3035ebbddd9919244 Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Mon, 31 Jul 2023 17:09:52 -0500 Subject: [PATCH 3/6] Fix for downstream error, NoneType object is not subscriptable, when "lastMessage" is missing from chat result --- ultima_scraper_api/apis/onlyfans/classes/auth_model.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ultima_scraper_api/apis/onlyfans/classes/auth_model.py b/ultima_scraper_api/apis/onlyfans/classes/auth_model.py index 1d58ed5..233aad6 100644 --- a/ultima_scraper_api/apis/onlyfans/classes/auth_model.py +++ b/ultima_scraper_api/apis/onlyfans/classes/auth_model.py @@ -257,9 +257,10 @@ async def get_chats( final_results = list(chain.from_iterable(final_results)) for result in final_results: result["withUser"] = create_user(result["withUser"], self) - result["lastMessage"] = create_message( - result["lastMessage"], result["withUser"] - ) + if result["lastMessage"]: + result["lastMessage"] = create_message( + result["lastMessage"], result["withUser"] + ) if has_more: results2 = await self.get_chats( From a8238cef94aa73372d081ecb8908c7da5f4d96a9 Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Tue, 1 Aug 2023 16:57:17 -0500 Subject: [PATCH 4/6] Workaround handling for unimplemented ErrorDetails instantiation coming from json_request results. --- ultima_scraper_api/apis/api_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultima_scraper_api/apis/api_helper.py b/ultima_scraper_api/apis/api_helper.py index fa87ac3..6bfcfd5 100644 --- a/ultima_scraper_api/apis/api_helper.py +++ b/ultima_scraper_api/apis/api_helper.py @@ -201,7 +201,7 @@ async def remove_errors(results: Any): final_results.append(results) else: final_results = results - final_results = [x for x in final_results if not isinstance(x, error_types)] + final_results = [x for x in final_results if not isinstance(x, error_types) and not (isinstance(x, dict) and "error" in x)] if wrapped and final_results: final_results = final_results[0] return final_results From 8f2f0f480e81f5d1192727004bd23cbfa8a6b56e Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:58:02 -0500 Subject: [PATCH 5/6] [Fansly] Deactivated models are still returned by get_subscriptions call, however, they are not scrapable. Without this, option_manager tries to dereference a NoneType and will hard error. --- ultima_scraper_api/apis/fansly/classes/auth_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultima_scraper_api/apis/fansly/classes/auth_model.py b/ultima_scraper_api/apis/fansly/classes/auth_model.py index 72c9571..1771cd7 100644 --- a/ultima_scraper_api/apis/fansly/classes/auth_model.py +++ b/ultima_scraper_api/apis/fansly/classes/auth_model.py @@ -320,6 +320,6 @@ async def get_chats( async def get_scrapable_users(self): followed_users = self.followed_users - subscription_users = [x.user for x in self.subscriptions] + subscription_users = [x.user for x in self.subscriptions if x.user.active] unique_users = list(set(followed_users) | set(subscription_users)) return unique_users From be3059e0c0f1ad3cee2183d22f50d75bf22279ed Mon Sep 17 00:00:00 2001 From: Koala Hunter <80060212+koalahntr@users.noreply.github.com> Date: Sun, 6 Aug 2023 11:44:46 -0500 Subject: [PATCH 6/6] Resolving merge conflict for empty response fix --- ultima_scraper_api/apis/fansly/classes/auth_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultima_scraper_api/apis/fansly/classes/auth_model.py b/ultima_scraper_api/apis/fansly/classes/auth_model.py index 1771cd7..a59f314 100644 --- a/ultima_scraper_api/apis/fansly/classes/auth_model.py +++ b/ultima_scraper_api/apis/fansly/classes/auth_model.py @@ -128,7 +128,7 @@ async def get_user(self, identifier: int | str): url = endpoint_links(identifier).users_by_username pass response = await self.session_manager.json_request(url) - if "error" not in response and len(response["response"]): + if response["response"]: response["session_manager"] = self.session_manager response = create_user(response["response"][0], self) return response