Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.47.111] |
|
Сообщ.
#1
,
|
|
|
В данной статье мы с вами разберем некоторые аспекты связанные с общим понятием ICQ-бота, его назначением, применением и даже попробуем разработать своего незаурядного бота с ничем не выделяющимся интеллектом.
Для начала определимся для чего он вообще нужен. Многие из Вас выбрали протокол ICQ (OSKAR) для общения в сети. Это очень удобный вариант для обмена мгновенными сообщениями. Но ведь можно использовать, так называемую, "аську" и для получения ценной для Вас информации. Вот здесь то и приходят на помощь боты! Так кто же он такой? ICQ-бот - компьютерная программа, работающая по протоколу ICQ и выполняющая различные функции. Принцип работы: бот принимает входящие сообщения, анализирует их и отсылает результат выполнения и/или выполняет нужную команду. Существует несколько типов ботов. Чат-боты - на каком-либо UIN закреплена программа, имитирующая общение. Но так есть и информационные боты. Они способны выдать по запросу переводы слов, текущие курсы валют, прогноз погоды по более чем 2000 городов мира, выполняют функции органайзера с возможностью установить напоминания на указанное время/дату и т.д. набор функций и интеллект бота напрямую зависит от желания и возможностей разработчика. Вот и мы сегодня попробуем "воспитать" свое собственное чадо. Это будет очень простой бот, смособный обработать лишь одну команду. Реализация прозвучит на языке Object Pascal. Ну что ж приступим! Для начала нам потребуется компонент, на основе которого и будет работать наш бот! Будем использовать TICQClient. Прошу заметить один очень важный момент! Нужно загрузить и использовать именно последнюю версию данного компонента, иначе работоспособность я не гарантирую. Это связано с тем, что в самом протоколе произошли изменения и старая версия просто-напросто не работает. Качаем здесь. Будем считать, что вы уже скачали и установили. Проблем думаю не возникнет. Тем более в архиве с компонентом содержится подробная справка. Приступим непосредственно к разработке. Устанавливаем свойства компонентов: Label1.Caption:="UIN:"; Label2.Caption:="Пароль:"; Edit1.Text/Edit2.Text:=""; Edit1.MaxLength:=9; Edit2.MaxLength:=8; Button1.Caption:="Вход"; Button2.Caption:="Выход"; Memo1.ReadOnly:=True; Memo1.ScrollBars:=ssVertical; Memo1.Lines.Clear; //удалить строку Memo1 Timer1.Enabled:=False; Timer1.Interval:=110000; ICQClient1.ConvertToPlaintext:=True; Поясню зачем нужен таймер. Для ICQClient1 есть обработчик события KeepAlive. KeepAlive нужно отсылать каждые две минуты на сервер для того, чтобы нас "помечали" как находищийся пользователь в сети. Теперь поместит на форму кнопку Button1 и процедуре обработки клика впишем следующий код. Это у нас будет соединение с сервером. Так же мы сразу будем проверять, не оставил ли пользователь пустыми поля с ICQ аккаунтом и будем результат работы выводить в Memo1. //Проверка на заполненность полей с ICQ аккаунтом if (Edit1.Text = '') or (Edit2.Text = '') or //пустые поля (Length(Edit1.Text) < 5) or (Length(Edit2.Text) < 3) //Если UIN меньше 5 символов и пароль меньше 3 then begin MessageDlg('Не правельно заполнены поля!',mtInformation,[mbOk],0); //Выводим сообщение об ошибке Exit; end; rec := True; //Удачное соединение ICQClient1.UIN := StrToInt(Edit1.Text); //забираем UIN ICQClient1.Password := Edit2.Text; //забираем пароль ICQClient1.Login(); //Соединяемся с сервером Memo1.Lines.Add('Соединение с сервером ICQ...'); //Выводим текущее состояние (соединение) Далее мы проверяем установлено ли соединение с сервером. Это событие OnLogin для ICQClient1. Это удачное соединение. if ICQClient1.LoggedIn then //если соединение установлено begin Memo1.Lines.Add('Соединение с сервером установлено.'); //Добавляю в Memo1 строку о текущем положении Timer1.Enabled := True; //Включаю таймер end; Для провала при подключении используем следующий код и добавляем его в обработчик события OnConnectionFailed опять же для ICQClient1. if not rec then Exit; //Если мы нажали на кнопку "Выход", то не нужно пытаться соединиться Memo1.Lines.Add('Не удалось соединиться с сервером.'); if MessageDlg('Попытаться соединиться еще раз?',mtInformation,[mbOk,mbCancel],0) = mrOk then begin ICQClient1.Login(); Memo1.Lines.Add('Соединение с сервером ICQ...'); end; Для таймера используем следующий код: ICQClient1.SendKeepAlive; //посылаем KeepAlive (Зачем? Описываль выше :)) Далее для кнопки Button2 используем функцию разрыва связи с сервером: if not ICQCLient1.LoggedIn then MessageDlg('Соединение с сервером не установлено!',mtInformation,[mbOk],0) else begin rec := False; ICQCLient1.Disconnect; Memo1.Lines.Add('Соединение с сервером оборвано.'); Timer1.Enabled := False; end; А теперь непосредственно и "сердце" нашего бота. Даже не сердце а интелект. Сейчас мы его научим обрабатывать пришедшие сообщения. Для этого мы воспользуемся обработчиком события OnMessageRecv. Ничего сложного. Вот пример кода. var icq: cardinal; begin icq := StrToInt(UIN); Memo1.Lines.Add(UIN + ': ' + Msg); //Добавляем полученное сообщение в Memo1 if Msg="Привет" then ICQClient1.SendMessage(icq,'Привет'); //Отсылаем ответ, мол здравствуйте! Рады вас слышать! else ICQClient1.SendMessage(icq,'Извините, мне не о чем с Вами поговорить... :)'); end; Вот так, друзья мои! Таким не сложным кодом можно создать собственного бота-болтуна и наделить его отличной разговорной базой! Но это уже скучная и рутинная работа. Желаю Вам творческих успехов, меньше ошибок и больше кода! |
Сообщ.
#2
,
|
|
|
хорошая статейка вот только одна проблема неверный дескриптор (6) возникает при закрытии
где то поток глючит странно но в демушке с компонентом нет ошибки Добавлено автор забыл строчку добавить!!! в онкреате procedure TForm1.FormCreate(Sender: TObject); begin ICQClient1:= TICQClient.Create(nil); ICQClient1.DisableDirectConnections:= True;//вот чего не хватало!!!!!!!!!!! ICQClient1.ICQServer:= 'login.icq.com'; ICQClient1.ICQPort:= 5190; end; думаю это тоже не помешает procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(ICQClient1) then begin if ICQClient1.LoggedIn then ICQClient1.Disconnect; FreeAndNil(ICQClient1); end; end; |