Python:如何从 Twitter 帐户获取对推文的所有回复?

时间:2021-06-14 17:59:18

标签: python twitter tweepy

我从 Twitter 帐户获取我需要的所有推文。超过 200 条推文;例如 500, 600, ...

我正在使用 Tweepy 库来帮助我使用 Python 完成此操作,并且我创建了此对象来完成此操作。

from rrss.twitter_connection import TwitterConnection
import tweepy


class Tweets:
    def __init__(self):
        self.all_tweets = []    # List of tweets
        self.__total_tweets = None
        self.__screen_name = None
        self.__replies = None

    def __del__(self):
        del self.all_tweets
        del self.screen_name
        del self.total_tweets
        del self.replies

    @property
    def screen_name(self):  # Screen name of twitter account which we are going to retrieve all their tweets
        return self.__screen_name

    @screen_name.setter
    def screen_name(self, screen_name):
        self.__screen_name = screen_name

    @screen_name.deleter
    def screen_name(self):
        del self.__screen_name

    @property
    def total_tweets(self): # Total tweets which wants to be returned
        return self.__total_tweets

    @total_tweets.setter
    def total_tweets(self, total):
        self.__total_tweets = total

    @total_tweets.deleter
    def total_tweets(self):
        del self.__total_tweets

    @property
    def replies(self):
        return self.__replies

    @replies.setter
    def replies(self, replies):
        self.__replies = replies

    @replies.deleter
    def replies(self):
        del self.__replies

    @staticmethod
    def __get_tweets(total, screen_name, oldest_id=None):
        """
        :param total: Number of tweets to return
        :param screen_name: Twitter account
        :param oldest_id: The last id of the tweet retrieved
        :return: A list with at least a number of tweets equal to variable total from the Twitter Account relationed to screen_name variable
        """
        api = TwitterConnection().api
        if oldest_id is None:
            tweets = api.user_timeline(screen_name=screen_name, count=total, include_rts=False, tweet_mode="extended")
        else:
            tweets = api.user_timeline(screen_name=screen_name, count=total, include_rts=False, max_id=oldest_id - 1, tweet_mode="extended")
        return tweets

    def get_tweets(self, total, screen_name):
        """
            Public method to get a total number of tweets from a screen name
        :param total: Total of tweets to retrieve from a screen name
        :param screen_name: Twitter account
        :return: Update self.all_tweets with all the tweets retrievedd
        """
        self.screen_name = screen_name
        if total <= 200:
            self.all_tweets = Tweets.__get_tweets(total, screen_name)
        else:
            counter = 200
            self.all_tweets = Tweets.__get_tweets(counter, screen_name)
            oldest_id = self.all_tweets[-1].id
            while len(self.all_tweets) < total:
                total_block_tweets = 200 if total - counter > 200 else total - counter
                tweets = Tweets.__get_tweets(total_block_tweets, screen_name, oldest_id)
                if len(tweets) > 0:
                    self.all_tweets.extend(tweets)
                    oldest_id = self.all_tweets[-1].id
                    counter = len(self.all_tweets)
                else:
                    break

    def get_replies(self, tweet_id):
        api = TwitterConnection().api
        self.replies = tweepy.Cursor(api.search, q='to:{}'.format(self.screen_name), since_id=tweet_id, tweet_mode='extended').items()

    def search_replies_to_tweet(self, tweet_id):
        while True:
            try:
                reply = self.replies.next()
                print(reply.in_reply_to_status_id)
                if reply.in_reply_to_status_id == tweet_id:
                    print("reply of tweet:{}".format(reply.full_text))
                if reply.in_reply_to_status_id_str == str(tweet_id):
            except StopIteration:
                print("El cursor ha llegado a su final!!!")
                break

使用此代码,您可以从 Twitter 帐户“MovistarEstu”获取所有推文:

def main():
    t = Tweets()
    t.get_tweets(200, "MovistarEstu")
    i = 0
    for info in t.all_tweets:
        print(f"i: {i} - ID: {info.id} - created_at: {info.created_at}")
        print(f"text: {info.full_text}\n")
        i += 1

您获得所有推文,然后打印有关它们的一些信息。所有这些工作正常。但是当我尝试从 ID 获得对“MovistarEstu”创建的所有推文的所有回复时,我的问题就出现了。我收到了一些回复,但不是全部。

例如,我收到了 ID 为 140344418085265411 但没有 ID 为 1391368878861824002 的推文的回复,我不知道为什么:(

使用此代码,我尝试从“MovistarEstu”获取所有推文,因为 ID:1391364490286047238

t.get_replies(1391364490286047238)

现在,我尝试将“MovistarEstu”的所有回复都发送到此 ID 推文:1391368878861824002

t.search_replies_to_tweet(1391368878861824002)

但是,我什么也没有得到。但是,如果您访问 Twitter,您可以查看是否有回复:https://twitter.com/MovistarEstu/status/1391368878861824002

如果您尝试获取此 ID 的所有回复:1403443418085265411

t.search_replies_to_tweet(1403443418085265411)

然后,我可以找到回复!!!

reply of tweet:@MovistarEstu Victoria en el 4 partido de la final 
reply of tweet:@MovistarEstu Momento que no volveremos a ver en la puta vida 
reply of tweet:@MovistarEstu Es buenísimo porque el CM del @MovistarEstu está boicoteando constantemente a su directiva haciéndonos recordar que el pasado fue glorioso y que nos han llevado a la absoluta mediocridad. 
reply of tweet:@MovistarEstu No me habéis pedido permiso para usar la foto ? 
reply of tweet:@MovistarEstu Yo estaba ahí con mis compis de cantera 
reply of tweet:@MovistarEstu Que salgan los toreros oh oh oh!!!! reply of tweet:@MovistarEstu Entonces salían los toreros habitualmente, ahora sólo salen los torreznos 
reply of tweet:@MovistarEstu Cualquier tiempo pasado fue mejor. Asensio ya estaba por aquel entonces mamando del frasco? 
reply of tweet:@MovistarEstu Claro, cuando Nacho aprobó la selectividad a la 17a 
reply of tweet:@MovistarEstu 17 años ya!!! Lo recuerdo como si fuera ayer. Se forzó quinto partido de la final ACB con el Farsa. Patterson, Nicola Loncar... 
reply of tweet:@MovistarEstu Segundo partido en Vistalegre de la final de liga contra el FCBarcelona. Tremenda exhibición, ambientazo en las gradas y 2-2. Todo se decidirá en el Palau (cuando ya debía estar finiquitada la final tras algún arbitraje "ejem-ejem" en Barcelona)... 
reply of tweet:@MovistarEstu Pase a la final ACB?

我做错了什么?

1 个答案:

答案 0 :(得分:1)

来自 Tweepy 的 standard search API 使用的 Twitter API.search 的文档:

<块引用>

请记住,搜索索引有 7 天的限制。换句话说,不会找到超过一周的日期的推文。

https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/guides/standard-operators 还说:

<块引用>

搜索 API 不是所有推文的完整索引,而是最近推文的索引。该索引包括 6-9 天的推文。

相关问题