Mam listę tweetów, dla których chciałbym pobrać ich treść tekstową. Czy istnieje jakieś proste rozwiązanie, najlepiej za pomocą skryptu Python? Spojrzałem na inne biblioteki, takie jak Tweepy i rzeczy nie wydają się działać tak prosto, a pobieranie ich ręcznie nie wchodzi w grę, ponieważ moja lista jest bardzo długa.Twitter API - pobierz tweety z konkretnym id
Odpowiedz
Możesz uzyskać dostęp do określonych tweetów według ich identyfikatora za pomocą statuses/show/:id
API route. Większość bibliotek Twittera Python podąża za tymi samymi wzorcami lub oferuje przyjazne nazwy dla metod.
Na przykład Twython oferuje kilka show_*
metod, w tym Twython.show_status()
który pozwala załadować specyficzne tweety:
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'])
i wrócił słowniku następuje Tweet object definition podany przez API.
tweepy
library wykorzystuje 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)
gdzie zwraca nieco bogatsze obiekt, ale atrybuty na nim ponownie odzwierciedlać opublikowaną API.
Dzięki, bardzo pomocne! Właśnie tego szukałem! – Crista23
można uzyskać dostęp tweets luzem (do 100 naraz) z punktu końcowego stanu/odnośników: https://dev.twitter.com/rest/reference/get/statuses/lookup
Udostępnianie mojej pracy, który został znacznie przyspieszony przez poprzednich odpowiedzi (dziękuję). Ten skrypt Python 2.7 pobiera tekst dla tweetów identyfikatorów przechowywanych w pliku. Dostosuj get_tweet_id() dla twojego formatu danych wejściowych; oryginalny skonfigurowany do danych na 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:])
Próbowałem Twojego kodu, funkcja "status_lookup" nie zwraca żadnej wartości, nie otrzymuję nawet żadnego wyjątku. Czy możesz mi zasugerować, co może być nie tak. – charvi
Wysłałem kod, który próbowałem.
–
charvi
Nadal działa dla mnie, przetestowany dziś wieczorem. Czy wygenerowałeś klucz tajny klienta, tajny klucz klienta, tajny token i token przysięgi na apps.twitter.com i umieściłeś je w skrypcie? Czy zainstalowałeś tweepy? Czy użyłeś poprawnego identyfikatora tweeta (np. 260244087901413376)? Gdzie opublikowałeś kod? – chrisinmtown
nie mam wystarczająco dużo reputacji, aby dodać komentarz rzeczywistego tak niestety jest to droga:
znalazłem bug i dziwną cechę odpowiedzi chrisinmtown :
Co 100th tweet zostanie pominięty z powodu błędu. Oto proste rozwiązanie:
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()
Korzystanie jest lepsze, ponieważ działa nawet po przekroczeniu limitu stawki.
api = tweepy.API(auth_handler=auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
Co masz na myśli przez proste? Przepraszam, ale nie ma takiego narzędzia, które będzie wymagać od ciebie wprowadzania tweetów głosowych i pobierania. Musisz napisać, tweepy BTW jest jedną z najłatwiejszych i najlepiej udokumentowanych bibliotek API twitterów. – ZdaR