2015-06-29 33 views
12

Używam następujący kod do przesyłania wiadomości bezpośrednio odbierane przez mojego konta Twitter -:żywo Twitter bezpośrednie komunikaty

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

jestem w stanie dostać swoje nazwisko drukowanej, jak również „to połączenie!” wiadomość.
Ale kiedy wysyłam bezpośrednią wiadomość do mojego profilu z profilu mojego znajomego, żadna metoda nie jest wywoływana.
Chociaż za każdym razem, gdy tweetuję coś z mojego profilu, jest ono drukowane poprawnie przez program.

Ja i mój przyjaciel śledzimy się wzajemnie na Twitterze, więc nie powinno być żadnych problemów z bezpośrednimi uprawnieniami do wiadomości.

Jaki jest właściwy sposób na zrobienie tego?

Ponadto, jeśli w ogóle nie można tego zrobić przy użyciu Tweepy, jestem gotowy do użycia dowolnej innej biblioteki Pythona.

Używam Tweepy 3.3.0 i Python 3.4 na Windows 7.

Odpowiedz

6

kod podany w pytaniu jest rzeczywiście poprawna.
Problem polegał na tym, że zapomniałem zregenerować token dostępu i tajny klucz po zmianie uprawnień do aplikacji na "Czytaj, pisz i kieruj wiadomościami".

Uwaga: Bezpośrednie nadejściu wiadomości w metodzie on_data() zamiast metody on_direct_message().

0

Innym rozwiązaniem jest nie przesłonięcie metody on_data. W ten sposób otrzymałem przykład kodu do pracy w moim przypadku.

Metoda on_data obiektu tweepy.streaming.StreamListener zawiera wszystkie dane json dotyczące obsługi i wywoływania innych metod, takich jak on_direct_message, których oczekiwaliśmy.

0

Oto wersja robocza kodu w 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'])