Суббота, 20.04.2024, 02:22 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Anton93, Волк-1024, xXxSh@dowxXx  
delphicode » Delphi » Программы на Delphi » Простейший ICQ клиент
Простейший ICQ клиент
dolphinДата: Вторник, 11.08.2009, 14:38 | Сообщение # 1
Администратор
Сообщений: 906
Статус: Offline
В данной статье будет рассмотрен процесс написания собственного ICQ-клиента с помощью компонента TIcqClient. Собственно, авторы потрудились на славу, за что им большая благодарность. Полученные навыки можно применять в совершенно различных целях, например таких, как написание собственного icq бот-сервиса, информатора, и даже просто ассистента удаленного управления своим компьютером. Да-да, запустив такого бота у себя дома, вы можете управлять машиной (естественно добавив функции удаленного управления), прямо из трамвая, университета, работы, etc...

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

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


Система: Windows 10 x64, Kali Linux
Среды программирования: Delphi 7, Delphi 10.x

Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
 
kazin8Дата: Четверг, 13.08.2009, 19:00 | Сообщение # 2
Группа: Удаленные



слушай... я про этот объект много слышал... да и пробовал. вот только он сейчас работает? а то протоколы постоянно меняются
 
DjFlyДата: Пятница, 02.10.2009, 20:47 | Сообщение # 3
Группа: Удаленные



kazin8,
Quote (kazin8)
я про этот объект много слышал... да и пробовал. вот только он сейчас работает? а то протоколы постоянно меняются

Работает конечно, обновляй компонент, и всё будет Ok.
За компонентом к нам, сюда
Code
________________


Сообщение отредактировал dolphin - Воскресенье, 04.10.2009, 17:14
 
freezДата: Четверг, 15.07.2010, 15:41 | Сообщение # 4
Частый гость
Зарегистрирован: 09.01.2010
Группа: Пользователи
Сообщений: 30
Статус: Offline
Исходник бы а то процедуру получения информации об уин не получается написать sad

Сообщение отредактировал freez - Четверг, 15.07.2010, 15:44
 
delphicode » Delphi » Программы на Delphi » Простейший ICQ клиент
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz