在推特上搜索了2到3次之后,我得到了一个错误:你一直在用limited.enhance评价你的冷静
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;
}
}
}
这是我的代码,请看一看,找出准确的解决方案
发布于 2012-04-22 19:28:45
使用Twitter API是有限制的。如果您在共享服务器上测试该代码(即如果您的ip正在被使用twitter API的其他人使用),可能会导致此问题。或者你提出了太多的要求...
https://dev.twitter.com/docs/rate-limiting#search
搜索应用编程接口速率限制
对托管在search.twitter.com上的搜索API的请求不会计入REST API限制。但是,来自IP地址的所有请求都应用于搜索速率限制。搜索速率限制并未公开,以阻止不必要的搜索使用和滥用,但它高于REST速率限制。我们认为搜索率限制对于大多数应用程序来说都是宽松和足够的,并知道许多应用程序供应商已经发现它适合他们的需求。
对搜索API的要求
搜索API的使用要求应用程序包含唯一且可识别的用户代理字符串。需要HTTP Referrer,但不是必需的。使用搜索API但未包含用户代理字符串的应用程序将收到较低的速率限制。
超出搜索API速率限制的应用程序将收到HTTP 420响应码。最佳实践是观察此错误情况,并遵循返回的Retry After标头。Retry After标头的值是应用程序在再次从搜索API请求数据之前应等待的秒数。
改用流式API
搜索API最适合用户发起的即席查询。如果您的应用程序需要重复搜索API轮询,则可能需要考虑使用流式API。
避免受到价格限制的小贴士
下面的提示是为了帮助你进行防御性的编码,并减少被速率限制的可能性。
根据速率限制,您可能想要提供的一些应用程序功能是不可能的,尤其是在结果的新鲜度方面。如果应用程序的目标是实时信息,请查看用户流或站点流。
缓存
如果您期望大量使用,请将API响应存储在您的应用程序中或您的站点上。例如,不要试图在网站登录页面的每个页面加载时都调用Twitter API。相反,可以不频繁地调用API并将响应加载到本地缓存中。当用户访问你的网站时,加载缓存版本的结果。
对活跃用户进行优先级排序
如果您的站点跟踪许多Twitter用户(例如,获取他们的当前状态或有关其Twitter使用情况的统计信息),请考虑仅请求最近登录到您的站点的用户的数据。
适应搜索结果
如果您的应用程序监控大量搜索项,则对没有结果的搜索的查询频率要比对有结果的搜索的查询频率低。通过使用退避,您可以保持对流行的查询的更新,而不是浪费请求很少更改的查询的周期。
或者,考虑使用流应用编程接口并对您的搜索项进行过滤。
发布于 2012-04-23 09:34:14
如果你想绕过twitter的限制,那么你要么得到许多不同IP的机器,并在它们之间分配搜索请求,以便在不同的时间调用它们,要么将查询移动到客户端(假设您有很多客户端在寻找),并希望它们提高您的带宽,尽管它不会那么安全。
https://stackoverflow.com/questions/10271154
复制相似问题