четверг, 11 октября 2007 г.

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 < 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>&amp;1`;  
open OUT, ">.micq/scripting";  
print OUT "/msg ${ARGV[0]}\n";  
print OUT $ping;  
print OUT ".\n";  
close OUT;  
next;  
}  
}  


Скрипт я запускаю так: script &
micq запущен под screen

Комментариев нет: