发新话题
打印

[转载]用Perl写你自己的IRC Robot

[转载]用Perl写你自己的IRC Robot

信息来源: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
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题