2007年10月22日星期一

通过代理更新Gregarius

Gregarius是我现在使用的rss阅读器,其它在线的比如google reader、zhuaxia我网速太慢,使用不顺畅,纯离线方式的吧,比如liferea,在浏览的时候依然要解析html和联网(feed内容中有图像),还是在本机架一个Gregarius,cron定时更新,然后用firefox看方便,保存有价值的文章也更方便。

原先更新都是用wget:

wget --no-check-certificate -O /tmp/gregarius.update https://my_local_machine_name/gregarius/update.php  

wget的输出会已本地用户邮件形式被mutt收下来,设定好之后,有一段没时间看rss也没在意,这天忽然发现原来wget只要retry 3、4次就能更新完全部feed,现在需要十几次,而我的feed增长显然没达到这种程度;并且有些网站在Gregarius中看到已经很久没有更新了(-t 1可以指定只retry一次,默认是20次,-t 0为无限制retry下去)。同时在feed管理中看到,很多网站的名字都加上了删除线,比如" 月光博客",最后终于发现,这些名字打上了删除线的blog的feed全部托管在feedburner,并且内容全部没有更新,原因,自然是开始于前段时间的feedburner无法访问。

feedburner无法访问我倒不怕,我一直都在本机用squid、privoxy、tor智能中转web访问请求,现在只要让gregarius更新feed时用上我这个本地的代理服务器squid就可以了,看了一下gregarius的代码,远程读取rss使用的是 Snoopy类,本地文件为extlib/Snoopy.class.inc,调用是在extlib/rss_fetch.inc文件中,大概第317行,function _fetch_remote_file 部分,在这里添加如下内容即可:

$client->read_timeout = MAGPIE_FETCH_TIME_OUT;
$client->use_gzip = MAGPIE_USE_GZIP;

// 这几行是添加的内容,其它是原文件中的 Modify by Fwolf @ 2007-10-14
// Use proxy localhost:3128 when fetch feed
$client->proxy_host = "localhost";
$client->proxy_port = "3128";
$client->_isproxy = true;
$client->read_timeout = 0; // tor via squid is slow
//

if (is_array($headers) ) {
$client->rawheaders = $headers;
}

就这么简单,$client的设置参照Snoopy类的定义即可,然后调用不再使用wget,而是直接运行update.php:

cd /local/path/to/gregarius; php -f update.php

这样更新的结果会清晰的输出:

Engadget Simplified Chinese ...
OK (HTTP 200), 3 New Items

玩意儿 ...
OK (304 Not modified), 0 New Items

津津乐道 ...
HTTP Timeout (Local cache), 0 New Items

小众软件 ...
OK (HTTP 200), 0 New Items

如果加上-- --silent就没有输出了,第一个--是给截止php接收参数的参数,--silent才是给update.php用的。

本文针对Gregarius 0.5.5 revision1761。

Source: http://www.fwolf.com/blog/post/360