From 6e67810eeb77f17403f5364e164e9a3588ebb3a2 Mon Sep 17 00:00:00 2001 From: Nazar Date: Sat, 17 Aug 2024 19:17:48 +0300 Subject: [PATCH 1/4] code improvements --- main.py | 177 +++++++++++++++++++++++++++++++++----------------------- pic.png | Bin 11048 -> 15078 bytes 2 files changed, 103 insertions(+), 74 deletions(-) diff --git a/main.py b/main.py index 0cf0368..a531acf 100644 --- a/main.py +++ b/main.py @@ -2,91 +2,115 @@ import requests from rich.console import Console +from rich.prompt import Confirm TIMEOUT_IN_SECONDS = 10 +# CLIENT_ID:SECRET +CLIENT = b"98f7e42c2e3a4f86a74eb43fbb41ed39:0a2449a2-001a-451e-afec-3e812901c4d7" + + class DeleteFriends: def __init__(self) -> None: # https://github.com/MixV2/EpicResearch/blob/master/docs/auth/auth_clients.md self.client = base64.b64encode( - b"98f7e42c2e3a4f86a74eb43fbb41ed39:0a2449a2-001a-451e-afec-3e812901c4d7", + CLIENT, ).decode( "utf-8", ) - self.console = Console() + self.session = requests.Session() + + self.session.headers.update = { + "Content-Type": "application/x-www-form-urlencoded", + } + + self.account_id = None + self.bearer = None + + def run(self) -> None: + console = Console() + console.clear() + + console.print("[yellow bold]Epic Games Store Friends Remover") - token = self.create_token() - self.auth_link, self.device_code = self.device_code(token) + token = self.token()["access_token"] - def run(self) -> bool: - self.console.clear() - self.console.print("[yellow bold]Epic Games Store Friends Remover") + device_code = self.device_code(token) - self.console.input( - f"[green bold]Verify login [/green bold][yellow](click enter to continue)[/yellow][green bold]:[/green bold] [red]{self.auth_link}", + console.input( + f"[bold][green]Login (press enter to continue):[/green] [red]{device_code["verification_uri_complete"]}", ) - data = self.device_code_verify(self.device_code) - if not data["success"]: - self.console.print(f"[red][bold][ERROR][/bold] {data['error_message']}") - return False + try: + data = self.device_code_verify(device_code["device_code"]) + except requests.HTTPError: + console.print("[red]User not logged in!") + return - self.data = data + self.account_id = data["account_id"] + self.bearer = data["access_token"] - self.console.print(f"[green]Successfully logged in [bold]{self.data['display_name']}") + console.print(f"[bold][green]Successfully logged in [blue]{data['displayName']}") - self.console.print("[green]Removing Friends...") + friends = self._get_friends() - friends_count = self.get_friend_count() - self.delete_friends() + friends_count = len(friends["friends"]) - self.console.print( - f"[green bold]Removed {friends_count} friends![/green bold] [yellow]You can kill all sessions to reset token.", + confirm = Confirm.ask( + f"[bold][yellow]You have [blue]{friends_count} [yellow]friends! " + "You sure you want to remove all friends?", ) - self.console.input() + if not confirm: + return - return None + self._remove_friends() - # Reference: https://github.com/MixV2/EpicResearch/blob/master/docs/auth/grant_types/client_credentials.md - def create_token(self) -> str: - headers = { - "Content-Type": "application/x-www-form-urlencoded", - "Authorization": f"basic {self.client}", - } - body = { - "grant_type": "client_credentials", - } + self._kill_session() + + console.print( + f"[bold][green]Removed {friends_count} friends!\n[yellow]Session has been killed", + ) + + console.input() + + def token(self) -> dict: + """https://github.com/MixV2/EpicResearch/blob/master/docs/auth/grant_types/client_credentials.md""" + headers = {"Authorization": f"basic {self.client}"} - data = requests.post( + body = {"grant_type": "client_credentials"} + + response = self.session.post( "https://account-public-service-prod.ol.epicgames.com/account/api/oauth/token", headers=headers, data=body, timeout=TIMEOUT_IN_SECONDS, - ).json() + ) - return data["access_token"] + response.raise_for_status() - # Reference: https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/AccountService/Authentication/DeviceCode/Create.md - def device_code(self, token) -> tuple: + return response.json() + + def device_code(self, token: str) -> dict: + """https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/AccountService/Authentication/DeviceCode/Create.md""" headers = { - "Content-Type": "application/x-www-form-urlencoded", "Authorization": f"bearer {token}", } - data = requests.post( - "https://account-public-service-prod03.ol.epicgames.com/account/api/oauth/deviceAuthorization", + response = self.session.post( + "https://account-public-service-prod.ol.epicgames.com/account/api/oauth/deviceAuthorization", headers=headers, timeout=TIMEOUT_IN_SECONDS, - ).json() + ) - return data["verification_uri_complete"], data["device_code"] + response.raise_for_status() + + return response.json() - # Reference: https://github.com/MixV2/EpicResearch/blob/master/docs/auth/grant_types/device_code.md def device_code_verify(self, device_code) -> dict: + """https://github.com/MixV2/EpicResearch/blob/master/docs/auth/grant_types/device_code.md""" headers = { - "Content-Type": "application/x-www-form-urlencoded", "Authorization": f"basic {self.client}", } @@ -95,55 +119,60 @@ def device_code_verify(self, device_code) -> dict: "device_code": device_code, } - data = requests.post( + response = self.session.post( "https://account-public-service-prod.ol.epicgames.com/account/api/oauth/token", headers=headers, data=body, timeout=TIMEOUT_IN_SECONDS, - ).json() - - if "errorCode" in data: - return { - "success": False, - "error_code": data["errorCode"], - "error_message": data["errorMessage"], - } - - return { - "success": True, - "display_name": data["displayName"], - "account_id": data["account_id"], - "access_token": data["access_token"], - } + ) + + response.raise_for_status() - # Reference: https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/FriendsList.md - def get_friend_count(self) -> int: + return response.json() + + def _get_friends(self) -> int: + """https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/FriendsList.md""" headers = { - "Content-Type": "application/x-www-form-urlencoded", - "Authorization": f"bearer {self.data['access_token']}", + "Authorization": f"bearer {self.bearer}", } - data = requests.get( - f"https://friends-public-service-prod.ol.epicgames.com/friends/api/v1/{self.data['account_id']}/summary", + response = self.session.get( + f"https://friends-public-service-prod.ol.epicgames.com/friends/api/v1/{self.account_id}/summary", headers=headers, timeout=TIMEOUT_IN_SECONDS, - ).json() + ) + + response.raise_for_status() - return len(data["friends"]) + return response.json() - # Reference: https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/Clear.md - def delete_friends(self) -> None: + def _remove_friends(self) -> None: + """https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/Clear.md""" headers = { - "Content-Type": "application/x-www-form-urlencoded", - "Authorization": f"bearer {self.data['access_token']}", + "Authorization": f"bearer {self.bearer}", + } + + self.session.delete( + f"https://friends-public-service-prod.ol.epicgames.com/friends/api/v1/{self.account_id}/friends", + headers=headers, + timeout=TIMEOUT_IN_SECONDS, + ) + + def _kill_session(self) -> None: + """https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/Clear.md""" + headers = { + "Authorization": f"bearer {self.bearer}", } - requests.delete( - f"https://friends-public-service-prod.ol.epicgames.com/friends/api/v1/{self.data["account_id"]}/friends", + self.session.delete( + f"https://account-public-service-prod.ol.epicgames.com/account/api/oauth/sessions/kill/{self.bearer}", headers=headers, timeout=TIMEOUT_IN_SECONDS, ) +def main() -> None: + friends_remover = DeleteFriends() + friends_remover.run() if __name__ == "__main__": - app = DeleteFriends().run() + main() diff --git a/pic.png b/pic.png index 66ffc7fcfab96b1e32a2b6164f05282488546bcc..4d12e22e5dec30b4af22db723e9c35390b0406b1 100644 GIT binary patch literal 15078 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 From 3d368b83d2a0f6d9b6b832c7707320362fbd1ca5 Mon Sep 17 00:00:00 2001 From: Nazar Date: Sat, 17 Aug 2024 19:21:45 +0300 Subject: [PATCH 2/4] update readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a7acecd..35ed006 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

Epic Games Friends Remover

- Python + Python GitHub Issues @@ -14,7 +14,8 @@

- +## Preview: + ## Description This script remove all your friends in 5 seconds for Epic Games Store. Open Source, you can download code and edit it. if you Windows user you can download latest exe from [releases](https://github.com/Nazar1ky/epic-games-store-remove-all-friends/releases) or [Github Actions](https://github.com/Nazar1ky/epic-games-store-remove-all-friends/actions). From f412a47d83d62d0daac39a14b33c0e3024fe36f0 Mon Sep 17 00:00:00 2001 From: Nazar Date: Sat, 17 Aug 2024 19:24:48 +0300 Subject: [PATCH 3/4] change class name --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index a531acf..c2f343b 100644 --- a/main.py +++ b/main.py @@ -10,7 +10,7 @@ CLIENT = b"98f7e42c2e3a4f86a74eb43fbb41ed39:0a2449a2-001a-451e-afec-3e812901c4d7" -class DeleteFriends: +class FriendsRemover: def __init__(self) -> None: # https://github.com/MixV2/EpicResearch/blob/master/docs/auth/auth_clients.md self.client = base64.b64encode( @@ -171,7 +171,7 @@ def _kill_session(self) -> None: ) def main() -> None: - friends_remover = DeleteFriends() + friends_remover = FriendsRemover() friends_remover.run() if __name__ == "__main__": From 8ef61dd72d57a9415713621ba2af1e1e87c2234d Mon Sep 17 00:00:00 2001 From: Nazar Date: Sat, 17 Aug 2024 19:30:27 +0300 Subject: [PATCH 4/4] fix annotation --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index c2f343b..f53b60e 100644 --- a/main.py +++ b/main.py @@ -130,7 +130,7 @@ def device_code_verify(self, device_code) -> dict: return response.json() - def _get_friends(self) -> int: + def _get_friends(self) -> dict: """https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/EpicGames/FriendsService/Friends/FriendsList.md""" headers = { "Authorization": f"bearer {self.bearer}",