API de Twitter: obtenga tweets con una identificación específica

Tengo una lista de ID de tweets para los que me gustaría descargar su contenido de texto. ¿Hay alguna solución fácil para hacer esto, preferiblemente a través de un script de Python? Eché un vistazo a otras bibliotecas como Tweepy y las cosas no parecen funcionar tan simple, y descargarlas manualmente está fuera de discusión ya que mi lista es muy larga.

Puede acceder a tweets específicos por su id con los statuses/show/:id API route . La mayoría de las bibliotecas de Python en Twitter siguen exactamente los mismos patrones u ofrecen nombres “amigables” para los métodos.

Por ejemplo, Twython ofrece varios métodos show_* , incluido Twython.show_status() que te permite cargar tweets específicos:

 CONSUMER_KEY = "" CONSUMER_SECRET = "" OAUTH_TOKEN = "" OAUTH_TOKEN_SECRET = " 

y el diccionario devuelto sigue la definición del objeto Tweet dada por la API.

La biblioteca tweepy usa 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) 

donde devuelve un objeto ligeramente más rico, pero los atributos en él nuevamente reflejan la API publicada.

Compartir mi trabajo que fue enormemente acelerado por las respuestas anteriores (gracias). Este script de Python 2.7 obtiene el texto para las ID de tweet almacenados en un archivo. Ajuste get_tweet_id () para su formato de datos de entrada; original configurado para datos en https://github.com/mdredze/twitter_sandy

Actualización de abril de 2018: respuesta tardía al informe de errores de @someone (gracias). Esta secuencia de comandos ya no se descarta cada ID de centésimo tweet (ese fue mi error). Tenga en cuenta que si un tweet no está disponible por el motivo que sea, la búsqueda masiva lo omite silenciosamente. La secuencia de comandos ahora advierte si el tamaño de la respuesta es diferente del tamaño de la solicitud.

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

Puede acceder a los tweets de forma masiva (hasta 100 a la vez) con el punto final de estado / búsqueda: https://dev.twitter.com/rest/reference/get/statuses/lookup

No tengo suficiente reputación para agregar un comentario real, así que, lamentablemente, este es el camino a seguir:

Encontré un error y algo extraño en la respuesta de chrisinmtown:

Cada centésimo tweet será omitido debido al error. Aquí hay una solución simple:

  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() 

El uso es mejor, ya que funciona incluso más allá del límite de velocidad.

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