2013-03-26 9 views
10

Ich versuche, Daten von Twitter zu erhalten, mit Tweepy für einen Benutzernamen eingegeben an der Befehlszeile. Ich möchte ein paar Daten über den Status und den Benutzer extrahieren, also habe folgendes herausgefunden:Wie kann ich alle Tweets und Attribute für einen bestimmten Benutzer mit Python abrufen?

Beachten Sie, dass ich alle erforderlichen Module ok importiere und oauth + Schlüssel habe (nur nicht hier enthalten)) und der Dateiname korrekt ist, nur geändert:

# define user to get tweets for. accepts input from user 
user = tweepy.api.get_user(input("Please enter the twitter username: ")) 

# Display basic details for twitter user name 
print (" ") 
print ("Basic information for", user.name) 
print ("Screen Name:", user.screen_name) 
print ("Name: ", user.name) 
print ("Twitter Unique ID: ", user.id) 
print ("Account created at: ", user.created_at) 

timeline = api.user_timeline(screen_name=user, include_rts=True, count=100) 
    for tweet in timeline: 
     print ("ID:", tweet.id) 
     print ("User ID:", tweet.user.id) 
     print ("Text:", tweet.text) 
     print ("Created:", tweet.created_at) 
     print ("Geo:", tweet.geo) 
     print ("Contributors:", tweet.contributors) 
     print ("Coordinates:", tweet.coordinates) 
     print ("Favorited:", tweet.favorited) 
     print ("In reply to screen name:", tweet.in_reply_to_screen_name) 
     print ("In reply to status ID:", tweet.in_reply_to_status_id) 
     print ("In reply to status ID str:", tweet.in_reply_to_status_id_str) 
     print ("In reply to user ID:", tweet.in_reply_to_user_id) 
     print ("In reply to user ID str:", tweet.in_reply_to_user_id_str) 
     print ("Place:", tweet.place) 
     print ("Retweeted:", tweet.retweeted) 
     print ("Retweet count:", tweet.retweet_count) 
     print ("Source:", tweet.source) 
     print ("Truncated:", tweet.truncated) 

ich würde dies gerne schließlich durch alle eines Benutzers Tweets iterieren (bis 3200 Grenze). Das Wichtigste zuerst. Bisher obwohl ich zwei Probleme haben, bekomme ich folgende Fehlermeldung in Bezug auf Retweets:

Please enter the twitter username: barackobamaTraceback (most recent call last): 
    File " usertimeline.py", line 64, in <module> 
    timeline = api.user_timeline(screen_name=user, count=100, page=1) 
    File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call 
    raise TweepError(error_msg) 
tweepy.error.TweepError: Twitter error response: status code = 401 
Traceback (most recent call last): 
    File "usertimeline.py", line 42, in <module> 
    user = tweepy.api.get_user(input("Please enter the twitter username: ")) 
    File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call 
    raise TweepError(error_msg) 
tweepy.error.TweepError: Twitter error response: status code = 404 

Passing den Benutzernamen als eine Variable auch ein Problem zu sein scheint:

Traceback (most recent call last): 
    File " usertimleline.py", line 64, in <module> 
    timeline = api.user_timeline(screen_name=user, count=100, page=1) 
    File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call 
    raise TweepError(error_msg) 
tweepy.error.TweepError: Twitter error response: status code = 401 

Ich habe isoliert diese beiden Fehler, dh sie arbeiten nicht zusammen.

Verzeihen Sie meine Ignoranz, ich bin nicht zu heiß mit Twitter APIs, aber lerne ziemlich schnell. Die Dokumentation von Tweepy ist wirklich scheiße und ich habe viel im Netz gelesen, ich kann es einfach nicht reparieren lassen. Wenn ich das sortieren kann, werde ich ein paar Unterlagen hochladen.

Ich weiß, wie man die Daten in eine MySQL db sobald extrahiert extrahiert (es wird das tun, anstatt auf dem Bildschirm zu drucken) und manipulieren, damit ich Sachen damit machen kann, es gerade herauskommt, dass ich bin Probleme haben mit. Hat jemand irgendwelche Ideen oder gibt es eine andere Methode, die ich in Betracht ziehen sollte?

Jede Hilfe wirklich geschätzt. Prost

EDIT:

von @Eric heute Morgen Olson Im Anschluss an Vorschlag; Ich habe Folgendes getan.

1) Erstellt eine völlig neue Reihe von Oauth Anmeldeinformationen zu testen. 2) kopierten Code über in ein neues Skript wie folgt:

Oauth

consumer_key = "(removed)" 
consumer_secret = "(removed)" 
access_key="88394805-(removed)" 
access_secret="(removed)" 
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_key, access_secret) 
api=tweepy.API(auth) 



# confirm account being used for OAuth 
print ("API NAME IS: ", api.me().name) 
api.update_status("Using Tweepy from the command line") 

Das erste Mal, dass ich das Skript ausführen, es funktioniert gut und aktualisiert meinen Status und gibt den Namen API wie folgt:

>>> 
API NAME IS: Chris Howden 

dann von diesem Punkt auf bekomme ich diese:

Traceback (most recent call last): 
    File "C:/Users/Chris/Dropbox/Uni_2012-3/6CC995 - Independent Studies/Scripts/get Api name and update status.py", line 19, in <module> 
    api.update_status("Using Tweepy frm the command line") 
    File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call 
    raise TweepError(error_msg) 
tweepy.error.TweepError: Twitter error response: status code = 403 

Die Der einzige Grund, warum ich dafür etwas tun kann, ist, dass es das generierte Zugriffstoken zurückweist. Ich sollte das Zugangstoken nicht erneuern müssen, sollte ich?

Antwort

6

Wenn Sie versuchen, eine andere Bibliothek sind offen, Sie rauth einen Schuss geben könnte. Es gibt bereits a Twitter example aber wenn Sie das Gefühl faul und will einfach nur ein funktionierendes Beispiel, hier ist, wie ich den Demo-Skript ändern würde:

from rauth import OAuth1Service 

# Get a real consumer key & secret from https://dev.twitter.com/apps/new 
twitter = OAuth1Service(
    name='twitter', 
    consumer_key='J8MoJG4bQ9gcmGh8H7XhMg', 
    consumer_secret='7WAscbSy65GmiVOvMU5EBYn5z80fhQkcFWSLMJJu4', 
    request_token_url='https://api.twitter.com/oauth/request_token', 
    access_token_url='https://api.twitter.com/oauth/access_token', 
    authorize_url='https://api.twitter.com/oauth/authorize', 
    base_url='https://api.twitter.com/1/') 

request_token, request_token_secret = twitter.get_request_token() 

authorize_url = twitter.get_authorize_url(request_token) 

print 'Visit this URL in your browser: ' + authorize_url 
pin = raw_input('Enter PIN from browser: ') 

session = twitter.get_auth_session(request_token, 
            request_token_secret, 
            method='POST', 
            data={'oauth_verifier': pin}) 

params = {'screen_name': 'github', # User to pull Tweets from 
      'include_rts': 1,   # Include retweets 
      'count': 10}    # 10 tweets 

r = session.get('statuses/user_timeline.json', params=params) 

for i, tweet in enumerate(r.json(), 1): 
    handle = tweet['user']['screen_name'].encode('utf-8') 
    text = tweet['text'].encode('utf-8') 
    print '{0}. @{1} - {2}'.format(i, handle, text) 

Sie können dies ausführen, wie sie ist, aber sicher sein, um die Anmeldeinformationen zu aktualisieren! Diese sind nur für Demozwecke gedacht.

Volle Offenlegung, ich bin der Betreuer von Rohth.

+0

Ace, danke für deine Bemühungen. Ich habe in der Zwischenzeit versucht, einen anderen Weg zu finden, mit dem Tweepy-Modul alles zu bekommen, was ich wollte, aber das hilft, json ein wenig besser zu verstehen. – chowden

+0

Ich werde posten, was ich gefunden habe, wenn alles fertig ist. – chowden

5

Sie erhalten 401 Antwort, was "nicht autorisiert" bedeutet. (see HTTP status codes)

Ihr Code sieht gut aus. Die Verwendung von api.user_timeline(screen_name="some_screen_name") funktioniert für mich in dem alten Beispiel, das ich herumliegen habe.

Ich vermute, Sie müssen entweder die App autorisieren, oder es gibt ein Problem mit Ihrem OAuth-Setup.

Vielleicht finden Sie das schon, aber hier ist die kurze Codebeispiel, das ich aus gestartet: https://github.com/nloadholtes/tweepy/blob/nloadholtes-examples/examples/oauth.py

+0

Prost. Ich habe heute Morgen ein wenig mehr Nachforschungen angestellt, und ich habe einige zusätzliche Erkenntnisse zum ursprünglichen Beitrag hinzugefügt ... – chowden

Verwandte Themen