很多人以前都用过 Feedburner 烧制自己的 rss feed,但是由于众所周知的原因,Feedburner 的 rss 输出在中国网,封天下无法访问了(不信您可以点击一下我博客右侧的 Feedburner 图标)。虽然用 Google Reader 订阅 Feedburner 的 feed 仍然不受影响,但是博客订阅数图标无法正常显示,所以很多人好奇我是如何让 Feedburner 订阅数图标仍然显示在博客侧栏的。
更新:刚才写完,我想看看 feed 有没有更新,忽然发现 Feedburner 的 rss 可以访问了,试了试订阅数图标,也能正常显示了。GFW 打盹了?我说这几天 Feedburner 订阅数增加那么快呢。总之我这篇文章算是白写了......呜呜呜呜,没有提前重现问题的后果。
又更新:12 月 23 日,我又无法访问 feedburner 的 RSS 了,才一天那!看来我这篇文章还算没有完全白写,不能幻想 GFW 的仁慈。
其实我以前是用的这篇博客里的方法。这个方法要求你有个国外主机空间,碰巧我能使用师兄的空间,把那篇文章中的 feedburner.php 上传到空间里就可以使用了。
但是使用过程中我发现这个方法有个很严重的问题:不支持并发访问。这是由于它的方法太生硬,先读取自己文件的内容,如果文件中写的时间比当前时间早 4 个小时,就下载新的订阅数图标,重写自身文件(修改更新时间那一行),并将订阅数图标附在文件最后。注意到这里,它会重写自身文件,一个 php 文件读取自己,改一行再重新写入自己,那么如果多个用户同时访问该文件,那不就乱套了?
所以我对它进行了修改,改为一个相对干净的方法:抓取订阅数统计图标保存为一个 gif 文件,每次访问 php 文件时,php 去判断当前时间与该 gif 文件最后修改时间的差,如果大于过期时间,就重新抓取订阅数统计图标更新 gif 文件,最后将访问重定向到 gif 文件。点击这里 http://solrex.org/feedburner.php 查看效果。
具体 php 代码如下(其实我本想用 file_get_contents 函数的,但发现不好用,只好还用这个原来的 httpSocketConnection 函数了,显得冗长了些):
<?php
$username = "username"; // Feedburner account name.
$expire_time = 3600; // Expire time(in second, 3600s = 1 hour).
$fb_url = "feeds.feedburner.com";
$gif_path = "/~fc/".$username."?bg=99CCFF&fg=444444&anim=0";
$localfile = "fb_".$username.".gif";
if(!function_exists('httpSocketConnection')){
function httpSocketConnection($host, $method, $path, $data)
{
$method = strtoupper($method);
if ($method == "GET") {
$path.= '?'.$data;
}
$filePointer = fsockopen($host, 80, $errorNumber, $errorString);
if (!$filePointer) {
return false;
}
$requestHeader = $method." ".$path." HTTP/1.1\r\n";
$requestHeader.= "Host: ".$host."\r\n";
$requestHeader.= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
$requestHeader.= "Content-Type: application/x-www-form-urlencoded\r\n";
if ($method == "POST") {
$requestHeader.= "Content-Length: ".strlen($data)."\r\n";
}
$requestHeader.= "Connection: close\r\n\r\n";
if ($method == "POST") {
$requestHeader.= $data;
}
fwrite($filePointer, $requestHeader);
$responseHeader = '';
$responseContent = '';
do {
$responseHeader.= fread($filePointer, 1);
}
while (!preg_match('/\\r\\n\\r\\n$/', $responseHeader));
if (!strstr($responseHeader, "Transfer-Encoding: chunked")) {
while (!feof($filePointer)) {
$responseContent.= fgets($filePointer, 128);
}
} else {
while ($chunk_length = hexdec(fgets($filePointer))) {
$responseContentChunk = '';
$read_length = 0;
while ($read_length < $chunk_length) {
$responseContentChunk .= fread($filePointer, $chunk_length - $read_length);
$read_length = strlen($responseContentChunk);
}
$responseContent.= $responseContentChunk;
&nb
sp; fgets($filePointer);
}
}
return chop($responseContent);
}
}
function get_fbcount($host, $path, $file)
{
$content = httpSocketConnection($host, 'GET', $path, NULL);
$fp = fopen( $file,"w" );
fwrite($fp, $content);
fclose($fp);
}
if (file_exists($localfile)) {
$last_modified = filemtime($localfile);
if ( date('U') - $last_modified > $expire_time) {
get_fbcount($fb_url, $gif_path, $localfile);
}
} else {
get_fbcount($fb_url, $gif_path, $localfile);
}
Header("Location: $localfile");
?>
将上述代码保存为一个 php 文件,比如 fb_username.php,修改用户名和过期时间,上载到国外或者港台能正常访问 Feedburner 的主机空间中,您就可以在网页中用:
<img src="http://your.host.domain/fb_username.php" style="border: 0pt none ;" alt="Feedburner">
来引用 Feedburner 订阅计数图标了。由于这个 php 脚本按照用户名保存 gif 图标,您可以在一个服务器上为多人提供引用,只需修改 php 文件的 usrname 一项,并上传为另一个 php 文件,您也可以将这两个变量改为 php 文件的参数(不建议这样做,因为会被别人利用)。
您也可以在这里下载到 feedburner.txt,要记得将其后缀改为 php 哦。
原来你师兄叫xuyou
那是最早的一个程序,后来提供了转烧之后就没有管这个东西了
这个改进很好啊,我就在用文章中提到的那个原来的程序~
ms是因为Feedburner换IP了的缘故…
没注意你在红字后面的又更新……
P.S. 我这里还是可以访问feedburner
P.S. ms今天是13号……
我的页面上是把我的日志订阅量和评论订阅量都显示的。
照你的做了的小修改。
diff fb.php fb_solrex.php
2,3c2,3
< $username = $_GET['username'];
$username = "username"; // Feedburner account name.
> $expire_time = 3600; // Expire time(in second, 3600s = 1 hour).
8d7
< $localfile = str_replace('/','',$localfile);
我的日志是ironfeet,调用地址是
fb.php?username=ironfeet&expiretime=3600
我的评论是ironfeet/comments,调用地址是
fb.php?username=ironfeet%2Fcomments&expiretime=3600
靠,贴上去的东东走形了。改一下再发一次
我的页面上是把我的日志订阅量和评论订阅量都显示的。
照你的做了的小修改。
diff fb.php fb_solrex.php
2,3c2,3
< $username = $_GET['username'];
< $expire_time = $_GET['expiretime'];
---
> $username = "username"; // Feedburner account name.
> $expire_time = 3600; // Expire time(in second, 3600s = 1 hour).
8d7
< $localfile = str_replace('/','',$localfile);
我的日志是ironfeet,调用地址是
fb.php?username=ironfeet&expiretime=3600
我的评论是ironfeet/comments,调用地址是
fb.php?username=ironfeet%2Fcomments&expiretime=3600