2015-06-29 4 views
12

Я использую следующий код для потоковой передачи прямых сообщений, полученных мой счет Twitter -:Streaming Twitter прямого сообщения

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

Я могу получить мое имя напечатанное, а также «Соединение установлено!» сообщение.
Но всякий раз, когда я отправляю прямое сообщение в свой профиль из профиля моего друга, метод не вызывается.
Хотя всякий раз, когда я чирикаю что-то из своего профиля, он правильно печатается программой.

Я и мой друг оба следуют друг за другом в Twitter, поэтому не должно быть никаких проблем с правами прямого сообщения.

Каков правильный способ?

Кроме того, если это невозможно сделать в Tweepy вообще, я готов использовать любую другую библиотеку Python.

Я использую Tweepy 3.3.0 и Python 3.4 на Windows 7.

ответ

6

код, предоставленный в этом вопросе действительно правильно.
Проблема заключалась в том, что я забыл восстановить токен доступа и секрет после изменения разрешений для приложений на «Чтение, запись и прямые сообщения».

Примечание: Прямые сообщения приходят в методе on_data(), а не методом on_direct_message().

0

Другим решением является не переопределять метод on_data. Вот как я получил ваш пример кода для работы в моем случае.

Метод on_data объекта tweepy.streaming.StreamListener содержит всю обработку данных json и вызов других методов, таких как on_direct_message, которые вы и я ожидали.

0

Вот рабочая версия кода в 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']) 
Смежные вопросы