流式传输 Twitter 直接消息

Posted

技术标签:

【中文标题】流式传输 Twitter 直接消息【英文标题】:Streaming Twitter direct messages 【发布时间】:2015-09-15 22:44:54 【问题描述】:

我正在使用以下代码流式传输我的 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 库。

我在 Windows 7 上使用 Tweepy 3.3.0 和 Python 3.4。

【问题讨论】:

【参考方案1】:

问题中提供的代码确实是正确的。 问题是我在将我的应用程序权限更改为“Read, write and direct messages”后忘记重新生成访问令牌和密码。

注意:直接消息通过on_data() 方法而不是on_direct_message() 方法到达。

【讨论】:

【参考方案2】:

另一个解决方案是不覆盖 on_data 方法。这就是我如何让您的代码示例在我的情况下工作。

tweepy.streaming.StreamListener 对象的 on_data 方法包含您和我所期望的所有 json 数据处理和其他方法的调用,例如 on_direct_message。

【讨论】:

【参考方案3】:

这是 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'])

【讨论】:

以上是关于流式传输 Twitter 直接消息的主要内容,如果未能解决你的问题,请参考以下文章

Apache Flume twitter 代理没有流式传输数据

如何使用 tweepy 流式传输 Twitter 提及?

Twitter 流式处理脚本在推文的位置字段上抛出一个 keyerror

使用 Python Tweepy 的 Twitter 流 API

使用 twitter gem 发送直接消息

如何通过 Twitter API https://api.twitter.com/1.1/direct_messages/events/new.json 发送新的直接消息?