web-dev-qa-db-ja.com

Twitter API-特定のIDでツイートを取得

テキストコンテンツをダウンロードしたいツイートIDのリストがあります。これを行う簡単な解決策はありますか、できればPythonスクリプトを使用しますか?私のリストは非常に長いので、質問の。

21
Crista23

_statuses/show/:id_ API route を使用すると、IDで特定のツイートにアクセスできます。ほとんどのPython Twitterライブラリはまったく同じパターンに従うか、メソッドに「わかりやすい」名前を付けます。

たとえば、 Twython は、特定のツイートをロードできる Twython.show_status() など、いくつかの_show_*_メソッドを提供します。

_CONSUMER_KEY = "<consumer key>"
CONSUMER_SECRET = "<consumer secret>"
OAUTH_TOKEN = "<application key>"
OAUTH_TOKEN_SECRET = "<application secret"
Twitter = Twython(
    CONSUMER_KEY, CONSUMER_SECRET,
    OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

Tweet = Twitter.show_status(id=id_of_Tweet)
print(Tweet['text'])
_

返された辞書は、APIによって指定された Tweetオブジェクト定義 に従います。

tweepy librarytweepy.get_status() を使用します。

_auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
api = tweepy.API(auth)

Tweet = api.get_status(id_of_Tweet)
print(Tweet.text)
_

少しリッチなオブジェクトを返しますが、その属性は公開されたAPIを反映しています。

35
Martijn Pieters

以前の回答で大幅に加速された私の仕事を共有します(ありがとう)。このPython 2.7スクリプトは、ファイルに保存されているツイートIDのテキストを取得します。入力データ形式に合わせてget_Tweet_id()を調整します。元のデータは https://github.com/mdredze/Twitter_sandy

2018年4月の更新:@someoneバグレポートへの返信が遅くなりました(ありがとう)。このスクリプトは、100番目のツイートIDごとに破棄することはなくなりました(これは私のバグでした)。何らかの理由でツイートが利用できない場合、バルクフェッチは黙ってスキップします。応答サイズが要求サイズと異なる場合、スクリプトは警告するようになりました。

'''
Gets text content for Tweet IDs
'''

# standard
from __future__ import print_function
import getopt
import logging
import os
import sys
# import traceback
# third-party: `pip install tweepy`
import tweepy

# global logger level is configured in main()
Logger = None

# Generate your own at https://apps.Twitter.com/app
CONSUMER_KEY = 'Consumer Key (API key)'
CONSUMER_SECRET = 'Consumer Secret (API Secret)'
OAUTH_TOKEN = 'Access Token'
OAUTH_TOKEN_SECRET = 'Access Token Secret'

# batch size depends on Twitter limit, 100 at this time
batch_size=100

def get_Tweet_id(line):
    '''
    Extracts and returns Tweet ID from a line in the input.
    '''
    (tagid,_timestamp,_sandyflag) = line.split('\t')
    (_tag, _search, Tweet_id) = tagid.split(':')
    return Tweet_id

def get_tweets_single(twapi, idfilepath):
    '''
    Fetches content for Tweet IDs in a file one at a time,
    which means a ton of HTTPS requests, so NOT recommended.

    `twapi`: Initialized, authorized API object from Tweepy
    `idfilepath`: Path to file containing IDs
    '''
    # process IDs from the file
    with open(idfilepath, 'rb') as idfile:
        for line in idfile:
            Tweet_id = get_Tweet_id(line)
            Logger.debug('get_tweets_single: fetching Tweet for ID %s', Tweet_id)
            try:
                Tweet = twapi.get_status(Tweet_id)
                print('%s,%s' % (Tweet_id, Tweet.text.encode('UTF-8')))
            except tweepy.TweepError as te:
                Logger.warn('get_tweets_single: failed to get Tweet ID %s: %s', Tweet_id, te.message)
                # traceback.print_exc(file=sys.stderr)
        # for
    # with

def get_Tweet_list(twapi, idlist):
    '''
    Invokes bulk lookup method.
    Raises an exception if rate limit is exceeded.
    '''
    # fetch as little metadata as possible
    tweets = twapi.statuses_lookup(id_=idlist, include_entities=False, trim_user=True)
    if len(idlist) != len(tweets):
        Logger.warn('get_Tweet_list: unexpected response size %d, expected %d', len(tweets), len(idlist))
    for Tweet in tweets:
        print('%s,%s' % (Tweet.id, Tweet.text.encode('UTF-8')))

def get_tweets_bulk(twapi, idfilepath):
    '''
    Fetches content for Tweet IDs in a file using bulk request method,
    which vastly reduces number of HTTPS requests compared to above;
    however, it does not warn about IDs that yield no Tweet.

    `twapi`: Initialized, authorized API object from Tweepy
    `idfilepath`: Path to file containing IDs
    '''    
    # process IDs from the file
    Tweet_ids = list()
    with open(idfilepath, 'rb') as idfile:
        for line in idfile:
            Tweet_id = get_Tweet_id(line)
            Logger.debug('Enqueing Tweet ID %s', Tweet_id)
            Tweet_ids.append(Tweet_id)
            # API limits batch size
            if len(Tweet_ids) == batch_size:
                Logger.debug('get_tweets_bulk: fetching batch of size %d', batch_size)
                get_Tweet_list(twapi, Tweet_ids)
                Tweet_ids = list()
    # process remainder
    if len(Tweet_ids) > 0:
        Logger.debug('get_tweets_bulk: fetching last batch of size %d', len(Tweet_ids))
        get_Tweet_list(twapi, Tweet_ids)

def usage():
    print('Usage: get_tweets_by_id.py [options] file')
    print('    -s (single) makes one HTTPS request per Tweet ID')
    print('    -v (verbose) enables detailed logging')
    sys.exit()

def main(args):
    logging.basicConfig(level=logging.WARN)
    global Logger
    Logger = logging.getLogger('get_tweets_by_id')
    bulk = True
    try:
        opts, args = getopt.getopt(args, 'sv')
    except getopt.GetoptError:
        usage()
    for opt, _optarg in opts:
        if opt in ('-s'):
            bulk = False
        Elif opt in ('-v'):
            Logger.setLevel(logging.DEBUG)
            Logger.debug("main: verbose mode on")
        else:
            usage()
    if len(args) != 1:
        usage()
    idfile = args[0]
    if not os.path.isfile(idfile):
        print('Not found or not a file: %s' % idfile, file=sys.stderr)
        usage()

    # connect to Twitter
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
    api = tweepy.API(auth)

    # hydrate Tweet IDs
    if bulk:
        get_tweets_bulk(api, idfile)
    else:
        get_tweets_single(api, idfile)

if __name__ == '__main__':
    main(sys.argv[1:])
7
chrisinmtown

実際のコメントを追加するのに十分な評判がありませんので、悲しいことにこれは行く方法です:

Chrisinmtownの回答でバグと奇妙なことを見つけました。

バグのため、100ツイートごとにスキップされます。簡単なソリューションを次に示します。

        if len(Tweet_ids) < 100:
            Tweet_ids.append(Tweet_id)
        else:
            Tweet_ids.append(Tweet_id)
            get_Tweet_list(twapi, Tweet_ids)
            Tweet_ids = list()

レート制限を超えても機能するため、使用することをお勧めします。

api = tweepy.API(auth_handler=auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
5
Someone

Status/lookupエンドポイントを使用して、一括で(一度に最大100件)ツイートにアクセスできます。 https://dev.Twitter.com/rest/reference/get/statuses/lookup

5
verdverm