跳至主要内容

Lilina:RSS聚合器构建个人门户(Write once, publish anywhere)

最近搜集RSS解析工具中找到了MagPieRSS 和基于其设计的Lilina;Lilina的主要功能:

1 基于WEB界面的RSS管理:添加,删除,OPML导出,RSS后台缓存机制(避免对数据源服务器产生过大压力),ScriptLet: 类似于Del.icio.us it的收藏夹即时订阅JS脚本;

2 前台发布:将自己的首页改成了用Lilina发布我常看的几个朋友的网志,也省去了很多更新自己网页的工作,需要php 4.3 + mbstring iconv
lilina.png
开源软件对i18n的支持越来越好了,php 4.3.x,'--enable-mbstring' '--with-iconv'后比较好的同时处理了UTF-8和其他中文字符集发布的RSS。
需要感谢Steve在PHP进行转码方面MagPieRSS进行和XML Hacking工作。至少目前为止:Add to my yahoo还不能很好的处理utf-8字符集的RSS收藏

记得年初Wen Xin在CNBlog的研讨会上介绍了个人门户的概念,随着RSS在CMS技术中的成熟,越来越多的服务可以让个人用户根据自己需求构建门户,也算是符合了互联网的 非中心化趋势吧,比如利用Add to My Yahoo!功能,用户可以轻松的实现自己从更多数据源进行新闻订阅。想象一下把你自己的del.icio.us书签收藏 / flickr图片收藏 / Yahoo!新闻都通过这样一个RSS聚合器聚合/发布起来。其传播效率将有多快。

好比软件开发通过中间平台/虚拟机实现:一次写成,随处运行(Write once, run anywhere),通过RSS/XML这个中间层,信息发布也实现了:一次写成,随处发布(Write once, publish anywhere...)

安装Lilina需要PHP 4.3 以上,并带有iconv mbstring等函数的支持,请确认一下PHP模块的支持:'--enable-mbstring' '--with-iconv'

另外就是一个需要能通过服务器端向外部服务器发送RPC请求,这点51.NET不支持。感觉PowWeb的服务很不错,很多缺省的包都安装好了:

iconv
iconv support enabled
iconv implementation unknown
iconv library version unknown

Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1

mbstring
Multibyte Support enabled
Japanese support enabled
Simplified chinese support enabled
Traditional chinese support enabled
Korean support enabled
Russian support enabled
Multibyte (japanese) regex support enabled

将安装包解包(下载文件扩展名是.gz 其实是.tgz,需要重命名一下):上传到服务器相应目录下,注意:相应cache目录和当前目录的可写入属性设置,然后配置一下conf.php中的参数即可开始使用。

何东给我的建议:
1)右边的一栏,第一项的sources最好跟hobby、友情链接一样,加个图片。
2)一堆检索框在那儿,有些乱,建议只有一个,其它的放到一个二级页面上。
3)把联系方式及cc,分别做成一条或一个图片,放在右边一栏中,具体的内容可以放到二级页面上,因为我觉得好象没有多少人会细读这些文字。
4)如果可能,把lilina的头部链接汉化一下吧?

一些改进计划:
1 删除过长的摘要,可以通过寻找第2个"

" 实现;
2 分组功能:将RSS进行组输出;

修改默认显示实现:Lilina缺省显示最近1天发表的文章,如果需要改成其他时间周期可以找到:
$TIMERANGE = ( $_REQUEST['hours'] ? $_REQUEST['hours']*3600 : 3600*24 ) ;

进行改动。

RSS是一个能将自己的所有资源:WIKI / BLOG / 邮件聚合起来的轻量级协议,以后无论你在何处书写,只要有RSS接口就都可以通过一定方式进行再次的汇聚和发布起来,从而大大提高了个人知识管理和发布/传播效率。

以前对RSS理解非常浅:不就是一个DTD嘛,真了解起解析器来,才知道namespace的重要性,一个好的协议也应该是这样的:并非没有什么可加的,但肯定是没有什么可"减"的了,而真的要做到这个其实很难很难……。

我会再尝试一下JAVA的相关解析器,将其扩展到WebLucene项目中,更多Java相关Open Source RSS解析器资源

另外找到的2个使用Perl进行RSS解析的包:
使用XML::RSS::Parser::LiteXML::RSS::Parser 解析RSS

XML::RSS::Parser::Lite的代码样例如下:

#!/usr/bin/perl -w
# $Id$
# XML::RSS::Parser::Lite sample

use strict;
use XML::RSS::Parser::Lite;
use LWP::Simple;


my $xml = get("http://www.klogs.org/index.xml");
my $rp = new XML::RSS::Parser::Lite;
$rp->parse($xml);

# print blog header
print "<a href=\"".$rp->get('url')."\">" . $rp->get('title') . " - " . $rp->get('description') . "</a>\n";

# convert item to <li>
print "<ul>";
for (my $i = 0; $i < $rp->count(); $i++) {
my $it = $rp->get($i);
print "<li><a href=\"" . $it->get('url') . "\">" . $it->get('title') . "</a></li>\n";
}
print "</ul>";

安装:
需要SOAP-Lite

优点:
方法简单,支持远程抓取;

缺点:
只支持title, url, description这3个字段,不支持时间字段,

计划用于简单的抓取RSS同步服务设计:每个人都可以出版自己订阅的RSS。


XML::RSS::Parser代码样例如下:
#!/usr/bin/perl -w
# $Id$
# XML::RSS::Parser sample with Iconv charset convert

use strict;
use XML::RSS::Parser;
use Text::Iconv;
my $converter = Text::Iconv->new("utf-8", "gbk");


my $p = new XML::RSS::Parser;
my $feed = $p->parsefile('index.xml');

# output some values
my $title = XML::RSS::Parser->ns_qualify('title',$feed->rss_namespace_uri);
# may cause error this line: print $feed->channel->children($title)->value."\n";
print "item count: ".$feed->item_count()."\n\n";
foreach my $i ( $feed->items ) {
map { print $_->name.": ".$converter->convert($_->value)."\n" } $i->children;
print "\n";
}

优点:
能够直接将数据按字段输出,提供更底层的界面;

缺点:
不能直接解析远程RSS,需要下载后再解析;

2004-12-14:
从cnblog的Trackback中了解到了Planet RSS聚合器

Planet的安装:解包后,直接在目录下运行:python planet.py examples/config.ini 就可以在output目录中看到缺省样例FEED中的输出了index.html,另外还有opml.xml和rss.xml等输出(这点比较好)

我用几个RSS试了一下,UTF-8的没有问题,但是GBK的全部都乱码了,planetlib.py中和XML字符集处理的只有以下代码:看来所有的非UTF-8都被当作iso8859_1处理了:
try:
data = unicode(data, "utf8").encode("utf8")
logging.debug("Encoding: UTF-8")
except UnicodeError:
try:
data = unicode(data, "iso8859_1").encode("utf8")
logging.debug("Encoding: ISO-8859-1")
except UnicodeError:
data = unicode(data, "ascii", "replace").encode("utf8")
logging.warn("Feed wasn't in UTF-8 or ISO-8859-1, replaced " +
"all non-ASCII characters.")

近期学习一下Python的unicode处理,感觉是一个很简洁的语言,有比较好的try ... catch 机制和logging

关于MagPieRSS性能问题的疑虑:
对于Planet和MagPieRSS性能的主要差异在是缓存机制上,关于使用缓存机制加速WEB服务可以参考:可缓存的cms设计

可以看到:Lilina的缓存机制是每次请求的时候遍历缓存目录下的RSS文件,如果缓存文件过期,还要动态向RSS数据源进行请求。因此不能支持后台太多的RSS订阅和前端大量的并发访问(会造成很多的I/O操作)。

Planet是一个后台脚本,通过脚本将订阅的RSS定期汇聚成一个文件输出成静态文件。

其实只要在MagPieRSS前端增加一个wget脚本定期将index.php的数据输出成index.html,然后要求每次访问先访问index.html缓存,这样不就和Planet的每小时生成index.html静态缓存一样了吗。

所以在不允许自己配置服务器脚本的虚拟主机来说Planet根本是无法运行的。

更多关于PHP中处理GBK的XML解析问题请参考:
MagPieRSS中UTF-8和GBK的RSS解析分析

2004-12-19
正如在SocialBrain 2005年的讨论会中,Isaac Mao所说:Blog is a 'Window', also could be a 'Bridge',Blog是个人/组织对外的"窗口",而RSS更方便你将这些窗口组合起来,成为其间的"桥梁",有了这样的中间发布层,Blog不仅从单点发布,更到P2P自助传播,越来越看到了RSS在网络传播上的重要性。

评论

此博客中的热门博文

How to Design a Store Front Sign

In this Article we will talk about designing a store front for a business. What color or size should your Letters & designs be? What to put on your sign and why?, then be ready to Get in touch with sign people and get your best deal. Large lettering with out a front sign could save you time and money Do your products have a special shape or color to emulate on your sign? Kodak is always in yellow and black, Coca-Cola white on red, Etc. Muffler places, have a sign in the shape of a muffler. your phone number on the store front some place, but not on the identification sign, (door, or window) Your Product & logos can be arranged on the front sign, or window. Not on the Pole sign, Store hours & phone number could fit in your design and by using the product color, it could add product recognition & enhance your design. Suppliers may provide plenty of advert...

music forum (zt)

24. moonlight - ≡ Sound Of Nature ≡ -     15. Tone Quebec Network 17.Ukoo http://www.hispeed.com.cn/Forum/LoadForum.asp?Foru m / a> http://bbs.dd81.com/index.php 30. Jazz pawnshop http://www.sogua.com/ 6. Lyrics 吾爱 http://www.inkui.com Reading of the singer in mind 2. Hyun tone http://d.sogou.com/ http://www.beihai365.com/bbs/forumdisplay.php?f/a> 20. Left Bank • Teana http://bbs.flamesky.com/ 8. Sogou sogou- 25.U Shadow 吾爱 sound waves 4. Need 14.HDCD http://www.commus.com/ 29, Buddhist music, do not know the name of the http://www.itpub.net/forum79.html http://bbs.kugoo.com/index.asp http://bbs.uying.com/176/Index.aspx http://board.verycd.com/ http://board.verycd.com/f8.html 13.MP3 barrage http://bbs.51lrc.com/index.asp?board/a> A pleasant song - "Dancing circulation" 19.Verycd of http://bbs.breezecn.com/ http://www.mp4cn.com/2008/index.html Sound of Music Forum, http://www.jazzsky.com/lb/cgi-bin/leobbs.cgi http://www.luopo.co...

找到一个可以替代ghs.google.com的地址

用Goole Blogger的自定义域名功能需要用到 ghs.google.com 做CNAME,或者用ping ghs.google.com 得出的IP做一个A记录.但是,伟大的GFW已经把 ghs.google.com 和部分IP屏蔽在大陆之外.这样的壮举使得我们的自定义域名不能正常访问,或者让你的网页背景.图片被滤掉,精心做成的模板变得惨白不堪. 那么,我们可不可以找一个替代 ghs.google.com 的地址呢?当然能.因为Google是强大的.它有许多有用的IP地址让你去探寻. 对 ghs.google.com 分析研究后发现, ghs.google.com 这台服务器并没有提供实质性的服务,而只是选择访问者访问最快的服务器(Google全球性公司,很多地区都有服务器).我们只要找到其他服务器的IP地址,并且这个IP地址没被屏蔽,那么就成了. 寻找这样的IP地址需要用到tracert命令.即在CMD模式下输入:tracert ghs.google.com ,在已经屏蔽的当下,最后自然得不出结果,这就需要我们使用代理了.使用不同地区的代理运行tracert ghs.google.com 命令. tracert ghs.google.com 的最后一跳会有类似这样的域名: eh-in-f121.google.com 如果在不用代理的情况下,你能ping通这个域名,那么恭喜你,你找到了!现在就可以用这个域名代替 ghs.google.com 设置你的CNAME了,ping出的IP地址可以做A记录,CNAME和A记录,只做其中之一就可以. hs-in-f121.google.com 64.233.179.121 eh-in-f121.google.com 72.14.207.121 bx-in-f121.google.com 66.249.81.121 ik-in-f121.google.com 66.249.91.121 这4个在我所在地区不能使用,而可以使用 tw-in-f121.google.com 72.14.235.121 或者209.85.171.121也可用 下面是一些不断更新的:74.125.43.121 除了使用代理来寻找,也可以通过一些网站提供的功能来寻找这个地址,很方便,就是使用网站提供的Traceroute.这些网站有: h...