#!/usr/bin/perl
#===============================================================================
#  DESCRIPTION:  guns.ru_alarm - скрипт для проверки веток форума talks.guns.ru
#                на предмет появления тем с заданными ключевыми словами.
#                Задумывался как оповещалка о появлении интересующих вещей
#                в разделах купли-продажи форума. Оповещает по e-mail.
#
#        USAGE:  Указать свои настройки и поставить в cron
#
#       AUTHOR:  dimio
#          URL:  http://www.dimio.org
#      VERSION:  0.1
#      CREATED:  2010-09-01
#===============================================================================
use warnings;
use strict;
use LWP::UserAgent;
#use LWP::Simple; # на хостинге не хочет получать страницу, приходится использовать LWP::UA

########### ПОЛЬЗОВАТЕЛЬСКИЕ НАСТРОЙКИ #####################################
my $forum       = 245; #номер форума, за которым будет следить робот (245 - купля-продажа ср-в связи)
my $alarm_words = 'YAESU|яська'; #ключевые слова, на которые будет реагировать робот (разделитель - | )

my %email_opt = (
    #Заменить на свои данные
    'To: '      => 'dimio@dimio.org', #Адрес получателя
    'From: '    => 'dimio@dimio.org', #Адрес отправителя
    'Subject: ' => 'GUNS.RU alarm',   #Тема письма

    #Здесь ничего менять не нужно
    'Mime-Version: ' => '1.0',
    'Content-Type: ' => 'text/plain; charset="utf-8"',
    'Content-Transfer-Encoding: ' => '8bit',
);

########### СИСТЕМНЫЕ НАСТРОЙКИ #####################################
my $sendmail = '/usr/bin/sendmail -t';
my $db_file = 'guns_miss.db';
########### КОНЕЦ НАСТРОЕК #####################################

my $ua = &ua_init;
my $miss;

if (-e $db_file) {
    open (MISS, '<',  $db_file) or die "Can't open $db_file : $!\n";

    while (){
        $miss = $_;
    }

    close (MISS);
}
else { system ("touch $db_file"); }


open (MISS, '>',  $db_file) or die "Can't open $db_file : $!\n";

my $url = "http://talks.guns.ru/forumtopics/$forum.html";
my $resp = $ua->get($url);
    die "Couldn't get page from $url\n" unless $resp->is_success;
my $content = $resp->content;

my $line ='';
while ($content =~ m#(.*($alarm_words).*?)#gi) {

    print MISS " $1 ";
    $line .= $1 . " ==> " . $2 . "\n" if $miss !~ / $1 /;
}

close (MISS);

&SendEmail(\%email_opt,$line) if $line;

exit 0;

################################################

sub SendEmail() {
    my ($email_opt,$line) = @_;

    my $msg_body;

    foreach my $email_param (keys %$email_opt) {
        $msg_body .= $email_param . $email_opt->{$email_param} . "\n";
    }

    $msg_body .= "\n" . $line . "\n";

    system ("echo '$msg_body' | $sendmail");
}

sub ua_init() { # инициализация юзер-агента, прикидываемся браузером
 my $browser=LWP::UserAgent->new('agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11)',
								  'requests_redirectable' => ['GET', 'POST']);
 $browser->default_header('Accept' => 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1',
						'Accept-Charset' => 'utf-8; *;q=0.1',
						'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3',
						'Accept-Encoding' => 'deflate, gzip, x-gzip, identity, *;q=0',
						);
 return ($browser);
}