get_mynews.pl

__END__以下に記述されたタブ区切りのサイト名とURLから各サイトを訪れ、htmlファイルを取得する。そのページに含まれる最新ニュースのタイトル、リンク、サマリーを取り出してリストアップする。その際にリンクに省略されているURLの最初の部分を補完する。各サイト毎に一覧にまとめてHTMLファイルを作成し、FTPでWebサイトにアップロードする。JISで書かれているページはjcode.plを使用してsjisに変換してからパターンマッチにより加工している。Perlは5.6.0、jcode.plは2.13を使用した。[5/13/2001]


use LWP::Simple;
use Net::FTP;
require 'jcode.pl';

# Setup your configuration.
$ftpsite = '';
$ftpaccount = '';
$ftppassword = '';
$yourdir = '';
$newsfile = 'mynews.html';

($scriptfilename = $0) =~ s/^([^.]+)\.pl$/$1/i;
$| = 1;
while(<DATA>){
    ($site,$target)=split(/\t+/,$_);
    print "Accessing to $target.....\n";
    if($site =~ /Linux Report/){
        @lines = split(/\n/, (get $target));
        foreach $line (@lines){
            if($line =~ s|^<!-- ep-LIN-LINK\d+ -->(<A HREF=")\.\.(.+)$|<BR><FONT COLOR="#EBAB02">■$1http://www.idg.co.jp/report/linux$2|){
                $link = $line;
            }elsif($line =~ s|^<!-- ep-LIN-TITLE\d+ -->(.+)$|</FONT><FONT COLOR="#1D20AF">$1</FONT></A> |){
                $title = $line;
            }elsif($line =~ s/^<!-- ep-LIN-DATE\d+ -->(.+)$/$1<BR>/){
                $date = $line;
            }elsif($line =~ s/^<!-- ep-LIN-GAIYOU\d+ -->(.+)$/$1<BR><BR>/){
                $sitedata{"$site\t$target"} .= join("\n", $link, $title, $date, $line);
            }
        }
    }elsif($site =~ /ZDNN:AnchorDesk/){
        $body = (get $target);
        if($body =~ m|(\d{2})(\d{2})年(\d{1,2})月(\d{1,2})日(.+)更新|s){
            $newspattern = "/news/$2";
            $month = (length($3) == 2) ? "$3/" : "0$3/";
            $day = (length($4) == 2) ? "$4/\\w+\.html" : "0$4/\\w+\.html";
            $newspattern .= $month . $day;
            print $newspattern,"\n";
            $sitedata{"$site\t$target"} = "<P>更新時刻: $1$2/$3/$4 $5</P>\n";
        }
        if(@newslist = ($body =~ m|<p>\s*.?\s*<a href="$newspattern">[^\n]+.?[^\n]+<br clear="left"></p>|gis)){
            print scalar(@newslist),"\n";
            foreach $news (@newslist){
                $news =~ s|($newspattern)|http://www.zdnet.co.jp$1|gis;
                $sitedata{"$site\t$target"} .= $news . "\n";
            }
        }
    }elsif($site =~ /CNET/){
        @lines = split(/\n/, (get $target));
        $sitedata{"$site\t$target"} = "<ul>\n";
        foreach $line (@lines){
            if($line =~ /\d{4}年\s+\d{1,2}月\s+\d{1,2}日\s+.+曜日/){
                $count++;
                if($count == 2){
                    $sitedata{"$site\t$target"} .= "</ul>\n";
                    last;
                }
            }
            if($count == 1){
                $line =~ s|(<a href=")(/[^>]+>)|$1http://japan.cnet.com$2|i;
                $sitedata{"$site\t$target"} .= "$line\n";
            }
        }
    }elsif($site =~ /BizTech/){
        $sitedata{"$site\t$target"} = "<BR>\n";
        @lines = split(/\n/, (get $target));
        foreach $line (@lines){
            jcode::convert(\$line, 'sjis');
            if($line =~ m|<!-- ▼▼▼▼▼NEWS\(\w+\)挿入▼▼▼▼▼ -->|){
                $line =~ s|(<a href=")(/[^>]+>)|$1http://biztech.nikkeibp.co.jp$2|i;
                $sitedata{"$site\t$target"} .= "$line\n";
            }
        }
    }
    undef @lines;
}
open(OUT,"> $newsfile");
print OUT <<EOB;
<HTML>
<HEAD>
<TITLE>My News</TITLE>
<META HTTP-EQUIV="Content-Type" content="text/html; charset="Shift_JIS">
<style type="text/css">
<!--
BODY{background:#FFFFF0}
.title{font-size:16pt;color:#336666;font-weight:bold}
.item{font-size:14pt;color:#FFFFFF;font-weight:bold;background:#FF9900;text-indent:15px}
.content{font-size:12pt;color:#336666;font-weight:bold}
.header{font-size:12pt;color:#CC0000;font-weight:bold;text-indent:5px}
.footer{font-size:10pt;color:#336666;font-weight:bold}
//-->
</style>
</HEAD>
<BODY>
<div class="title">My News</div>
EOB

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$thisday = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday];
$thismonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon];
print OUT "<div class=\"header\">Last updated : $hour:$min:$sec $thismonth $mday ($thisday) ", $year+1900,"\n</div>\n";

foreach $key (keys %sitedata){
    ($site, $target) = split('\t', $key);
    print OUT "<P><div class=\"item\">Source:$site <A HREF=\"$target\">$target</A></div>\n$sitedata{$key}\n";
}
print OUT <<"EOE";
<HR>
<div class=\"footer\">
This table is generated by <A HREF=\"${scriptfilename}.html\">$0</A><BR>
This HTML is transported by Net::FTP module.<BR>
<I><A HREF=\"index.html\">TS Network</A></I>
\ <FONT COLOR=\"ORANGERED\">\>\></FONT>
</div>
</BODY>
</HTML>
EOE
close(OUT);

print "Connecting to $ftpsite ...\n";
$ftp = Net::FTP->new($ftpsite);
print "Just login ...\n";
$ftp->login($ftpaccount, $ftppassword);
print "Moving to $yourdir ...\n";
$ftp->cwd($yourdir);
print "Changing to ascii mode ...\n";
$ftp->ascii();
print "Transporting $newsfile ...\n";
$ftp->put($newsfile, $newsfile);
$ftp->quit();
print "FTP finished.\n";

__END__
Linux Report    http://www.idg.co.jp/report/linux/top/index.html?navi
ZDNN:AnchorDesk    http://www.zdnet.co.jp/news/anchordesk/index.html
CNET Japan Tech News: US CNET発    http://japan.cnet.com/News/us.html
BizTech ニュース Top News    http://biztech.nikkeibp.co.jp/biztech/topics.shtml