<img src=http://www.blogbus.com/blogbus/blog/userf
<font size=4 color=#ffffff>Just my feelings && some Perl stuffs ^-^</font><br> <font color=#ffffff> 这个blog记录我的一些生活琐事,关于Perl的以及其他在学习计算机,网络技术时所得的经验和有趣的东西</font>


Use HTTP::Daemon & XML::RSS
时间: 2004-01-31

    写了一段加载HTTP::Daemon,XML::RSS模块的小程序,运行他会得到一个开放80端口的小web server,不过这个web server的作用就是当你访问他的时候,他会判断当前目录下有没有slashdot.html这个文件,如果没有或者该文件已经一个小时没更新了,就抓取http://slashdot.org/index.rss,并通过XML::RSS分析,获取其中slashdot最新的主题,否则直接传回当前目录下的slashdot.html.代码如下

#!/usr/bin/perl
#bytewolf[at]tom.com
#perlchina.org
use strict;
use XML::RSS;
use LWP::Simple;
use HTTP::Daemon;
use HTTP::Status;
use Fcntl qw(:flock);

my $c;
my $rss='http://slashdot.org/index.rss';
my $html='slashdot.html';
my $d = new HTTP::Daemon LocalPort=>80;
print "Please visit me at: <URL:", $d->url, ">\n";

while ($c = $d->accept) {
    my $r = $c->get_request;
    if ($r) {
        if ($r->method eq 'GET') {
     &slashdot();
     } else {
            $c->send_error(RC_FORBIDDEN)
        }
    }
    $c = undef;
}


sub slashdot{
 if (-s $html){
  if ((-M $html)>0.04) {
   &rss2html($c);
  }else{
   $c->send_file_response($html);
  }
 }else{
  &rss2html();
 }
}

sub rss2html{
 
 my $lock='lock.tmp';
 open(LOCK,">$lock") or &sendmsg("Can\'t create lock file $lock",0);
 flock(LOCK,LOCK_EX);
 open(F,">$html") or &sendmsg("Can\'t open $html",0);
 my $o = new XML::RSS;
 my $content = get($rss) or &sendmsg("Could not retrieve $rss",0);
 &sendmsg("
   <html>
   <meta http-equiv=\"Refresh\" content=\"4;\">
   <center>
   Please wait while me update from slashdot.org......
   </center>
   </html>
   ",1);
 $o->parse($content);
 my $select=select F;
#----------------------------HTML-----------------------------
 print<<HTML;
<HTML>
<BODY>
<table bgcolor="#FFFFFF" border="0" align="center"><tr><td>
  <tr>
  <td valign="middle" align="center" bgcolor="#EEEEEE">
<font color="#000000" face="Arial,Helvetica"><B>
<a href="$o->{'channel'}->{'link'}">$o->{'channel'}->{'title'}</a>
</B></font></td></tr>
<tr><td>
HTML
#----------------------------END--------------------------------
 foreach my $item (@{$o->{'items'}}) {
  next unless defined($item->{'title'}) && defined($item->{'link'});
  print "<li><a href=\"$item->{'link'}\" target=\"_blank\">$item->{'title'}</a><BR>\n";
     }

     if ($o->{'textinput'}->{'title'}) {

#----------------------------HTML-------------------------------
  print <<HTML;
<form method="get" action="$o->{'textinput'}->{'link'}">
 $o->{'textinput'}->{'description'}<BR>
<input type="text" name="$o->{'textinput'}->{'name'}"><BR>
<input type="submit" value="$o->{'textinput'}->{'title'}" target="_blank">
</form>
</td>
</TR>
</td></tr></table>
</BODY>
</HTML>
HTML
  }

#----------------------------END--------------------------------
 select $select;
 close F;
 flock(LOCK,LOCK_UN);
 close LOCK;
 $c->send_file_response($html);
}
  
sub sendmsg{
 my ($msg,$flag) = @_;
 my $o = new HTTP::Response(RC_OK);
 $o->content($msg);
 $c->send_response($o);
 next unless $flag;
}





atzone   发表于   2004-01-31 23:37    引用(Trackback0)

评论
发表评论

用户名:

Email:

主页:
http://

   
最后更新


Skyshui
Eliiott
Fatb@zzu
Blogbus银河影院
Plod
广告狂热者
TAOWEN的个人主页
Google