我正在使用一些jQuery来显示推文但是一旦达到Twitter API限制,就会发送请求,但只是继续加载和加载。这看起来不太好。我希望能够确定请求是否花费太长时间,然后显然做了一些事情,比如取消请求,更改样式等等。
所以这是发送请求的代码:
var fileref = document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", "http://search.twitter.com/search.json?q="+buildString+"&callback=TweetTick&rpp=50");
document.getElementsByTagName("head")[0].appendChild(fileref);
这是TweetTick功能:
function TweetTick(ob)
{
var container=$('#tweet-container');
container.html('');
$(ob.results).each(function(el){
/* in here, a div is built for each tweet and then appended to container */
});
container.jScrollPane(); /* just adds the scrollbar */
}
答案 0 :(得分:2)
您需要在服务器端缓存twitter api响应。
答案 1 :(得分:1)
我最近遇到了一个非常类似的问题。我使用Remy Sharp的这个脚本来处理我的大部分Twitter请求:http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/
您需要了解的是api超时是每个IP地址。因此,如果api根据您的测试时间超时,则不会为其他IP地址上的其他人超时。现在,如果访问该网站的某个人在公司或企业内这样做,并且同一地方的其他人也在这样做,那么该超时几乎会立即发生。
要解决此问题,您需要缓存结果。我这样做的方式如下。
我使用以下代码创建了一个twitter缓存系统:
$twitter_username = "tadywankenobi"; //
$number_of_tweets = "10";
$options[CURLOPT_URL] = 'http://api.twitter.com/1/statuses/user_timeline.xml?screen_name='.$twitter_username.'&count='.$number_of_tweets.'&include_rts=1';
$options[CURLOPT_PORT] = 80;
$options[CURLOPT_FOLLOWLOCATION] = true;
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_TIMEOUT] = 60;
$tweets = cache($options);
$twxml = new SimpleXMLElement($tweets);
echo "<ul>";
for($i=0;$i<=($number_of_tweets-1);$i++){
$text = $twxml->status[$i]->text;
echo "<li>".auto_link_twitter($text)."</li>";
}
echo "</ul>";
function cache($options) {
$cache_filename = "/var/cache/tweets.xml";
if(!file_exists($cache_filename)){
$handle = fopen($cache_filename, 'w') or die('Cannot open file: '.$my_file);
fclose($handle);
}// Check if cache file exists and if not, create it
$time_expire = filectime($cache_filename) + 60*60; // Expire Time (1 hour) // Comment for first run
// Set time to check file against
if(filectime($cache_filename) >= $time_expire || filesize($cache_filename) == 0) {
// File is too old or empty, refresh cache
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
if($response){
file_put_contents($cache_filename, $response);
}
else{
unlink($cache_filename);
}
}else{
$response = file_get_contents($cache_filename);
}
return $response;
}
最后的缓存功能是在服务器上创建一个文件并将twitter xml反馈存储在那里。然后系统检查该文件的年龄,如果它比一小时还小,则从那里获取结果。否则,它会重新访问twitter。您需要将文件写入/ var / cache文件夹(如果不存在则创建它)。
我有点将这些代码整理到一起,所以如果你遇到任何问题,请告诉我。它还使用auto_link_twitter()函数,该函数创建twitter文本中所需的链接。我没有写那个,所以我现在试着找到你的链接。
希望一切都有所帮助,
Ť
更新:我不记得我在哪里获得了auto_link_twitter()函数,所以在这里。如果写这篇文章的人读了这篇文章,我很抱歉,我再也找不到来源了。
function auto_link_twitter($text) {
// properly formatted URLs
$urls = "/(((http[s]?:\/\/)|(www\.))?(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";
$text = preg_replace($urls, " <a href='$1'>$1</a>", $text);
// URLs without protocols
$text = preg_replace("/href=\"www/", "href=\"http://www", $text);
// Twitter usernames
$twitter = "/@([A-Za-z0-9_]+)/is";
$text = preg_replace ($twitter, " <a href='http://twitter.com/$1'>@$1</a>", $text);
// Twitter hashtags
$hashtag = "/#([A-Aa-z0-9_-]+)/is";
$text = preg_replace ($hashtag, " <a href='http://twitter.com/#!/search?q=%23$1'>#$1</a>", $text);
return $text;
}
答案 2 :(得分:0)
您可以使用特定的jQuery方法来发出JSONP请求。基本$.ajax
方法和速记方法$.getJSON
更适合您。要控制请求的超时,可以使用timeout参数。可以使用错误回调处理请求超出超时。
$.ajax(
dataType: 'jsonp',
url: 'http://search.twitter.com/search.json',
data: {
q: buildString,
rpp: 50
},
jsonpCallback: 'TweetTick',
timeout: 30000,
error: function(jqXHR, textStatus, errorThrown) {
if (textStatus == 'timeout') {
alert('timeout exceeded');
}
}
);