0

TwitterでPHPを使って2、3回検索したらレート制限されてるとエラー出た。

 function twitter_class()
{
    $this->realNamePattern = '/\((.*?)\)/';


$this->intervalNames   = array('second', 'minute', 'hour', 'day', 'week', 'month', 'year');
$this->intervalSeconds = array( 1,        60,       3600,   86400, 604800, 2630880, 31570560);

    $this->badWords = array('somebadword', 'anotherbadword');
}
function searchURL($language, $query) {
    $func_args=func_get_args();
    $vars = array_map('urlencode', $func_args + array('', ''));        
    return vsprintf('http://search.twitter.com/search.atom?lang=%s&q=%s', $vars);
}

function getTweets($q,$lang, $limit=15)
{
    $output = '';

    // get the seach result

   $ch = curl_init($this->searchURL($lang, $q));


    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

    $response = curl_exec($ch);

    if ($response !== FALSE)
    {
        $xml = simplexml_load_string($response);

        $output = '';
        $tweets = 0;

        for($i=0; $i<count($xml->entry); $i++)
        {
            $crtEntry = $xml->entry[$i];
            $account  = $crtEntry->author->uri;
            $image    = $crtEntry->link[1]->attributes()->href;
            $tweet    = $crtEntry->content;

            // skip tweets containing banned words
            $foundBadWord = false;
            foreach ($this->badWords as $badWord)
            {
                if(stristr($tweet, $badWord) !== FALSE)
                {
                    $foundBadWord = true;
                    break;
                }
            }

            $tweet = str_replace('<a href=', '<a target="_blank" href=', $tweet);

            // skip this tweet containing a banned word
            if ($foundBadWord)
                continue;

            // don't process any more tweets if at the limit
            if ($tweets==$limit)
                break;
            $tweets++;

            // name is in this format "acountname (Real Name)"
            preg_match($this->realNamePattern, $crtEntry->author->name, $matches);
            $name = $matches[1];

            // get the time passed between now and the time of tweet, don't allow for negative
            // (future) values that may have occured if server time is wrong
            $time = 'just now';
            $secondsPassed = time() - strtotime($crtEntry->published);

            if ($secondsPassed>0)
            {
                // see what interval are we in
                for($j = count($this->intervalSeconds)-1; ($j >= 0); $j--)
                {
                    $crtIntervalName = $this->intervalNames[$j];
                    $crtInterval = $this->intervalSeconds[$j];

                    if ($secondsPassed >= $crtInterval)
                    {
                        $value = floor($secondsPassed / $crtInterval);
                        if ($value > 1)
                            $crtIntervalName .= 's';

                        $time = $value . ' ' . $crtIntervalName . ' ago';

                        break;
                    }
                }
            }

これが私のコードです。それを見て、私が遅れている正確な解決策を見つけてください

4

2 に答える 2

1

Twitter API の使用には制限があります。共有サーバーでそのコードをテストしている場合 (つまり、あなたの IP が Twitter API を使用している他の人によって使用されている場合)、これが発生する可能性があります。それとも、リクエストが多すぎますか...

https://dev.twitter.com/docs/rate-limiting#search

検索 API レート制限

search.twitter.com でホストされている Search API へのリクエストは、REST API の制限にはカウントされません。ただし、IP アドレスからのすべてのリクエストは、検索レート制限に適用されます。検索レート制限は、不必要な検索の使用や悪用を防ぐために公開されていませんが、REST レート制限よりも高くなっています。Search Rate Limit は自由度が高く、ほとんどのアプリケーションにとって十分であると感じており、多くのアプリケーション ベンダーがニーズに適していることを認識しています。

検索 API の要件

検索 API を使用するには、アプリケーションに固有の識別ユーザー エージェント文字列が含まれている必要があります。HTTP リファラーが必要ですが、必須ではありません。検索 API を使用しているが、ユーザー エージェント文字列を含めていないアプリケーションは、より低いレート制限を受け取ります。

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

代わりにストリーミング API を使用する

Search API は、ユーザーが開始するアドホック クエリに最適です。アプリケーションで Search API のポーリングを繰り返す必要がある場合は、代わりにストリーミング API を検討することをお勧めします。

レート制限を回避するためのヒント

以下のヒントは、コーディングを防御的に行い、レート制限される可能性を減らすのに役立ちます。

提供したいアプリケーション機能の中には、特に結果の鮮度に関するレート制限を考慮すると、まったく不可能なものがあります。リアルタイムの情報がアプリケーションの目的である場合は、ユーザー ストリームまたはサイト ストリームを調べてください。

キャッシング

多くの使用が予想される場合は、アプリケーションまたはサイトに API 応答を保存します。たとえば、Web サイトのランディング ページのページが読み込まれるたびに Twitter API を呼び出そうとしないでください。代わりに、API を頻繁に呼び出しず、応答をローカル キャッシュにロードします。ユーザーが Web サイトにアクセスすると、キャッシュされたバージョンの結果が読み込まれます。

アクティブなユーザーを優先する

サイトで多くの Twitter ユーザーを追跡している場合 (たとえば、現在のステータスや Twitter の使用状況に関する統計を取得する場合)、サイトに最近サインインしたユーザーのデータのみを要求することを検討してください。

検索結果に適応する

アプリケーションが大量の検索用語を監視している場合は、結果のない検索をクエリする頻度を、結果のある検索よりも少なくします。バックオフを使用することで、人気のあるクエリを最新の状態に保つことができますが、めったに変更されないクエリを要求するサイクルを無駄にすることはありません。

または、ストリーミング API の使用を検討し、検索用語でフィルタリングしてください。

于 2012-04-22T19:28:44.763 に答える
0

Twitter の制限を回避したい場合は、異なる IP を持つ多数のマシンを取得し、異なる時間に呼び出されるようにそれらの間で検索要求を分散するか、クエリをクライアント側に移動します (多数のクライアントが検索していると仮定します)。安全性は劣りますが、帯域幅が改善されることを願っています。

于 2012-04-23T09:34:13.777 に答える