ICQ shell

Как то пришла мне мысль рулить серваком по аське и решено было написать небольшого бота на Perl.

Нам понадобиться модуль Net::OSCAR, описанте можно найти тут, собственно этого и хватит для простого бота.

Либы можно поставить из портов

cd /usr/ports/net-im/p5-Net-OSCAR/ make install clean
cd /usr/ports/sysutils/p5-Sys-Gamin/ make install clean
Вот собственно код с не большими коментами.  
#!/usr/bin/perl
use Net::OSCAR;
use Sys::Gamin;     #модуль следящйи за изменением в файле
$MYADMIN = 123456789;     #ICQ номер человека который может выполнять комады
$UIN = 123456789;     # номер бота
$PASSWORD = "123456";     #пароль

%functions = ( "cmd" => \&icq_bot_cmd, );

$oscar = Net::OSCAR -> new();
$oscar -> set_callback_im_in(\&message_callback);
$oscar -> signon($UIN, $PASSWORD) or die("Login failed\n");     #авторизация
$guard = Sys::Gamin -> new();
$guard -> monitor('/var/log/openvpn.log');         #файлы за изменение которых будем следить
$guard -> monitor('/var/log/auth.log');

#цикл в нем мы следим за файлом
$quit = 0; while(!$quit) {
    if($guard->pending){  
        $event=$guard->next_event;
        if($event->filename eq '/var/log/auth.log'){
            my $last = `tail -1 /var/log/auth.log`;
            if($last =~ / error:|Accepted /){
                $oscar -> send_im($MYADMIN, $last);
            }
        }
        if($event->filename eq '/var/log/openvpn.log'){
            my $last = `tail -1 /var/log/openvpn.log`;
            if($last =~ / Peer Connection Initiated with /){
                $oscar -> send_im($MYADMIN, $last);
            }
        }
    }
    $oscar->do_one_loop();
}

sub message_callback {
    local ($client, $uin, $msg) = @_;
    $msg =~ s/\x00+(.)/${1}/g;     #вырезаем нули из полученного сообщения
                    #в полученных сообщениях от R&Q почему то перед каждым
                    #символом шел нулевой байт, не знаю с чем это связано
    
    open(APPFH,">> in_msg.log");     #записываем полученые сообщения в лог фаил
    print (APPFH $uin,":",$msg,":",`date`);
    close(APPFH);

    if(($cmd,$params) = $msg =~ /^\!([^\ ]+) (.+)$/){
        #парсим команду и параметры (!cmd uptime)
        #!cmd вызов функции cmd на выполнение команды uptime
        $result = exists($functions{$cmd}) ? $functions{$cmd}($params) : "";
    }
}

sub icq_bot_cmd {
    if ($uin eq $MYADMIN){
        local $result=`$params`;
        $client->send_im($uin, "$result");
    } else {
        $client->send_im($uin,"Permission denied");
    }
}  

В крации что делает бот.

Бот следить за изменением в логфайлах (ssh и openvpn) и сообщает нам если кто то подключился.

Так же можно выполнять консольные команды.

Я думаю тут есть где разгуляться фантазии и прикрутить кучу разных фичь.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *