From b01aaee60f696febafe77902c984f1fbec86151f Mon Sep 17 00:00:00 2001 From: red Date: Mon, 6 Nov 2023 23:31:38 +0000 Subject: [PATCH] initial --- .gitignore | 6 +++ requirements.txt | 2 + tagtop.py | 117 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100644 tagtop.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..75df9c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +bin +include +lib +lib64 +leaderboard +pyvenv.cfg diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..93d76e9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +aiohttp +requests diff --git a/tagtop.py b/tagtop.py new file mode 100644 index 0000000..a1ced37 --- /dev/null +++ b/tagtop.py @@ -0,0 +1,117 @@ +import aiohttp +import asyncio +import requests +import sys +import datetime + + +class Post: + post_id = None + poster = None + response = None + likes = None + image = None + + def __init__(self, post_id): + self.post_id = post_id + + async def get_post(self, session): + async with session.get(f"https://sketchersunited.org/posts/{self.post_id}") as response: + self.response = await response.json() + self.poster = self.response['post']['profile_id'] + self.likes = self.response['post']['reactions'] + self.image = self.response['post']['resource_url'] + return self + + def __str__(self): + if self.image: + return (f"
\n" + f"
\n" + f" Post id: {self.post_id}\n
" + f" Profile id: {self.poster}\n
" + f" Likes: {self.likes}\n
" + f" \n
" + f"
\n") + else: + return (f"
\n" + f"
\n" + f" Post id: {self.post_id}\n
" + f" Profile id: {self.poster}\n
" + f" Likes: {self.likes}\n
" + f" This is a text post
" + f"
\n") + + +async def get_next_posts(tag, post_id): + headers = { + 'User-Agent': 'tagtop by @username', + 'Accept': 'application/json, text/plain, */*', + } + + if post_id == 0: + response = requests.get(f'https://sketchersunited.org/json/tags/{tag}', headers=headers) + else: + response = requests.get(f'https://sketchersunited.org/json/tags/{tag}?p={post_id}', headers=headers) + + return response.json() + + +async def get_all_posts(tag): + all_posts = [] + next_post_id = 0 + + while next_post_id is not None: + print(f"loading posts from post {next_post_id}") + response = await get_next_posts(tag, next_post_id) + + for x in response['data']['posts']: + post = Post(x['id']) + all_posts.append(post) + next_post_id = response['next'] + + return all_posts + + +def write_to_file(all_posts): + file_name = f'leaderboard/leaderboard{datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}.html' + + with open(file_name, "w") as file: + file.write("""\n + \n + """) + + sorted_posts = sorted(all_posts, key=lambda post_to_check: post_to_check.likes, reverse=True) + + for post in sorted_posts: + print(f"Set up {post.post_id}") + with open(file_name, "a") as file: + file.write(str(post)) + + with open(file_name, "a") as file: + file.write("""\n + + """) + + +async def download_likes(): + all_posts = await get_all_posts(sys.argv[1].replace("#","")) + + headers = { + 'User-Agent': 'tagtop by @username', + 'Accept': 'application/json, text/plain, */*', + } + + async with aiohttp.ClientSession(headers=headers) as session: + tasks = [] + for post in all_posts: + tasks.append(asyncio.ensure_future(post.get_post(session))) + + likes = await asyncio.gather(*tasks) + write_to_file(likes) + + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Specify the tag you want to search! e.g. python3 tagtop.py funtag") + else: + asyncio.run(download_likes())