icq-бот на основе micq

Решил вот сделать icq бота, в основном для проверки по асе пингов до серверов/коммутаторов в домашней сети.. Нуу, точнее это давно уже было, где то в середине июля :) только вот дошли руки написать что нибудь в дневник..

У micq есть такая мощная штука, как "scripting". В настройке по-умолчанию после запуска создается именованный пайп ~/.micq/scripting. Если в него писать, это расценивается как ввод в консоли micq. Таким образом, одна сторона взаимодействия у нас есть. Для получения команд, будем читать логи пользователей из каталога history.

Скрипт я написал на perl, использовал модуль File::Tail

Формат файла логов примерно такой:

# 20070629123241/ [icq8:xxxxxxxx]!icqbot@foreveryoung.yar <- xxxxxxxxx[icq8:xxxxxxxxx+10000000 online] +1

+1 - означает сколько далее строчек самого сообщения

В общем, не знаю, что еще расписать :), просто приведу пример моего скрипта-пинговалки:

#!/usr/bin/perl
$_ = 1;
exit if( $#ARGV < 2 )
name = "/home/icqbot/.micq/history/${ARGV[0]}.log"
file = File::Tail->new( name=>$name, maxinterval=>1, interval=>1, reset_tail=>0 );
open LOG, ">>${ARGV[0]}_bot.log";
$skip = 0;
$cmd = 0;
while( defined( $_ = $file->read ) )
{
  if( $skip > 0 )
  {
    $skip--;
    next;
  }
  # далее отправленное ботом, его просто пропускаем
  if( $_ =~ /# \d+\/ \[[^]]+\]\S+ -> [^[]*\[[^]]+\] [+](\d+)/ )
  {
    $skip = $1;
    $cmd = 0;
    next;
  }
  # дальше возможно команда
  if( $_ =~ /# \d+\/ \[[^]]+\]\S+ <- [^[]*\[[^]]+\] [+](\d+)/ )
  {
    $cmd = 1;
    next;
  }
  if( !$cmd )
  {
    next;
  }
  if( $_ =~ /^ping (.+)$/ )
  {
    print LOG "Pinging $1\n";
    $ping = `ping -c 10 $1 2>&1`;
    open OUT, ">.micq/scripting";
    print OUT "/msg ${ARGV[0]}\n";
    print OUT $ping;
    print OUT ".\n";
    close OUT;
    next;
  }
}

Скрипт я запускаю так: script &

micq запущен под screen.

blog comments powered by Disqus