На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Разработка ICQ-бота , На основе компонента TICQClient
      В данной статье мы с вами разберем некоторые аспекты связанные с общим понятием ICQ-бота, его назначением, применением и даже попробуем разработать своего незаурядного бота с ничем не выделяющимся интеллектом.

      Для начала определимся для чего он вообще нужен. Многие из Вас выбрали протокол ICQ (OSKAR) для общения в сети. Это очень удобный вариант для обмена мгновенными сообщениями. Но ведь можно использовать, так называемую, "аську" и для получения ценной для Вас информации. Вот здесь то и приходят на помощь боты! Так кто же он такой? ICQ-бот - компьютерная программа, работающая по протоколу ICQ и выполняющая различные функции. Принцип работы: бот принимает входящие сообщения, анализирует их и отсылает результат выполнения и/или выполняет нужную команду. Существует несколько типов ботов. Чат-боты - на каком-либо UIN закреплена программа, имитирующая общение. Но так есть и информационные боты. Они способны выдать по запросу переводы слов, текущие курсы валют, прогноз погоды по более чем 2000 городов мира, выполняют функции органайзера с возможностью установить напоминания на указанное время/дату и т.д. набор функций и интеллект бота напрямую зависит от желания и возможностей разработчика.

      Вот и мы сегодня попробуем "воспитать" свое собственное чадо. Это будет очень простой бот, смособный обработать лишь одну команду. Реализация прозвучит на языке Object Pascal. Ну что ж приступим!

      Для начала нам потребуется компонент, на основе которого и будет работать наш бот! Будем использовать TICQClient. Прошу заметить один очень важный момент! Нужно загрузить и использовать именно последнюю версию данного компонента, иначе работоспособность я не гарантирую. Это связано с тем, что в самом протоколе произошли изменения и старая версия просто-напросто не работает. Качаем здесь.

      Будем считать, что вы уже скачали и установили. Проблем думаю не возникнет. Тем более в архиве с компонентом содержится подробная справка.

      Приступим непосредственно к разработке. Устанавливаем свойства компонентов:
      ExpandedWrap disabled
        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.
      ExpandedWrap disabled
        //Проверка на заполненность полей с 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. Это удачное соединение.
      ExpandedWrap disabled
        if ICQClient1.LoggedIn then //если соединение установлено
         begin
          Memo1.Lines.Add('Соединение с сервером установлено.'); //Добавляю в Memo1 строку о текущем положении
           Timer1.Enabled := True; //Включаю таймер
        end;

      Для провала при подключении используем следующий код и добавляем его в обработчик события OnConnectionFailed опять же для ICQClient1.
      ExpandedWrap disabled
        if not rec then Exit; //Если мы нажали на кнопку "Выход", то не нужно пытаться соединиться
          Memo1.Lines.Add('Не удалось соединиться с сервером.');
          if MessageDlg('Попытаться соединиться еще раз?',mtInformation,[mbOk,mbCancel],0) = mrOk
           then
             begin
               ICQClient1.Login();
            Memo1.Lines.Add('Соединение с сервером ICQ...');
        end;

      Для таймера используем следующий код:
      ExpandedWrap disabled
        ICQClient1.SendKeepAlive; //посылаем KeepAlive (Зачем? Описываль выше :))

      Далее для кнопки Button2 используем функцию разрыва связи с сервером:
      ExpandedWrap disabled
        if not ICQCLient1.LoggedIn then
        MessageDlg('Соединение с сервером не установлено!',mtInformation,[mbOk],0)
         else
          begin
           rec := False;
         ICQCLient1.Disconnect;
         Memo1.Lines.Add('Соединение с сервером оборвано.');
        Timer1.Enabled := False;
        end;

      А теперь непосредственно и "сердце" нашего бота. Даже не сердце а интелект. Сейчас мы его научим обрабатывать пришедшие сообщения. Для этого мы воспользуемся обработчиком события OnMessageRecv. Ничего сложного. Вот пример кода.
      ExpandedWrap disabled
        var
        icq: cardinal;
         begin
          icq := StrToInt(UIN);
          Memo1.Lines.Add(UIN + ': ' + Msg); //Добавляем полученное сообщение в Memo1
        if Msg="Привет" then
               ICQClient1.SendMessage(icq,'Привет'); //Отсылаем ответ, мол здравствуйте! Рады вас слышать!
          else
            ICQClient1.SendMessage(icq,'Извините, мне не о чем с Вами поговорить... :)');
        end;

      Вот так, друзья мои! Таким не сложным кодом можно создать собственного бота-болтуна и наделить его отличной разговорной базой! Но это уже скучная и рутинная работа. Желаю Вам творческих успехов, меньше ошибок и больше кода!
        хорошая статейка вот только одна проблема неверный дескриптор (6) возникает при закрытии
        где то поток глючит странно но в демушке с компонентом нет ошибки :wall:

        Добавлено
        автор забыл строчку добавить!!! в онкреате

        ExpandedWrap disabled
          procedure TForm1.FormCreate(Sender: TObject);
          begin
            ICQClient1:= TICQClient.Create(nil);
            ICQClient1.DisableDirectConnections:= True;//вот чего не хватало!!!!!!!!!!!
            ICQClient1.ICQServer:= 'login.icq.com';
            ICQClient1.ICQPort:= 5190;
          end;


        думаю это тоже не помешает ;)
        ExpandedWrap disabled
          procedure TForm1.FormDestroy(Sender: TObject);
          begin
            if Assigned(ICQClient1) then
            begin
              if ICQClient1.LoggedIn then ICQClient1.Disconnect;
              FreeAndNil(ICQClient1);
            end;
          end;

        :D :D :D :D :D :D :D :D
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0225 ]   [ 16 queries used ]   [ Generated: 19.03.24, 03:58 GMT ]