Потоковые прямые сообщения Twitter

Я использую следующий код для потоковой передачи прямых сообщений, полученных моей учетной записью 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()

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

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

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

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

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


person Anmol Singh Jaggi    schedule 29.06.2015    source источник


Ответы (3)


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

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

person Anmol Singh Jaggi    schedule 02.07.2015

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

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

person salvor7    schedule 12.11.2016

Вот рабочая версия кода 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'])
person Janusz Chudzynski    schedule 04.05.2017