Простейший ICQ клиент

В данной статье будет рассмотрен процесс написания собственного ICQ-клиента с помощью компонента TIcqClient. Собственно, авторы потрудились на славу, за что им большая благодарность. Полученные навыки можно применять в совершенно различных целях, например таких, как написание собственного icq бот-сервиса, информатора, и даже просто ассистента удаленного управления своим компьютером. Да-да, запустив такого бота у себя дома, вы можете управлять машиной (естественно добавив функции удаленного управления), прямо из трамвая, университета, работы, etc…Сайт автора: http://hack-academy.ru

В данной статье будет рассмотрен процесс написания собственного ICQ-клиента с помощью компонента TIcqClient. Собственно, авторы потрудились на славу, за что им большая благодарность. Полученные навыки можно применять в совершенно различных целях, например таких, как написание собственного icq бот-сервиса, информатора, и даже просто ассистента удаленного управления своим компьютером. Да-да, запустив такого бота у себя дома, вы можете управлять машиной (естественно добавив функции удаленного управления), прямо из трамвая, университета, работы, etc…

Если вы решились взятся за такое нелегкое дело, как написание собственного, полноценного icq клиента (который, несомненно, станет самым лучшим), вы можете ознакомиться с аспектами работы с протоколом, на примере исходного кода компонента. Если использовать уже готовый вариант, то возможности Вашего приложения будут очень ограничены функциями предоставляемыми TIcqClient (используется восьмая версия протокола), что уже не позволительно. Ну а основы для вышеперечисленных целей мы сейчас и рассмотрим. Для начала скачаем сам TIcqClient: [attachment=29]. Устанавливаем, Main Menu => Component => Install Component, выбираем ICQClient.pas, ставим . По заверению авторов, без проблем ставится на Delphi5, Delphi6, Delphi7, и может быть легко импортирован под Delphi 3 и более старые версии. Лично я все операции проделывал на Delphi 7, без каких бы то ни было проблем.

Назначения юнитов:

ICQWorks.pas — contains all low level parsing functions & constants.
ICQSock.pas — small and fast TCP socket used in TICQClient.
ICQDb.pas — TICQDb component, helps to import contacts, messages & self info in your own applications.
ICQDb.dcr — component\’s icon.
ICQDirect2.pas — objects providing direct connection support, rewritten by NighTrader.
ICQClient.pas — TICQClient component itself.
ICQClient.dcr — component\’s icon.
ICQLang.pas — language file.

Вот некоторые возможности TICQClient:

— Коннект к серверу, смена статуса;
— Управление контактами, списком игнорируемых, невидящих, видящих и проч;
— ПриемОтправка файлов;
— Поиск пользователей по номеру, e-mail, Нику или различным группам;
— Получение короткой или полной информации о пользователе;
— Загрузка своей инфы;
— Установка флага запроса webaware(частенько используется на форумах) и авторизации;
— РегистрацияРазрегистрация номера;
— Смена текущего пароля;
— ОтправкаПолучение различных типов сообщений и ссылок;
— ОтправкаПолучение sms (не тестил);
— Отсылказапрос контактов;
— Поддержка Auto-Away сообщений;
— Поддержка соединения между клиентами (сообщения (Лимит символов: 450 для offline сообщений, и 7000 на online), ссылки, файлы);
— Поддержка SOCKS4, SOCKS4a, SOCKS5, HTTP, HTTPS;
— Многоязыковой вывод сообщений об ошибках;
— Открытый код Delphi. Полная свобода разработки!;

Параметры компонента

Для подключения, нам нужно в свойство UIN ввести наш новый номер (предварительно регистрируем номер для бота), а в Password пароль. Внимание! Крайне не советую на этапе разработки хранить номер UIN\’а в свойстве компонента, так как он сохраняется вместе с исходниками в чистом виде. Например, просмотрев файл unit1.dfm, мы наблюдаем среди прочих строк:

object icq: TICQClient
ProxyPort = 0
UIN = 621834
Password = \’MyOpenPassword\’
ICQServer = \’login.icq.com\’
ICQPort = 5190
PortRangeFirst = 3000

Будьте аккуратней. Такс… Собственно сервер и порт следует использовать те, что установлены по умолчанию. Теперь, вызвав процедуру Login, наш бот подключится к сети. И может получать любые входящие сообщения. Процедура Login выглядит так: procedure Login(Status: LongWord = S_ONLINE; BirthDay: Boolean = False). Первый параметр отвечает за статус бота. Он может быть одним из:

S_ONLINE = $00000000;
S_INVISIBLE = $00000100;
S_AWAY = $00000001;
S_NA = $00000005;
L_S_NA = $00000004;
S_OCCUPIED = $00000011;
L_S_OCCUPIED = $00000010;
S_DND = $00000013;
L_S_DND = $00000012;
S_FFC = $00000020;
S_OFFLINE = $FFFFFFFF;

Константы объявленны в файле ICQWorks.pas. Второй параметр, если установлен в true, будет отображать иконку воздушного шарика рядом с ником бота.

Пример программы

Давайте попробуем научить нашего бота при успешном подключении оповестить нас об этом в аське. Для этого вставим вызов процедуры sendMessage(UIN: LongWord; Msg: String) в событие OnLogin. Событие Onlogin вызывается при успешном подключении к серверу. Далее, если мы хотим проверить, подключены ли мы к серверу следует смотреть свойство LoggedIn, если коннект есть, вернется true. Вообщем, наша процедура OnLogin будет состоять из одной строчки и выглядеть таким образом:

procedure TForm1.ICQClient1Login(Sender: TObject);
begin
icqclient1.SendMessage(621834,'We are connected, Boss! =)');
end;

Естественно, номер вы подставите свой. Кстати, в TIcqClient UIN везде, как и положено, является типом integer, то есть числовым параметром. Но только не в событии, вызываемом при получении сообщения — OnMessageRecv. Там UIN представлен в виде строки (string), и для отправки сообщения собеседнику вам прийдется воспользоваться StrToInt(UIN). Например, функции простейшего бота, который в ответ на любое сообщение пишет какое-либо слово:

procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
begin
icqclient1.SendMessage(StrToInt(UIN),'It`s Rock-n-roll... baby!');
end;

Добавить пользователя в свой контакт лист можно, вызвав процедуру AddContact(Номер), которая вернет true в случае, если не возникло проблем, и пользователь добавлен. Процедура RemoveContact(UIN: LongWord) выполнит обратное действие, то есть удалит пользователя из вашего контакт листа. Отслеживать изменения статусов у ваших собеседников можно, обрабатывая событие OnStatusChange(Sender: TObject; UIN: String; Status: Cardinal), которое вызывается если пользователь меняет статус или выходит в online (для отслеживания выхода из сети обрабатывайте OnUserOffline(Sender: TObject; UIN: String)). Статусы описаны выше.

Например, если мы хотим запросить какую-либо короткую информацию о человеке, зная его номер, нам достаточно вызвать RequestInfoShort(номер), и идти прямиком в Events, обрабатывать OnUserInfoShort. Здесь будет такая информация как UIN, NickName, FirstName, LastName, Email: String; UserFound, AuthRequired: Boolean. Если мы захотим получить полную информацию о собеседнике, тогда вызываем просто RequestInfo. В ответ мы должны обработать события OnUserWorkInfo, OnUserInfoMore, OnUserInfoAbout, OnUserInfoInterests, OnUserInfoMoreEmails. Остальные свойства, функциипроцедуры, события также имеют интуитивно понятные имена, что бы вы могли разобраться самостоятельно. Кстати, контроль за доставкой сообщения вы можете осуществить с помощью события OnAdvancedMsgAck, которое вызывалось в ответ на SendMessageAdvanced. Параметр AcceptType: Byte как раз и будет содержать отчет, например, если сообщение доставлено успешно — ACC_NORMAL. Чтобы отобразить контакт лист, следует в событии OnLogin вызвать процедуру RequestContactList, обработать событие OnServerListRecv, и в конце вызвать функцию DestroyUINList(SrvContactList).

Как я уже говорил, цели создания такого бота могут быть довольно обширны, и зависят только от вашей фантазии. Разбирайте идеи:

1) Бот-Информатор для вашего портала, посредством которого пользователь может ознакомится с новыми поступлениями в различные разделы.
2) Троянизированный «клиент». Создается интерфейс какого-нибудь популярного ICQ-клиента, и расшаривается с рекламой последней версии. Пользователь вводит UIN, Пароль (Не видя разницы в обличии), и жмет подлючится. После чего происходит подлючение вашего бота, который отсылает вам содержимое полей. Пользователь же получает сообщение о невозможности подключится.
3) Система удаленного управления. Например, просмотр содержимого текстовых файлов, доступ к консоли. Может быть много аспектов.
4) Развлекательные сервисы… Тут можно думать до умопомрачения. Гороскопы, анекдоты, новости, афоризмы, поисковики, курсы валют и т.п. Таких и так куча.
5) Спамм посредством ICQ может быть довольно прибыльным занятием. Хотя, конечно, лучше существующих продуктов создать будет очень и очень трудно.
6) Специализированный ICQ Бот-сервис для программистов, какого еще свет не видывал :).

Перечень довольно не полный, взят из головы, можете его активно исправлять, дополнять и извращаться по всякому. Вообще, иметь ручного бота под рукой, который, к тому же, пишется за очень короткий срок, иной раз, очень даже полезно…

СКАЧАТЬ

1. Компонент TIcqClient: [attachment=29].