Обрабатывать код ответа 420, возвращаемый API Tweepy - PullRequest
0 голосов
/ 11 мая 2018

Всякий раз, когда пользователь входит в мое приложение и выполняет поиск, я должен запускать потоковый 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.

Как получить сообщение об ошибке с помощью on_error метода TweetListener класса в def callStream ()

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я бы хотел добавить ответ @ Энди Пайпер. Ответ 420 означает, что ваш сценарий делает слишком много запросов и был ограничен по скорости. Чтобы решить эту проблему, вот что я делаю (в классе TweetListener):

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

Сделайте это, и ошибка будет обработана.

Если вы продолжаете использовать несколько клавиш. Я не уверен, но попробуйте обработать исключения на TweetListener и streamer, для 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
0 голосов
/ 11 мая 2018

По Твиттеру Документация с кодом ответа об ошибке

Возвращается, когда приложение ограничивает скорость выполнения слишком большого количества запросов.

Твиттерпотоковый API не поддерживает более пары соединений на пользователя и IP-адрес.Неправильно использовать политику разработчиков Twitter, чтобы использовать несколько ключей приложения, чтобы попытаться обойти это, и ваши приложения могут быть приостановлены, если вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...