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


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

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