2015-02-07 3 views
11

У меня есть список твитов, для которых я хотел бы загрузить их текстовое содержимое. Есть ли простое решение для этого, желательно с помощью скрипта Python? Я смотрел на другие библиотеки, такие как Tweepy, и все выглядит не так просто, и загрузка их вручную не может быть и речи, поскольку мой список очень длинный.Twitter API - получить твиты с определенным идентификатором

+0

Что вы подразумеваете под простейшим? Извините, но нет такого инструмента, который будет принимать голосовые данные и загружать твиты для вас, вам нужно закодировать, BTW tweepy - одна из самых простых и хорошо документированных библиотек API Twitter. – ZdaR

ответ

16

Вы можете получить доступ к определенным твитам по их идентификатору с помощью statuses/show/:id API route. Большинство библиотек Python Twitter соответствуют тем же шаблонам или предлагают «дружественные» имена для этих методов.

Например, Twython предлагает несколько show_* методов, в том числе Twython.show_status(), что позволяет загружать определенные твиты:

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']) 

и возвращаемый словарь следует Tweet object definition заданную API.

tweepy library использует tweepy.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.

+0

Спасибо, очень полезно! Это именно то, что я искал! – Crista23

3

Разделяя мою работу, которая была значительно ускоряется предыдущие ответы (спасибо). Этот скрипт Python 2.7 извлекает текст для идентификаторов твитов, хранящихся в файле. Отрегулируйте get_tweet_id() для вашего формата входных данных; оригинал сконфигурирован для передачи данных на https://github.com/mdredze/twitter_sandy

''' 
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' 

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('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('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) 
    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('Fetching tweet for ID %s', tweet_id) 
      # API limits batch size to 100 
      if len(tweet_ids) < 100: 
       tweet_ids.append(tweet_id) 
      else: 
       get_tweet_list(twapi, tweet_ids) 
       tweet_ids = list() 
    # process rump of file 
    if len(tweet_ids) > 0: 
     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("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:]) 
+0

Я пробовал свой код, функция «statuses_lookup» не отменяет никакого значения, даже не получаю исключения. Можете ли вы предложить мне, что может быть неправильно. – charvi

+0

Я отправил код, который я попробовал.
charvi

+1

Он по-прежнему работает для меня, проверенный сегодня вечером. Создавали ли вы потребительский ключ, секрет потребителя, токен клятвы и секретные строки клятвы на apps.twitter.com и помещали их в скрипт? Вы установили tweepy? Вы использовали действительный идентификатор твита (например, 260244087901413376)? Где вы отправили код? – chrisinmtown

1

Я не хватает репутации, чтобы добавить фактический комментарий так, к сожалению, это путь:

Я нашел ошибку и странную вещь в 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) 
Смежные вопросы