7

基本認証を使用して Twitterストリーミング APIにフックし、 tweetstreamモジュールを利用する Python スクリプトがあります。

1分間に約10件のツイートを集めています。
断続的な切断が発生していたので、現在、切断の頻度を記録しています。

レート制限に達しており、420 ​​HTTP エラーが発生しています。

検索 API の場合、OAuth 認証を使用するとより高いクォータが得られることはわかっています。ストリーミングについては、basic と OAuth の間のレート制限の違いに関する参照が見つかりませんでした。とにかく、私が使用している python Tweetstream は、ストリーミング API でこれをサポートしていないようです。

Ruby版のTweetstreamがOAuthに対応していることに気づきましたが、Pythonの学習体験としてこのプロジェクトをやっています。

Twitterのヘルプを読むと、「バックオフ戦略」について言及され、次のように言及されています。

HTTP 420 応答を受信した場合は、それ以上の接続試行を数分間停止することが不可欠です。

エラーが発生しなくなりましたが、これらのエラーが永続的に発生しないように、コードでより良いロジックを作成しようとしています。

私の現在の提案は以下のとおりです。これは、再接続を試みる前に 200 秒待機します。

while True:
    try:
        with tweetstream.FilterStream(uname, passwd, locations=extent) as stream:
            # do stuff
    except tweetstream.ConnectionError as e:
     print e.message + " time: " + datetime.now
     time.sleep(200)
     pass
    except tweetstream.AuthenticationError as e:
     now = datetime.datetime.now()
     print e.message  + " time: " + str(now)
     pass

私の質問は、これは Twitter から 420 エラーを受け取ることを回避する良い方法ですか? Twitter API に詳しい方にお勧めの方法を教えてください。

4

1 に答える 1

15

420

レート限定。考えられる理由は次のとおりです。

短時間にログイン試行回数が多すぎます。同じアカウント名で認証する同じアプリケーションのコピーが多すぎます。

ツイート ストリーミングのレートがこのように低い場合 (1 分間に 10 ツイート)、レート制限エラーが発生することはありません。実際、ストリーマーにはレート制限が適用されません。短期間にログイン試行が多すぎるため、このエラーが発生します。そのため、しばらく待つことをお勧めします (私は切断ごとに 10 秒待ちますが、これはめったに発生しません)。Twitter の例外ではなく、内部プログラミングの例外が原因でストリーマーが中断されていないことを確認してください。また、以下の提案も参照してください。

同じ IP を介して実行されているストリームが 1 つだけであることを確認する必要があります。Twitter では、IP ごと、基本認証ごとに 1 つのストリーマーを実行できます。そのため、特定の IP から一意のストリームを実行していることと、oauth 認証用に指定した資格情報がこのストリームにのみ使用されていることを確認してください。その後、420 ​​エラーは発生しません。

ただし、何らかの理由でストリーマーが Twitter の例外または内部プログラミングの例外によって中断されている場合は、再接続する前にしばらく待って、それ以上の例外が発生しないようにする必要があります。Twitter はまた、応答コード ヘッダーで再接続するまでに必要な時間を返します (以下は検索用ですが、ストリーミング用にも含める必要があります)。

Search API の速度制限を超えるアプリケーションは、HTTP 420 応答コードを受け取ります。このエラー状態を監視し、返された Retry-After ヘッダーを尊重することをお勧めします。Retry-After ヘッダーの値は、Search API からの日付を再度リクエストする前にアプリケーションが待機する秒数です。

于 2013-01-04T08:26:18.167 に答える