Security Teams



:::
Страницы: (3) [1] 2 3  ( Перейти к первому непрочитанному сообщению ) Ответ в темуСоздание новой темы

> Пишем ICQ бота, (c) drmist
drmist
Дата 14.12.2006 - 05:46
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Пишем ICQ бота ©drmist, https://www.security-teams.net

В данной статье рассматривается пример создания ICQ-бота. В качестве операционной системы, под которую будет написан бот, была выбрана unix, как одна из самых распространенных (тут я имею ввиду все unixlike операционные системы: linux, *bsd, hp-ux, solaris и тп - лично я тестировал скрипт под FreeBSD). В качестве языка программирования - Perl, поскольку скрипты на перле легче всего переносимы между unixlike операционными системами.

Первый вопрос, которым я себя озадачил при попытке написать icq-бота: как осуществить взаимодействие с icq-сервером? Изучать протокол icq и самому писать клиент на сокетах или использовать готовое решение? К сожалению, протокол icq не документирован (имеются только неофициальные описания) и к тому же часто меняется. Я решил воспользоваться наработками других программистов, благо, как выяснилось, в них нет недостатка.

Под перл существует по крайней мере четыре модуля для работы с протоколом icq: Net::ICQ, Net::ICQ2000, Net::ICQ2000_Easy и Net::OSCAR; Модуль Net::ICQ устарел и больше не является рабочим. Модуль Net::ICQ2000 рабочий, но предоставляет не очень удобный интерфейс для использования протокола. Net::ICQ2000_Easy является надстройкой над Net::ICQ2000 и компенсирует указанный недостаток. Однако мне не удалось найти его в портах, .pm модуль, взятый с оффсайта производителя будучи скопированным в /usr/local/lib/perl5/site_perl/5.8.8/Net и прописанным в директиве use непостижимым образом вызывал ошибку 'Can't locate Net/ICQ2000_Easy.pm in @INC...', cpan о таком модуле вобще не слышал. В общем даже если бы мне удалось установить этот модуль на локалхосте, у людей, которым захочется воспользоваться моим скриптом, возникла бы масса проблем. В результате я остановился на Net::OSCAR - модуль оказался рабочим и очень удобным.

Но модуль Net::OSCAR скорее всего не будет установлен на Вашей машине по умолчанию. Установить его можно либо через cpan:
Код
# cpan
cpan> install Net::OSCAR
cpan> exit

Либо, если у Вас FreeBSD - из портов:
Код
# cd /usr/ports/net-im/p5-Net-OSCAR
# make install clean && rehash

Полное описание модуля можно прочитать на соответствующих man-страницах
Код
# man Net::OSCAR

Его возможности действительно впечатляют. Можно не только обмениваться сообщениями, отслеживать изменения статуса пользователей, создавать группы и добавлять людей в список 'buddies', но и использовать прокси, обмениваться файлами и создавать комнаты. Не поддерживаются разве что игры типа шахмат и барашков smile.gif. Из ман-страниц наиболее важной для нас информацией являются основные методы класса Net::OSCAR.

signon(<uin>, <pass> [<host>, <port>]) - зайти в icq под уином <uin>, используя пароль <pass>. Функция имеет два необязательных параметра - хост и порт, соответствующие icq-серверу. По умолчанию - login.icq.com и 5190 соответственно. В случае ошибки возвращает 0, иначе - значение, отличное от нуля.
do_one_loop() - эту функцию нужно поместить в цикл в основном или отдельном потоке, чтобы класс обрабатывал данные, получаемые от сервера.
send_im(<uin>, <msg>) - послать сообщение <msg> на уин <uin>
signoff() - порвать соединение с сервером
set_callback_im_in(<func>) - установить обработчик входящих сообщений. функция-параметр будет принимать в качестве параметров объект icq-клиента, уин отправителя и сообщение.

Полученных знаний достаточно для того, чтобы принимать и обрабатывать команды. Осталось только придумать, что будет делать наш бот. Я решил долго не мучиться и впихнуть в него основные функции своего irc-бота (он еще не дописан, но некоторые из Вас уже могли видеть его демонстрацию). Вот команды, которым я научил своего бота:

!google <request> - поиск в гугле
!weather <city> - узнать погоду на сегодня в заданном городе
!dn2ip/ip2dn <dn> - определить IP, соответствующий заданному доменному имени/обратное преобразование
!mx <host> - получить MX записи для заданного хоста

С реализацией этих функций, а также всего бота в целом, можно ознакомится, посмотрев в прилогающийся исходный код:

Код
#! /usr/bin/perl

# Простой icq-бот на перле
# (ц) drmist@STNC 2006

use IO::Socket::INET;
use Net::OSCAR;
use Net::DNS;
use Text::Iconv;

%functions = ("google" => \&icq_bot_google,
             "weather" => \&icq_bot_weather,
             "dn2ip" => \&icq_bot_dn2ip,
             "ip2dn" => \&icq_bot_ip2dn,
             "mx" => \&icq_bot_mx);

$conv = Text::Iconv->new('utf-8','windows-1251');
$resolver = Net::DNS::Resolver->new();
$oscar = Net::OSCAR->new();
$oscar->set_callback_im_in(\&message_callback);

# свезло мне однако такой симпотный девятизнак c первого раза зарегать :)
$oscar->signon(353567373, "Password") or die("Login failed\n");
$quit = 0;

while(!$quit) { $oscar->do_one_loop(); }

sub message_callback {
 local($cmd, $params, $result);
 local $result = "";
 local($client, $uin, $msg) = @_;

 if(($cmd, $params) = $msg =~ /^\!([^\ ]+) (.+)$/)
 {
   $result = exists($functions{$cmd}) ? $functions{$cmd}($params) : "";
   $client->send_im($uin, $result) if $result;
 }
}

sub icq_bot_dn2ip { local $dn = $_[0]; local $t = gethostbyname($dn); return $t ? "$dn\'s ip is ".inet_ntoa($t) : "Host does not exists"; }
sub icq_bot_ip2dn { local $ip = $_[0]; local $dn = gethostbyaddr(inet_aton($ip), AF_INET); return $dn ? "$ip == $dn" : "Failed";}
sub icq_bot_mx {
 local $curr; local $result = ""; local $host = $_[0];
 local @mx = mx($resolver, $host) or return " Failed";
 foreach $curr(@mx) { $result .= " ".$curr->preference." - ".$curr->exchange.";"; }
 return $result;
}

sub icq_bot_google {
 local($url, $title, $text);
 local($request) = $_[0];
 local $data = http_get("www.google.com", "/search?filter=0&hl=ru&num=1&start=0&q=".url_encode($request), 1);

 if(($url, $title, $text) = $data =~ /<h2 class=r><a class=l href=\"([^\"]+)\">(.+)<table border=0 cellpadding=0 cellspacing=0><tr><td class=j><font size=-1>(.+)<br><span class=a>/) {
   $title = html_decode($conv->convert($title)); $text = html_decode($conv->convert($text));
   if($title =~ /^(.+) \- \[ [^\]]+ \]$/){ $title = $1; }
   return "$title: $text [$url]"; }
 else { return "Nothing found"; }
}

sub icq_bot_weather {
 local $tmp;
 local $request = $_[0];
 local $result = "";
 local $data = http_get("weather.yandex.ru", "/search.xml?text=".url_encode($request), 0);

 if(($tmp) = $data =~ /Location: \.([^\r\n]+)\r\n/)
 {
   $data = http_get("weather.yandex.ru", $tmp, 1);
   ($tmp) = $data =~ /<h2><b>([^\<]+)<\/b>/; $result = "$tmp: ";
   ($tmp) = $data =~ /<tr><td class=\"t t[0-9]{1,2}\">([^\<]+)<b><i><\/i><\/b><\/td>/; $result .= "$tmp ";
   $result .= join(". ", $data =~ /<td><div>([^\<]+)<\/div>([^\<]+)<\/td><td><div>([^\<]+).<\/div>([^\<]+)<\/td><td><div>([^\<]+)<\/div>([^\<]+)<\/td>/);
   return $result;
 } else { return "Nothing found"; }
}

sub http_get {
 local $tmp;
 local $data = "";
 local ($host, $request, $skip_headers) = @_;
 local $sock = IO::Socket::INET->new("$host:80") or return "";
 print $sock "GET $request HTTP/1.0\r\nHost: $host\r\nAccept-Charset: cp1251;q=0.7,*;q=0.7\r\n".
             "User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.4) Gecko/20060903 Firefox/1.5.0.4\r\n\r\n";
 while(sysread($sock, $tmp, 1024) > 0){ $data .= $tmp; }; close $sock;
 if($skip_headers){ $tmp = index($data, "\r\n\r\n") + 4; $data = substr($data, $tmp, length($data) - $tmp); }
 return $data;
}

sub url_encode {
 local $text = $_[0];
 $text =~ s/([^a-zA-Z0-9]{1})/sprintf("%%%02x",ord($1))/eg;
 return $text;
}

sub html_decode {
 local $data = $_[0];
 $data =~ s/\<[^\>]+\>//g;
 $data =~ s/\&lt\;/\</;
 $data =~ s/\&gt\;/\>/;
 $data =~ s/\&quot\;/\"/;
 $data =~ s/\&amp\;/\&/;
 $data =~ s/\&middot\;/\xB7/;
 return $data;
}


На скриншете изображен бот в действии.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
_cheetah_
Дата 4.01.2007 - 11:48
Цитировать сообщение




Unregistered












thx за статью, очень полезная. Только вот одна трабла, что-то я никак не пойму, почему уин не показывает статус "онлайн"? И как вообще управлять статусом? Доки вроде читал...
Top
drmist
Дата 7.01.2007 - 20:37
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Цитата
И мой бот, и твой пример в квипе показывает оффлайн... Может подскажешь?

С этим вопросом Вам к производителю quip'а - в других то клиентах все нормально smile.gif


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
_cheetah_
Дата 8.01.2007 - 20:42
Цитировать сообщение




Unregistered












drmist, хм, и правда =)) Неприятно, ведь квипом многие пользуются.
Top
slavvir
Дата 2.02.2007 - 21:36
Цитировать сообщение




Unregistered












поделитесь с человеком, у которого руки в другом направлении заточены )))), кратким поэтапным руководством по оживлению данного бота. типа: что куда как и где. пожалуйста licklips+.gif
Top
mulder
Дата 5.02.2007 - 01:26
Цитировать сообщение
Offline



.:in root we trust:.
*****

Профиль
Группа: -vip-
Сообщений: 1181
Пользователь №: 1151
Регистрация: 9.08.2005



Рейтинг:
(70%) XXXX-


slavvir
Это perl приложение понятно его надо запускать через интерпритатор perl !
PM
Top
slavvir
Дата 5.02.2007 - 08:14
Цитировать сообщение




Unregistered












Цитата (mulder @ 5.02.2007 - 01:26)
slavvir
Это perl приложение понятно его надо запускать через интерпритатор perl !

таааак, спасибо, с вашей подсказкой, пошел к друзьям, они мне инфы набросали, буду потихоньку разбираться.
если где потом споткнусь, надеюсь, что поможете ..
Top
slavvir
Дата 5.02.2007 - 18:28
Цитировать сообщение




Unregistered












решил воспользоваться интерпретатором perl на хосте с поддержкой perl
ho.com.ua
вот.
взял исходный код, превратил в .pl файл, вписал аську и ее пароль.
chudodni.ho.com.ua/bot.pl
и что делать дальше или может я вообще не в том направлении двигаюсь, скорректируйте, пожалуйста

я просто реально в этом не соображаю, а бота хочу, ой как хочу smile.gif помогите

Это сообщение отредактировал slavvir - 5.02.2007 - 18:30
Top
nameless
Дата 5.02.2007 - 20:19
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


https://cpan.org/ports/index.html#win32
https://www.activestate.com/Products/ActivePerl/


--------------------
Мы расправим крылья
PM
Top
drmist
Дата 6.02.2007 - 13:26
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


slavvir
Вы почти все правильно сделали. Вам действительно нужен интерпритатор perl, притом с модулями IO::Socket::INET, Net::OSCAR, Net::DNS и Text::Iconv. На бесплатных хостингах с вероятностью 99.9% нет ни этих модулей, ни возможности устанавливать соединения с удаленными хостами (а боту, понятное дело, нужно соединиться с icq сервером). Вам нужен либо портированный под windows интерпритатор perl (ActivePerl), либо платный хостинг (поинтересуйтесь зарание у службы поддержки, подходит ли данный хостинг по перечисленным условиям), либо установить на своей машине любую операционную сисетму семейства unix (я бы советовал FreeBSD, но на крайняк сгодится и Fedora Core, если боитесь испортить данные на диске при установке второй ОС, можно воспользоваться виртуальной машиной, например VMWare).
Обратите внимание, Ваш вопрос из семейства "Для новичков" и к обсуждению непосредственно бота отношения не имеет, потому если после всего вышесказанного у Вас возникнут проблемы с запуском perl-приложений, создайте отдельнгую тему в соответствующем разделе. Дальнейшие посты такого рода будут беспощадно тереться.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top

Опции темы Страницы: (3) [1] 2 3  Ответ в темуСоздание новой темы

 





На сайте http://valberg-russia.ru сейф. | пожарная вышка универсальная, zakaz в россии