信息来源:SuperHei
[code]#!/usr/bin/perl
#perlchina.org
#cnhackTNT[at]4red.org
use strict;
use Net::IRC; #加载Net::IRC模块
use XML::RSS; #加载XML::RSS模块
use LWP::Simple; #加载LWP::Simple,我们将通过它来获取网络站点的rss文档
use Encode; #加载Encode模块,由它提供对中文编码的转换
$SIG = \&quit; #当收到中断信号(比如当你按下Ctrl+C时)的时候执行子程序&quit
#=====================================================================
# 用一个哈希表%rss保存几个网站的rss文档的url
#=====================================================================
my %rss = (
slashdot => '
http://slashdot.org/index.rss',
googleblog => '
http://google.blogspace.com/index.xml',
freshmeat => '
http://freshmeat.net/backend/fm.rdf',
blogcn => '
http://www.blogcn.com/user_rss.asp',
cnblog => '
http://www.cnblog.org/blog/cache/cnblog.xml',
AmericanInChina => '
http://www.blogcn.com/rss.asp?uid=aradosh',
AnorwegiansLife => '
http://www.blogcn.com/rss.asp?uid=houshuang'
);
#=====================================================================
# 定义一个哈希表%init来保存将要登陆的IRC的服务器,频道,端口,昵称,
# IRC名称等信息。
# 在运行程序的时候你可以传递两个参数给程序,这两个参数分别是Server和
# Channel。
# 假设这个程序的名字是ircbot.pl,那么你可以这样运行:
# perl ircbot.pl irc.perlchina.org #perlchina
# 这样便可以登陆irc.perlchina.org并加入#perlchina频道,如果你直接运行:
# perl ircbot.pl
# 那么它回按照%init中定义的默认值连接到css.sunnet.org并加入#rssGrabber.pm
# 频道。
#=====================================================================
my %init = (
Nick => 'Grabber',
Server => shift || 'css.sunnet.org',
Port => 6667,
Ircname => 'I am a rss grabber .~',
Channel => shift || '#rssGrabber.pm'
);
my $irc = new Net::IRC; #创建Net::IRC对象
#=====================================================================
# 以下通过调用newconn方法,根据初始哈希表%init来创建一个新的irc连接,并将返
# 回的对象给$conn,注意:可以创建多个irc连接,连接创建好后调用start方法来
# 执行这个连接。
# 然后分别调用add_global_handler和add_handler来设定触发事件
# add_global_handler和add_handler的区别在于,前者影响所有的连接(如果你有创建多
# 个连接的话,后者只影响由newconn方法创建的并由初始哈希表%init定义的单个连接。
# ‘376’,’disconnect’,’public’,’msg’等都是触发信号的数字代码或者名字,你可以从
# Net::IRC::Event模块的源代码中读到那些数字代码所代表的意思,也可以
# perldoc Net::IRC::Event来查看’disconnect’,’public’,’msg’分别代表什么
# 这里
# ’376’代表连接上irc服务器并执行完MOTD命令,然后触发&on_conn事件
# ‘disconnect’代表断开irc连接,然后触发&on_disconnect事件
# ‘public’代表当有人在公共聊天窗口发送消息,然后触发&on_line事件
# ‘msg’代表当友人在私聊窗口给你消息,然后触发&on_line事件
#=====================================================================
my $conn = $irc->newconn(%init);
$conn->add_global_handler( '376', \&on_conn );
$conn->add_global_handler( 'disconnect', \&on_disconnect );
$conn->add_handler( 'public', \&on_line );
$conn->add_handler( 'msg', \&on_line );
$irc->start;
#=====================================================================
# 当连接上的时候,显示”Joining 频道”
# 然后在公共聊天窗口发送消息"Hi!I am the rss grabber.~"
#=====================================================================
sub on_conn {
print "Joining $init...\n";
my $self = shift;
$self->join("$init");
$self->privmsg( "$init",
"Hi!I am the rss grabber.~" );
}
#=====================================================================
# 当进入频道后就触发了on_line事件
# 默认数组@_保存了两个元素:一个是先前调用newconn方法返回的连接对象
# 一个是模块内部传过来的event对象,在这里event对象比较有用
# 通过$event->nick取得说话人的昵称,$self->nick则是你自己的昵称
# $event->args则返回了说话的内容等元素。
#=====================================================================
sub on_line {
my ( $self, $event ) = @_;
my ( $nick, $mynick ) = ( $event->nick, $self->nick );
my ($arg) = ( $event->args );
print "<$nick> $arg\n"; #打印某某说了什么
if ( $arg =~ /grab\s+(\w+)/i ) { #假如某人说“grab xxx”那么通过正则表达式取得
my $key = ; #字符串xxx,这个就是rss文档名
my $topic;
if ( exists $rss ) { #假如事先有定义这个rss文档,就告诉我它正在
$self->privmsg( $nick, #抓取新闻,并输出抓到的新闻标题,否则报错
" 4 Plz wait for awhile,I am grabbing news from 12