0

在搜索 2 或 3 后使用 PHP 在 Twitter 上搜索时,我收到了您的错误是速率限制。增强您在 PHP 中的冷静

 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 速率限制。我们认为搜索速率限制对于大多数应用程序来说既宽松又足够,并且知道许多应用程序供应商已经发现它适合他们的需求。

搜索 API 的要求

搜索 API 的使用要求应用程序包含唯一且可识别的用户代理字符串。HTTP 引荐来源网址是预期的,但不是必需的。使用搜索 API 但未包含用户代理字符串的应用程序将收到较低的速率限制。

超出 Search API 速率限制的应用程序将收到 HTTP 420 响应代码。最佳做法是注意此错误情况并尊重返回的 Retry-After 标头。Retry-After 标头的值是您的应用程序在再次从 Search API 请求日期之前应等待的秒数。

改用流式 API

搜索 API 最适合用户发起的即席查询。如果您的应用程序需要重复的 Search API 轮询,您可能需要考虑使用 Streaming API。

避免被限价的提示

以下提示可帮助您进行防御性编码并减少速率受限的可能性。

鉴于速率限制,您可能想要提供的某些应用程序功能根本不可能,尤其是在结果的新鲜度方面。如果实时信息是您的应用程序的目标,请查看用户流或站点流。

缓存

如果您期望大量使用,请将 API 响应存储在您的应用程序或您的网站上。例如,不要尝试在您的网站登录页面的每个页面加载时调用 Twitter API。相反,不经常调用 API 并将响应加载到本地缓存中。当用户访问您的网站时,会加载结果的缓存版本。

优先考虑活跃用户

如果您的网站跟踪许多 Twitter 用户(例如,获取他们的当前状态或有关其 Twitter 使用情况的统计信息),请考虑仅请求最近登录您网站的用户的数据。

适应搜索结果

如果您的应用程序监控大量搜索词,则对没有结果的搜索的查询频率要低于对有结果的搜索的查询频率。通过使用回退,您可以及时了解流行的查询,但不会浪费周期请求很少更改的查询。

或者,考虑使用 Streaming API 并过滤您的搜索词。

于 2012-04-22T19:28:44.763 回答
0

如果您想绕过 twitter 限制,那么您要么获得许多具有不同 IP 的机器并在它们之间分配搜索请求,以便在不同时间调用它们,要么将查询移动到客户端(假设您有很多客户在寻找)并希望他们提高您的带宽,尽管它不会那么安全。

于 2012-04-23T09:34:13.777 回答