web-dev-qa-db-ja.com

特定のユーザーからの特定のツイートに対するツイートの返信を取得する

特定のユーザーのツイートを調べて、そのツイートに対するすべての返信を取得しようとしています。 TwitterのAPIv1.1は直接サポートしていないことがわかりました。

特定のツイートへの返信を取得するためのハックや回避策はありますか? pythonストリーミングAPIを使用しています。

11
Huga

REST APIを使用する回避策があります。

返信を検索する元のツイートの作成者のid_strと@usernameが必要になります。

著者の「@username」には Search API を使用する必要があります。結果を調べて「in_reply_to_status_id」フィールドを探し、返信したい特定のツイートのid_strと比較します。

16
Juan E.

これは、tweepyを使用して残りのAPIを使用して「username」によって作成されたツイートの返信をフェッチするための回避策です。

1)返信を取得する必要があるツイートのTweet_idを見つけます

2)APIの検索メソッドを使用して、次のクエリ(q = "@ username"、since_id = Tweet_id)を実行し、Tweet_id以降のすべてのツイートを取得します。

3)in_reply_to_status_idをTweet_idに一致させる結果が、投稿への返信です。

6
Ajinkya Khamkar
replies=[] 
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)  
for full_tweets in tweepy.Cursor(api.user_timeline,screen_name=name,timeout=999999).items(10):
  for Tweet in tweepy.Cursor(api.search,q='to:'+name,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()

上記のコードは、ユーザー(name)の最近の10件のツイートを、その特定のツイートへの返信とともにフェッチします。返信は、repliesという名前のリストに保存されます。 items count(eg:items(100))を増やすことで、より多くのツイートを取得できます。

5

非常に多くのアプローチと支援を行った後でも、私は約1時間かけて、元の作成者が作成したツイートへの返信を取得するための正確なコードを見つけました。返信を取得することに加えて、Twitterユーザーは主に返信に返信してスレッドを作成します(これにより、元の作成者が作成したスレッド全体を取得するのとは異なります)

私は最近、元の作成者のスレッド内のすべてのツイートのスクリーンショットをGoogleフォトにアップロードする簡単なプロジェクトに取り組んでいます。ツイートと_reply to the replies_にreplyをフェッチできるようにするための最も重要な部分

これが私の問題を解決するために私が書いた単純な再帰です。この関数は、urlsリストをすべての返信のURLと、作成者の返信への返信で更新します。

_def update_urls(Tweet, api, urls):
    Tweet_id = Tweet.id
    user_name = Tweet.user.screen_name
    max_id = None
    replies = tweepy.Cursor(api.search, q='to:{}'.format(user_name),
                                since_id=Tweet_id, max_id=max_id, Tweet_mode='extended').items()

    for reply in replies:
        if(reply.in_reply_to_status_id == Tweet_id):
            urls.append(get_Twitter_url(user_name, reply.id))
            try:
                for reply_to_reply in update_urls(reply, api, urls):
                    pass
            except Exception:
                pass
        max_id = reply.id
    return urls
_

_update_urls_関数を使用する場合に必要になる可能性のある追加の関数を次に示します。

_def get_api():
    auth=tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True)
    return api

def get_Tweet(url):
    Tweet_id = url.split('/')[-1]
    api = get_api()
    Tweet = api.get_status(Tweet_id)
    return Tweet

def get_Twitter_url(user_name, status_id):
    return "https://Twitter.com/" + str(user_name) + "/status/" + str(status_id)
_

正確なコードの実行:

_api = get_api()
Tweet = get_Tweet(url)
urls = [url]
urls = update_urls(Tweet, api, urls)
_

特定のURLのコンテンツを取得する場合は、get_Tweet(url)を呼び出し、Tweetオブジェクトを使用して_Tweet.text_、_Tweet.user_などの情報を取得します。それがうまくいったかうまくいかなかったかを教えてください:)

1
Lavish Saluja