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

Написал Fen-Omen, в Статьи » Delphi.
Сайт автора: http://hack-academy.ru

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

Если вы решились взятся за такое нелегкое дело, как написание собственного, полноценного icq клиента (который, несомненно, станет самым лучшим), вы можете ознакомиться с аспектами работы с протоколом, на примере исходного кода компонента. Если использовать уже готовый вариант, то возможности Вашего приложения будут очень ограничены функциями предоставляемыми TIcqClient (используется восьмая версия протокола), что уже не позволительно. Ну а основы для вышеперечисленных целей мы сейчас и рассмотрим. Для начала скачаем сам TIcqClient: component.rar [204.43 Kb] (cкачиваний: 807). Устанавливаем, 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: component.rar [204.43 Kb] (cкачиваний: 807).
#1 Lex Luthor |  

когда то я тоже хотел написать но увы забил. Кста можно сделать бота который по указаному урлу сливал файло я так и сделал. Допустим сижу на работе а трафф есснно ограничен вот кидаю линк боту он сливает файл домой прихожу и наслаждаюсь. А так фен твой дебют продолжай в томже духе+1 fellow
Дата публикации: 30 октября 2007 15:24 | ICQ: --
цитировать

я сомневаюсь что там прокся рабочая
Дата публикации: 6 ноября 2007 12:39 | ICQ: --
цитировать
#3 cyberDog |  

сам компонент уже давно не рабочий=\ может чего поновее посоветуете?
Дата публикации: 10 ноября 2007 18:25 | ICQ: --
цитировать
#4 Lex Luthor |  

Да норм компанент мои требования он удоволетворял автор компанента забил на него поэтому люди сами правят. А что именно тебе надо????
Дата публикации: 11 ноября 2007 08:04 | ICQ: --
цитировать
#5 Fen-Omen |  

cyberDog есть много не рабочих, устаревших аналогов. Может быть вы про это? Именно этот компонент вполне работоспособен и функционален и проверен перед публикацией материала. Думаю, найдутся люди, готовые это подтвердить. Не знаю что вы имели ввиду, говоря: "сам компонент уже давно не рабочий=\", поясните... Мб не получилось что?=)
Дата публикации: 12 ноября 2007 05:11 | ICQ: 621834
цитировать

Фен, а без компонента слабо? А то получается не программирование, а кидание компонентов на форму. :)
Дата публикации: 13 ноября 2007 08:31 | ICQ: --
цитировать
#7 John Frost |  

ЫЫЫЫ :) ппц командный дух
Дата публикации: 13 ноября 2007 18:32 | ICQ: 488251
цитировать
#8 vorishka |  

А "прочесть статус-сообщение" как сделать? И зациклить её? ;)[/left]
Дата публикации: 4 декабря 2007 20:28 | ICQ: ICQ
цитировать
#9 Fen-Omen |  

vorishka, при смене основного статуса - клиент оповещает сервер icq, а тот в свою очередь отсылает сообщение вам, которое провоцирует событие OnStatusChange. Xtraz статус в данной версии протокола не предусмотрен...
Дата публикации: 3 мая 2008 11:40 | ICQ: 621834
цитировать
#10 Vanger |  

статья была переработана автором и соответственно изменена на сайте
надеемся, что в новом виде она будет удобнее для понимания
Дата публикации: 3 мая 2008 19:55 | ICQ: --
цитировать
#11 DimaVT |  

переработана на славу
Дата публикации: 6 мая 2008 19:45 | ICQ: --
цитировать
#12 Я |  

Как присвоить Proxy_type компоненту combobox для выбора?
Дата публикации: 28 мая 2008 19:55 | ICQ: --
цитировать
#13 Андрей |  

где скачать самый новый компонент? этот не работает
Дата публикации: 2 июня 2008 18:48 | ICQ: --
цитировать
#14 Fen_Omen |  

> где скачать самый новый компонент? этот не работает

Андрей, в статье расположена ссылка, где находится вполне рабочая вариация этого компонента. Суть в том, что поддержки этого компонента не уже существует (оффициальной). Благо находятся умельцы, реагирующие на изменения протокола, и довольно оперативно вносят изменения в компонент. На каком этапе возникли сложности?

> Как присвоить Proxy_type компоненту combobox для выбора?

Тип прокси может быть одним из:

TProxyType = (P_NONE, P_SOCKS4, P_SOCKS5, P_HTTPS, P_HTTP);

Объявленны в ICQWorks.pas

Из-за несоответсвия типов, думаю, целесообразно будет назначить каждому элементу (точнее его индексу) в списке Combobox свой тип прокси.

К примеру таким образом:

case combobox1.ItemIndex of
0:icqclient1.ProxyType:=P_NONE;
1:icqclient1.ProxyType:=P_SOCKS4;
2:icqclient1.ProxyType:=P_SOCKS5;
3:icqclient1.ProxyType:=P_HTTPS;
4:icqclient1.ProxyType:=P_HTTP;
end;

Или просто написать и вывести отдельную функцию, с входным параметром - индекс элемента в комбобоксе, и выходным - тип прокси. Это если Вам понадобится использовать ее не однократно, а не только в процессе присваивания типа прокси свойсву компонента icqclient.

Если будет возникать ошибка вида "Undeclared identifier: 'P_NONE'", это будет означать, что у вас не подключен модуль ICQWoks.pas... Просто пропишите его в uses.
Дата публикации: 4 июня 2008 00:42 | ICQ: --
цитировать
#15 Kiber_punk |  

Fen_Omen, +1, статья хорошая
Дата публикации: 16 июня 2008 09:43 | ICQ: 262613656
цитировать
#16 Mr_Stealth |  

|{rtyy}|, отвечая на Ваш вопрос - "Как отслеживать сбой подключения?". Во первых вызовется событие OnConnectionFailed (Если сбой при подключении или вас просто отсоединит по каким либо причинам). Во вторых событие OnError(Sender: TObject; ErrorType: TErrorType; ErrorMsg: String). Тип ошибки (ErrorType) может быть одним из

ERR_SOCKET - Ошибка в сокете
ERR_INTERNAL - Неизвестная ошибка в компоненте
ERR_WARNING - Просто предупреждение
ERR_PROXY - Ошибка в прокси сервере
ERR_PROTOCOL - Ошибка в самом протоколе...
ERR_CONNTIMEOUT - ТаймАут
ERR_LOGIN - Ошибка во время попытки подключится

Сообщение (ErrorMsg) может быть "Неправильный пароль" или же "Слишком много подключений".

Для регулировки времени таймаута используйте свойство компонента property ConnectionTimeout: Byte.
Дата публикации: 17 июня 2008 03:18 | ICQ: --
цитировать
#17 |{rtyy}| |  

компонент кривоват...при инициализации события OnError выдаётошибку в объявлении типов:
Undeclared identifier: 'TErrorType'
Дата публикации: 17 июня 2008 05:53 | ICQ: --
цитировать
#18 Freeman |  

а как авторизировать контакт, или зделать так что б бот не требовал запрос об авторизации??
Дата публикации: 3 июля 2008 22:30 | ICQ: --
цитировать
#19 Mr_Stealth |  

Freeman,

Процедура

procedure TICQClient.SetAuthorization(Authorizatio
nRequired, WebAware: Boolean);

устанавливает опции контакта:

1) AuthorizationRequired - Нужен ли запрос авторизации (true - нужен, false - нет).
2) WebAware - Виден ли статус в поиске и на форумах.

Процедура

SendAuthResponse (UIN: LongWord; Authorize: Boolean; Reason: string);

Авторизует\Не авторизует. В последнем случае, последний параметр - причина отказа.

Предупреждая опасания по поводу изменения протокола - компонент остался работоспособным... Do not make panic.

P.S. Последнее время, я довольно редко заглядываю, если нужен оперативный ответ - прошу в icq [621834].
Дата публикации: 4 июля 2008 02:21 | ICQ: --
цитировать
#20 Sin3v |  

Вот рабочий компонент на сегодняшний день http://progs.volkov.spb.su/ticqclient/ victory
Дата публикации: 9 июля 2008 16:14 | ICQ: --
цитировать
#21 Vanger |  

3800 просмотров.. по 200-300 стабильно каждый месяц
может, зря решили удалить статью?:) ладно хоть в архив положили и ссылку на скачивание прилепили

UPD: статья восстановлена, немного изменено оформление
11.04.2009
Дата публикации: 14 октября 2008 22:24 | ICQ: --
цитировать

как правильно отследить что сообщение доставлено?
знаю что через OnAdvancedMsgAck но как, если можно пример

спасибо
Дата публикации: 25 апреля 2009 22:01 | ICQ: --
цитировать
#23 source |  

Если будет возникать ошибка вида "Undeclared identifier: 'P_NONE'", это будет означать, что у вас не подключен модуль ICQWorks.pas... Просто пропишите его в uses.



СПАСИБО ОГРОМНОЕ!!!!
Дата публикации: 2 мая 2009 13:40 | ICQ: --
цитировать

Веззде в интернете пишут г сокращени ецн, а на станциях билеьы на электропоезда проадют по завушенным ценам.
Дата публикации: 4 февраля 2010 09:11 | ICQ: --
цитировать
#25 Byncscerpes |  

Доброе время суток! Возможно не много не в тему, но хочу предложить Вам уникально низкие цены на оптовую медицинскую продукцию,
на нашем сайте Вы найдете - [url=http://bbworld.biz/probirki-vakuumnie-kupit.html]вакуум
ные пробирки[/url],
[url=http://bbworld.biz/sistemi-infusionnie-dlya-rastvorov-k
apelnici.html]системы для растворов, инфузионные системы, капельницы[/url] ,
а так же [url=http://bbworld.biz/shprici-odnorazovie-trehkomponentnie
.html]шприцы, шприц одноразовый, купить шприцы[/url] по удивительно низким ценам с очень хорошим качеством!
Ждем Вас на нашем сайте!
Дата публикации: 7 февраля 2010 05:29 | ICQ: --
цитировать
#26 Вика |  

а как создать новый уин и пароль а то мя взломали? sad
Дата публикации: 22 марта 2010 15:25 | ICQ: --
цитировать
#27 Shuroimmirm |  

модерам удалить [url=http://jobldell.com].[/url]
Дата публикации: 2 апреля 2010 04:59 | ICQ: --
цитировать

FREE PORN TORRENTS!
JUST DOWNLOAD AND ENJOY!

http://xxxmovietorrents.net
Дата публикации: 12 апреля 2010 16:10 | ICQ: --
цитировать

FREE PORN TORRENTS!
JUST DOWNLOAD AND ENJOY!

http://xxxmovietorrents.net
Дата публикации: 26 апреля 2010 13:15 | ICQ: --
цитировать
#30 Vladzik |  

А как текст сообщения взять для анализа в своей проге?
Дата публикации: 16 июня 2010 00:54 | ICQ: --
цитировать
← Назад    1 2    Вперед →

Добавить комментарий


Включите эту картинку для отображения кода безопасности
обновить код



 

Лучшие новости

Наш опрос

Мы в интернете


Профиль

Добро пожаловать, гость. Войдите, или зарегистрируйтесь.
Логин:

Пароль:

Забыли пароль?

Друзья


хомяк Немиро Алексея


Музыка микросхем
Хак-академия

Интересные ссылки


Безопасная настольная игра футбол. Качественная настольная игра футбол только тут.
Купить мебель г Самара. Купить офисную мебель в Самаре.