Chinaunix首页 | 论坛 | 博客
  • 博客访问: 596917
  • 博文数量: 40
  • 博客积分: 7274
  • 博客等级: 少将
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 15:00
个人简介

Expired

文章分类
文章存档

2011年(1)

2008年(3)

2007年(17)

2006年(10)

2005年(9)

分类: LINUX

2007-04-14 15:58:41

公司有个论坛,需要经常关注下,顺便回复下帖子,不定期去论坛查看,感觉太麻烦了,于是想何不写个程序,自动来分析,如果有新的回复,便报警提示,这样效率高多了。

以前用 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) |
给主人留下些什么吧!~~