Twitter api每小时只允许150次json通话,Twitter会丢弃不需要的cookie。 我该如何防止这种情况?
我在我的网站上有一个twitter feed,它由jquery tweet插件tweet.seaofclouds.com和其他一些从第三方网站获取json feed的json插件提供支持。
问题是数据,twitter api每小时只允许150个电话,所以每小时有40个访问者,平均每个访问者有5个网页浏览量,我会超过最大值。 特别是因为twitter禁用缓存上的feed。
此外,还有coockie法律问题。 Twitter在请求提要时丢弃cookie,我不想要它们,因为他们需要有权删除,所以我想一直禁用它们。
我的网站也是SSL安全的,我希望尽可能少地加载外部资源,我希望它全部本地化。
如何在本地缓存这些json提要?
对于这个问题,我编写了自己的数据库存储机制来存储json提要并在需要时获取它们并返回它们。 这样我只需每5分钟取一次,我得到的访客/浏览量就无关紧要了。
这是mysql中的数据库创建代码
CREATE TABLE IF NOT EXISTS `twitterbackup` ( `url` text NOT NULL, `tijd` int(11) NOT NULL, `inhoud` text NOT NULL, FULLTEXT KEY `url` (`url`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
然后在PHP中我有这些代码和一些安全检查,因为你永远不会知道你会得到什么
query("SELECT count(*) as counter FROM twitterbackup WHERE `url`='$saveurl'")->fetch_assoc(); // Has the url been found? if($count['counter'] == 0) { // Fetch twitter json $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $data = curl_exec($ch); curl_close($ch); // make the json data database safe $data = str_replace('\\','\\\\',$data); $data = mysql_real_escape_string($data); //$data = mysql_real_escape_string($data); // Enter json data in the database $db->query("INSERT INTO `DATABASE`.`twitterbackup` (`url`, `tijd`, `inhoud`) VALUES ('$saveurl', '$now', '$data')"); // End of we have not found the url } // If the URL has been found else { // get the values in the database that are connected to the url $res = $db->query("SELECT * FROM twitterbackup WHERE `url`='$saveurl'")->fetch_assoc(); // Is the current json in database younger than five minutes? if((int)$res['tijd'] < (int)strtotime("-5 minutes")) { // Fetch twitter json with curl $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $data = curl_exec($ch); curl_close($ch); // Make the json data safe for the database $data = str_replace('\\','\\\\',$data); $data = mysql_real_escape_string($data); // Update the database with the most recent feed $db->query("UPDATE `DATABASE`.`twitterbackup` SET `tijd` = '$now', `inhoud` = '$data' WHERE `twitterbackup`.`url` = '$saveurl'"); // End if the url has been found and lifetime is older than five minutes } // If the lifetime isn't older then 5 minutes else { // return database content $data = $res['inhoud']; } // end of if we have found the url } // try to beat mysql_real_escape_string to return valid json. Always check valid json returend and edit this if it fails at some piece. Try http://jsonlint.com/ $data = str_replace('\\"','"',$data); // implode because str_replace won't do everthing for some reason I can't understand. $data = implode('\\',explode('\\\\',$data)); // Data retourneren return $data; // end check if it's from the twitter api } // End of function get_data(); // How long may the json be cached by browser(to stop unneccesary requests in this case 5 minutes) $seconds_to_cache = 5*60; $ts = gmdate("D, d MYH:i:s", time() + $seconds_to_cache) . " GMT"; header("Expires: $ts"); header("Pragma: cache"); header("Cache-Control: max-age=$seconds_to_cache"); header('Content-type: application/json'); echo get_data($_GET['url']); ?>
然后在twitter.js中,您只需要将getJSON url替换为指向本地服务器,如下所示(在jquery.tweet.js底部的某处,您将找到此行)
查找: $.getJSON(build_api_url()).success(function(data){
更换:
// For debug purposes // console.log("/scripts/twitter/tweet/curlthispage.php?url="+encodeURIComponent(build_api_url())); $.getJSON("/scripts/twitter/tweet/curlthispage.php?url="+encodeURIComponent(build_api_url())).success(function(data){