2015-06-29 11 views
12

ich den folgenden Code verwenden direkte Nachrichten von meinem Twitter-Account empfangen zu streamen -:Streaming Twitter direkte Nachrichten

from tweepy import Stream 
from tweepy import OAuthHandler 
from tweepy import API 

from tweepy.streaming import StreamListener 

# These values are appropriately filled in the code 
consumer_key = "" 
consumer_secret = "" 
access_token = "" 
access_token_secret = "" 

class StdOutListener(StreamListener): 

    def __init__(self): 
     self.tweetCount = 0 

    def on_connect(self): 
     print("Connection established!!") 

    def on_disconnect(self, notice): 
     print("Connection lost!! : ", notice) 

    def on_data(self, status): 
     print("Entered on_data()") 
     print(status, flush = True) 
     return True 

    def on_direct_message(self, status): 
     print("Entered on_direct_message()") 
     try: 
      print(status, flush = True) 
      return True 
     except BaseException as e: 
      print("Failed on_direct_message()", str(e)) 

    def on_error(self, status): 
     print(status) 

def main(): 

    try: 
     auth = OAuthHandler(consumer_key, consumer_secret) 
     auth.secure = True 
     auth.set_access_token(access_token, access_token_secret) 

     api = API(auth) 

     # If the authentication was successful, you should 
     # see the name of the account print out 
     print(api.me().name) 

     stream = Stream(auth, StdOutListener()) 

     stream.userstream() 

    except BaseException as e: 
     print("Error in main()", e) 

if __name__ == '__main__': 
    main() 

Ich bin in der Lage zu bekommen, meinen Namen gedruckt, sowie die „Verbindung hergestellt!“ Botschaft.
Aber immer, wenn ich eine direkte Nachricht an mein eigenes Profil aus dem Profil meines Freundes sende, wird keine Methode aufgerufen.
Obwohl, wenn ich etwas von meinem Profil tweete, es vom Programm richtig gedruckt wird.

Ich und mein Freund folgen einander auf Twitter, also sollte es keine Probleme mit den direkten Nachrichtenberechtigungen geben.

Was ist der richtige Weg, es zu tun?

Auch wenn es in Tweepy überhaupt nicht möglich ist, bin ich bereit, jede andere Python-Bibliothek zu verwenden.

Ich verwende Tweepy 3.3.0 und Python 3.4 auf Windows 7.

Antwort

6

den Code in der Frage vorgesehen ist in der Tat richtig.
Das Problem war, dass ich vergessen hatte, das Zugriffstoken und das Geheimnis nach dem Ändern meiner Anwendungsberechtigungen zu "Lesen, Schreiben und direkte Nachrichten" zu regenerieren.

Hinweis: Die direkten Nachrichten im on_data() Verfahren kommen statt der on_direct_message() Methode.

0

Eine andere Lösung besteht darin, die on_data-Methode nicht zu überschreiben. So habe ich Ihr Code-Beispiel in meinem Fall funktioniert.

Die Methode "on_data" des Objekts "tweepy.streaming.StreamListener" enthält alle Json-Daten, die mit anderen Methoden verarbeitet und aufgerufen werden, wie on_direct_message, die Sie und ich erwartet haben.

0

Hier ist eine Arbeitsversion des Codes 2017

from twitter import * 
import os 

import oauth 

#Create a new Twitter app first: https://apps.twitter.com/app/new 


APP_KEY,APP_SECRET = 'H3kQtN5PQgRiA0ocRCCjqjt2P', '51UaJFdEally81B7ZXjGHkDoDKTYy430yd1Cb0St5Hb1BVcDfE' 
# OAUTH_TOKEN, OAUTH_TOKEN_SECRET = '149655407-TyUPMYjQ8VyLNY5p7jq0aMy8PjtFtd7zkIpDh3ZA', 'IUVpiDpoVmdO75UaHOTinAv5TOsAQmddttNENh9ofYuWO' 


MY_TWITTER_CREDS = os.path.expanduser('my_app_credentials') 
if not os.path.exists(MY_TWITTER_CREDS): 
    oauth_dance("crypto sentiments", APP_KEY, APP_SECRET, 
       MY_TWITTER_CREDS) 

oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS) 

auth = OAuth(
    consumer_key=APP_KEY, 
    consumer_secret=APP_SECRET, 
    token=oauth_token, 
    token_secret=oauth_secret 
) 

twitter_userstream = TwitterStream(auth=auth, domain='userstream.twitter.com') 
for msg in twitter_userstream.user(): 
    if 'direct_message' in msg: 
     print (msg['direct_message']['text']) 
Verwandte Themen