简体   繁体   English

如何使用tweepy和python获取给定推文的回复?

[英]How to get the replies for a given tweet with tweepy and python?

After some searching I found a way to download the recent tweets from a given user. 经过一些搜索,我找到了一种从给定用户下载最新推文的方法。 Now I want to get the replies for each tweet. 现在,我想获取每个推文的回复。 I know that Twitter API does not provide an endpoint to get replies of a tweet unless we have a premium account. 我知道,除非我们有高级帐户,否则Twitter API不会提供端点来获取推文的回复。 But I could find some workarounds in the internet. 但是我可以在互联网上找到一些解决方法。 I found a way to get few tweets and their replies using Getting tweet replies to a particular tweet from a particular user . 我找到了一种使用获取特定用户对特定tweet的回复的方法来获取少量tweet及其回复的方法。 This code is also given below. 此代码也在下面给出。

How can I modify my code (getData.py) to save the replies of each tweet along with the tweet in the csv? 如何修改我的代码(getData.py),以将每个推文的回复与推文一起保存在csv中?

My code to download a user's tweets as csv (getData.py) 我的将用户鸣叫下载为csv的代码(getData.py)

import tweepy
import csv

# Twitter API credentials
consumer_key = "###########"
consumer_secret = "################"
access_key = "#################"
access_secret = "#####################"


def get_all_tweets(screen_name):
    # Twitter only allows access to a users most recent 3240 tweets with this method

    # authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)

    # initialize a list to hold all the tweepy Tweets
    alltweets = []

    # make initial request for most recent tweets (200 is the maximum allowed count)
    new_tweets = api.user_timeline(screen_name=screen_name, count=200)

    # save most recent tweets
    alltweets.extend(new_tweets)

    # save the id of the oldest tweet less one
    oldest = alltweets[-1].id - 1

    # keep grabbing tweets until there are no tweets left to grab
    while len(new_tweets) > 0:
        print
        "getting tweets before %s" % (oldest)

        # all subsiquent requests use the max_id param to prevent duplicates
        new_tweets = api.user_timeline(screen_name=screen_name, count=200, max_id=oldest)

        # save most recent tweets
        alltweets.extend(new_tweets)

        # update the id of the oldest tweet less one
        oldest = alltweets[-1].id - 1

        print
        "...%s tweets downloaded so far" % (len(alltweets))

    # transform the tweepy tweets into a 2D array that will populate the csv
    outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode("utf-8"), tweet.favorite_count, tweet.retweet_count]
                 for tweet in alltweets]

    # write the csv
    with open('%s_tweets.csv' % screen_name, mode='w', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(["id", "created_at", "text"])
        writer.writerows(outtweets)

    pass

def main():
    get_all_tweets("tartecosmetics")


if __name__ == '__main__':
    main()

How I get the replies for a given tweet 如何获得给定推文的回复

This code will fetch 10 recent tweets of an user(name) along with the replies to that particular tweet. 该代码将获取用户(名称)最近的10条推文以及对该特定推文的答复。

replies=[]
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
for full_tweets in tweepy.Cursor(api.user_timeline,screen_name='tartecosmetics',timeout=999999).items(10):
  for tweet in tweepy.Cursor(api.search,q='to:'+'tartecosmetics',result_type='recent',timeout=999999).items(1000):
    if hasattr(tweet, 'in_reply_to_status_id_str'):
      if (tweet.in_reply_to_status_id_str==full_tweets.id_str):
        replies.append(tweet.text)
  print("Tweet :",full_tweets.text.translate(non_bmp_map))
  for elements in replies:
       print("Replies :",elements)
  replies.clear()
user_name = "@nameofuser"

replies = tweepy.Cursor(api.search, q='to:{}'.format(user_name),
                                since_id=tweet_id, tweet_mode='extended').items()
while True:
    try:
        reply = replies.next()
        if not hasattr(reply, 'in_reply_to_status_id_str'):
            continue
        if reply.in_reply_to_status_id == tweet_id:
           logging.info("reply of tweet:{}".format(reply.full_text))

    except tweepy.RateLimitError as e:
        logging.error("Twitter api rate limit reached".format(e))
        time.sleep(60)
        continue

    except tweepy.TweepError as e:
        logging.error("Tweepy error occured:{}".format(e))
        break

    except StopIteration:
        break

    except Exception as e:
        logger.error("Failed while fetching replies {}".format(e))
        break

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM