From e2dfa984037a4b8051ac0efcfdaa48f0d6c5ee59 Mon Sep 17 00:00:00 2001 From: Nunzi99 Date: Wed, 8 Oct 2025 20:58:30 +0200 Subject: [PATCH] Create x.py --- src/app/social/x.py | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/app/social/x.py diff --git a/src/app/social/x.py b/src/app/social/x.py new file mode 100644 index 0000000..ef97772 --- /dev/null +++ b/src/app/social/x.py @@ -0,0 +1,74 @@ +''' +THIS CURRENTLY DOES NOT WORK AS INTENDED DUE TO THE FACT THAT THE TWEETS AREN'T IN CHRONOLOGICAL ORDER +Usiamo l'API rettiwt per ottenere dati da X aggirando i limiti dell'API free +Questo potrebbe portare al ban dell'account anche se improbabile, non usare l'account personale +Per farlo funzionare è necessario installare npm in un container docker ed installarlo con npm install -g rettiwt-api dopo essersi connessi al docker +https://www.npmjs.com/package/rettiwt-api +''' + +import docker +import json +from .base import SocialWrapper, SocialPost, SocialComment +class XWrapper(SocialWrapper): + def __init__(self): + ''' + This wrapper uses the rettiwt API to get data from X in order to avoid the rate limits of the free X API, + even if improbable this could lead to a ban so do not use the personal account, + In order to work a docker container with npm installed is needed, it's also necessary to install rettiwt in the container with npm install -g rettiwt-api + ''' + # This is the list of users that can be interesting + # To get the ID of a new user is necessary to search it on X, copy the url and insert it in a service like "https://get-id-x.foundtt.com/en/" + self.users = [ + 'watcherguru', + 'Cointelegraph', + 'BTC_Archive', + 'elonmusk' + ] + self.api_key = "ADD_API_KEY" + ''' + Per ottenere questa API è necessario seguire i seguenti passaggi: + - Installare l'estensione su chrome X Auth Helper + - Dargli il permesso di girare in incognito + - Andare in incognito ed entrare sul proprio account X + - Aprire l'estensione e fare "get key" + - Chiudere chrome + DOvrebbe funzionare per 5 anni o finchè non si si fa il log out, in ogni caso si può ricreare + ''' + # Connection to the docker deamon + self.client = docker.from_env() + # Connect with the relative container + self.container = self.client.containers.get("node_rettiwt") + self.social_posts: list[SocialPost] = [] + def get_top_crypto_posts(self, limit = 5) -> list[SocialPost]: #-> list[SocialPost]: + ''' + Get the top crypto tweets from X, the limit is reffered to the number of tweets for each user + ''' + social_posts: list[SocialPost] = [] + for user in self.users: + # This currently doesn't work as intended since it returns the posts in random order + tweets = self.container.exec_run("rettiwt -k" + self.api_key + " tweet search -f " + str(user), tty=True) + tweets = tweets.output.decode() + tweets = json.loads(tweets) + tweets: list[dict] = tweets['list'] + tweets = tweets[:limit] + for tweet in tweets: + social_post = SocialPost() + social_post.time = tweet['createdAt'] + social_post.title = str(user) + " tweeted: " + social_post.description = tweet['fullText'] + social_posts.append(social_post) + self.social_posts = social_posts + return social_posts + def print(self): + i = 1 + for post in self.social_posts: + print(f"Post {i}:") + print(f"Time: {post.time}") + print(f"Title: {post.title}") + print(f"Description: {post.description}") + print() + i += 1 + +# x_wrapper = XWrapper() +# social_posts = x_wrapper.get_top_crypto_posts(limit=3) +# x_wrapper.print() \ No newline at end of file