【问题标题】:Handle 420 response code returned by Tweepy api处理 Tweepy api 返回的 420 响应码
【发布时间】:2018-10-21 17:10:37
【问题描述】:

每当用户登录我的应用程序并进行搜索时,我都必须启动一个流式 API 来获取他所需的数据。

这是我的流 API 类

import tweepy
import json
import sys

class TweetListener(tweepy.StreamListener):

    def on_connect(self):
        # Called initially to connect to the Streaming API
        print("You are now connected to the streaming API.")

    def on_error(self, status_code):
        # On error - if an error occurs, display the error / status code
        print('An Error has occured: ' + repr(status_code))
        return False

    def on_data(self, data):
        json_data = json.loads(data)
        print(json_data)

这是我的 python 代码文件,它调用上面的类来启动 Twitter 流

import tweepy
from APIs.StreamKafkaApi1 import TweetListener
consumer_key = "***********"
consumer_secret = "*********"
access_token  = "***********"
access_secret = "********"
hashtags = ["#ipl"]

def callStream():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    api = tweepy.API(auth,wait_on_rate_limit=True)

    tweetListener = TweetListener(userid,projectid)
    streamer = tweepy.Stream(api.auth, tweetListener)
    streamer.filter(track=hashtags, async=True)
if __name__ == "__main__":
    callStream()

但如果我的应用程序点击了两次以上返回错误代码 420。 我想更改 API(使用多个键) 用于在发生错误 420 时获取数据。

如何获取 TweetListener 类的 on_error 方法引发的错误def callStream()

【问题讨论】:

    标签: python twitter error-handling tweepy twitter-streaming-api


    【解决方案1】:

    我想补充一下@Andy Piper 的回答。响应 420 表示您的脚本发出了太多请求并且已受到速率限制。为了解决这个问题,这是我所做的(在 TweetListener 类中):

    def on_limit(self,status):
        print ("Rate Limit Exceeded, Sleep for 15 Mins")
        time.sleep(15 * 60)
        return True
    

    执行此操作,错误将得到处理。

    如果您坚持使用多个键。我不确定,但尝试对 TweetListener 和流媒体进行异常处理,对于 tweepy.error.RateLimitError 并使用下一个 API 密钥对函数进行递归调用?

    def callStream(key):
        #authenticate the API keys here
        try:
            tweetListener = TweetListener(userid,projectid)
            streamer = tweepy.Stream(api.auth, tweetListener)
            streamer.filter(track=hashtags, async=True)
        except tweepy.TweepError as e:
            if e.reason[0]['code'] == "420":
                callStream(nextKey)
        return True
    

    【讨论】:

    • 很抱歉,TweetListener 类没有返回您提到的上述定义中要捕获的任何内容,而且对于多个请求 time.sleep(15*60) 不是一个合适的解决方案,这里是我的使用现有密钥提出新请求,因此没有帮助。我无法从 TweetListener 类获得任何响应代码,这是其中的主要问题。
    • on_limit 解决方案似乎也不适合我。我使用它仍然得到 420 错误,并且 on_limit 函数被绕过。 (它不打印字符串)。该函数究竟是做什么的,它是如何调用的?
    【解决方案2】:

    根据 Twitter error response code documentation

    当应用程序因制作过多而受到速率限制时返回 请求。

    Twitter 流式处理 API 不支持每个用户和 IP 地址超过两个连接。使用多个应用程序密钥试图规避这一点是违反 Twitter 开发者政策的,如果这样做,您的应用程序可能会被暂停。

    【讨论】:

    • 我同意你提到的 twitter 的限制,我正在开发一个 poc,为了显示应用程序在功能方面工作是正确的,我使用了这种方法,完整版的应用程序将购买密钥来自推特。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2017-05-09
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多