Feedburner 订阅数图标显示解决办法

很多人以前都用过 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 哦。

Feedburner and Feedsky 的点击统计

我发现我真傻。

由于文章的原始链接被 Feedburner 修改,而 Feedburner 的子域名被封,以前一直无法从 Google Reader 里点击文章标题进入我的博客网站,我也一直以为这是件没办法的事情。今天无意中看别人的文章才发现,这是因为在 Feedburner 中启用了 Item link clicks 功能的缘故,我郁闷啊!

所以今天我把 Feedburner 和 FeedSky 的文章点击统计功能都关闭了,啊哈,链接干净了!现在总算可以直接点击订阅的文章标题进入我的博客文章页面了!

solrex.cn 的新子域名

由于对某些服务感到新鲜,所以为我的域名添加了几个子域名:

1. http://m.solrex.cnhttp://wap.solrex.cn

我的手机版博客,使用 WireNode 提供的服务,上面两个域名均重定向到 http://solrex.wirenode.mobi,我用自己的手机访问测试正常。

2. http://feed.solrex.cnhttp://feeds.solrex.cn/solrex

将博客 FeedSkyFeedBurner 烧录绑定到了自己的域名,不影响原有的 feed 地址。

其中 http://feed.solrex.cnFeedSky 提供的域名绑定服务,http://feeds.solrex.cn/solrexFeedBurner 提供的 MyBrand 服务,这两个域名均为直接 CNAME 绑定。所以,FeedBurner 那个在国内仍然无法正常访问,不过可以通过阅读器订阅。

开始使用 WordPress

先引用一段著名的对话:
A: 你有博客吗?
B: 有。
A: 你介意换一个 BSP(Blog Service Provider) 吗?
B: 介意。
A: 你介意多一个 BSP 吗?
B: ......

总之呢,就是想说,在和菜头的竭力推荐下,在 GFW 的竭力阻拦下,在 Live Space 的竭力变慢下,我又在 yo2.cn 申请了一个博客。至于 yo2.cn 有什么好,请访问 http://www.hecaitou.net ,翻翻以前的文章,你就可以大致了解了。

现在算是把域名 blog.solrex.cn 绑定到了 yo2.cn 的博客上了,不是原来的域名转向,是绑定,就是所有文章什么的都可以用这个域名访问。据说这项服务以后要收费,其实收费没什么,自己申请一个空间一年还得好几百呢,还得自己配置 WP(WordPress),我也是因为懒得配置才不愿意找这个麻烦。最关键的是服务,QoS,我可不再希望自己花费了很多心血在上面的博客说被封就被封了,而且还不是我的责任,是 BSP 没有做好公关。这两年 livespace 和 blogspot 经常性的出问题已经很讨厌了,希望 yo2.cn 这个国内的博客服务商在这方面能做好一些。稍微慢一点儿没关系,发文章麻烦一点儿没关系,但别不能访问。

WP 挺好的,用起来很舒服,而且可以有很多自由度。我还把以前所有的文章都迁移到了现在的站点上,加起来有两百七十多篇吧。哈哈,两年,看来写的不少。

如果 yo2.cn 能保持现在这种服务,年费我愿意交。本想等用一段稳定了再重烧 feedburner,但昨天还是忍不住重烧了一下,所以可能使用 feedburner 订阅我的博客的就看到了今天有很多旧的更新 :)。不过这下再从 feed 中点进去到网站就不是 live space 了,留言也不用登录了,可惜的是,feedburner 教育网还是无法访问。唉,为什么在中国上个网就那么难呢?

最后重申一下,欢迎访问新博客。Live Space 和 Blogspot 仍然保持同步更新,没办法啊,我对中国小网站的风险抵抗能力还是持怀疑态度的。如果 yo2.cn 能保持一年不频繁停机、不被封站、并保持服务质量,我就放弃那两个博客。