公司有个论坛,需要经常关注下,顺便回复下帖子,不定期去论坛查看,感觉太麻烦了,于是想何不写个程序,自动来分析,如果有新的回复,便报警提示,这样效率高多了。
以前用 Shell 写了个,比较麻烦,现在干脆用 Perl 写算了,简单而又清晰. 当然这个脚本不是通用的,因为不是每个论坛的格式都一样。
大致思路:
1. 获取论坛版面信息,转换成文本格式
2. 分析文本内容,找出每个帖子格式的规律(比如什么开头,有什么关键字之类的)
3. 根据正则表达式进行匹配,将分析结果写入文件1
4. 程序睡眠一段时间,比如1分钟
5. 重复 1-3 的步骤,但是分析结果写入另外一个文件,如文件2
6. 可以加入一个计数器,决定写入哪个文件,这样保证这一次写入的文件和上一次不同
7. 比较文件1和文件2,如果内容不一样,则表示可能有新帖或回复之类的,此时触发报警
脚本样例:
#!/usr/bin/perl -w
use strict;
my $bbs_addr = "";
my $timer = 0;
while (1) {
my $ok;
my $item;
my $count;
foreach (qx|lynx -dump $bbs_addr\|iconv -f gbk -t utf-8 -c -s|) {
### 从这里开始分析
$ok = 1 if (/^\s+本版置顶/);
### 知道遇到此关键字,结束匹配
$ok = 0 if (/^\s+正在浏览此论坛的会员/);
if ($ok) { ### 下面是每个帖子的详细信息,具体根据论坛不同
if (/^\s*$/) { ### 空行表示一个帖子开始
++ $count;
$item->{ $count } = { };
next;
}
if (/^\s+\[.* \[\d+\](.*)\s\[\d+\](.*)$/) {
$item->{ $count }->{"subject"} = $1;
$item->{ $count }->{"author"} = $2;
}
elsif (/^\s+([\d\-]+) (\d+) \/ (\d+) \[\d+\](.*)$/) {
$item->{ $count }->{"put_time"} = $1;
$item->{ $count }->{"reply_count"} = $2;
$item->{ $count }->{"read_count"} = $3;
$item->{ $count }->{"last_reptime"} = $4;
}
elsif (/^\s+by \[\d+\](.*)$/) {
$item->{ $count }->{"last_replyer"} = $1;
}
}
}
my ($subject,$author,$reply_count,$read_count,
$put_time,$last_reptime,$last_replyer);
### 确定写入文件和上一次写入的文件
my $write_file = ($timer % 2 == 0) ? "bbs.txt.1" : "bbs.txt.2";
my $previous_file = ($timer % 2 == 0) ? "bbs.txt.2" : "bbs.txt.1";
open (WRITE,">$write_file") || die "ERR: Cannot write target file.\n\n";
foreach my $index (sort (keys %$item)) {
$subject = $item->{ $index }->{'subject'};
$author = $item->{ $index }->{'author'};
$put_time = $item->{ $index }->{'put_time'};
$reply_count = $item->{ $index }->{'reply_count'};
$read_count = $item->{ $index }->{'read_count'};
$last_reptime = $item->{ $index }->{'last_reptime'};
$last_replyer = $item->{ $index }->{'last_replyer'};
next if (! $subject);
print WRITE "主题/发帖人/时间: $subject ($author $put_time)\n";
print WRITE "回复/最后时间/人: $reply_count/$last_reptime/$last_replyer\n";
}
print WRITE "\n";
close (WRITE);
### 比较文件的不同
my $diff = system ("diff $write_file $previous_file 2>/dev/null");
### 如果发现不同,报警
if ($diff != 0) {
print "Wo~~, Here you get a new message ! \n";
system ("beep");
}
else {
print "Oh, no new message yet, let's keep sleep ~~~ \n";
}
### 1分钟后继续开始检测
sleep 60;
++ $timer;
}
阅读(2015) | 评论(0) | 转发(0) |