Развленичия
Консультация
Полезные ссылки
Категории раздела
Новое на форуме
  • Статистика
    Онлайн
    На сайте 1
    Гостей: 1
    Пользователей: 0

    Юзеры онлайн:
    Юзеры за сегодня:

    Зарег. на сайте

    Всего: 17517
    Новых за месяц: 7
    Новых за неделю: 3
    Новых вчера: 1
    Новых сегодня: 1

    Из них

    Администраторов: 1
    Модератор форума: 0
    Друзей: 5
    Обычных юзеров: 17500

    Из них

    Парней:
    Девушек:


    Пишем бота для Агента Mail.ru

    Дата: 23.03.2011
    Автор: Гром

    В этой статье я подробно расскажу, как написать своего бота для агента mail.ru на дельфи 7. Бот будет самообучающийся и автоматический.


    Что нам для этого нужно?
    1. Среда разработки Дельфи 7
    2. Компонент для работы с mrim протоколом (качаем здесь)

    Компонент для работы с mrim протоколом был мною доработан. Но всё же остались баги, которые я надеюсь исправить в ближайшем будущем. В любом случае этот компонент рабочий и настроен на существующую версию агента mail.ru

    Подготовка

    Устанавливаем компонент. Для этого распаковываем скачанный архив в любой каталог. Открываем Дельфи, выполняем  Tools->Environment options, выбираем вкладку Library и в поле Library path добавляем путь к каталогу с компонентом. Затем выбыраем Component->Install Component.. и в поле Unit file name прописываем путь к файлу client.pas, который находится в каталоге компонента. Жмём кнопку "Ок". В появившемся окне нажимаем Compile,  а затем Install.  Всё. Компонет установлен и появился у нас на вкладке Samples.

    Создаём новый проект. Выполняем File->New->application. Унас появилась пустая форма. Кидаем на неё наш компонент со вкладки Samples. Также кидаем на форму два Edit'а ,  два Label'а, два Memo и кнопку Button со вкладки Standart. Также кидаем TCPClient (вкладка Internet) - он нам нужен, чтобы узнавать адрес,  на который в последующем будет коннектиться клиент! Выбираем первый Label и в свойствах объекта в поле caption пишем "Логин". Аналогичнодля второго лейбла прописываем "Пароль". Выбираем кнопку, и в свойстве Caption пишем "Авторизация".  Затем выбираем первый edit и в свойстве name пишем EdLogin. Для второго Edit'а в свойстве name пишему EdPassword. Для обоих edit'ов в свойсте text убираем всё, что там написано, чтобы у нас остались чистые поля. Далее для первого memo в свойтве name пишем InMes, а для второго - OutMes. Для обоих memo в свойстве Lines очищаем всё, что написано. Давайте кинем на нашу форму ещё один edit, и в свойсте name пропишем EdAddress. И обязательно кладём на форму объект XP manifetst.  Далее расположим объкты на форме примерно как показанно на рисунке:


    Более маленькое memo - это OutMes, а большое соответственно InMes. 

    С визуализацией закончили. Теперь приступим к кодингу.

    Кодинг.

    Настраиваем пару свойств для TCPClient:

    RemoteHost:=mrim.mail.ru;
    RemotePort:=443;

    Настраиваем свойства для MailClient:

    MRIMHost:=mrim.mail.ru;
    MRIMPort:=443;
    SendMessageRecvOk:= true;
    Host:=mrim.mail.ru;
    Port:=443;

    Авторизация. Для начала нам надо авторизоваться на сервере. Для этого нам нужен логин и пароль на Mail.ru. Если у вас ещё нет там аккаунта, то нужно зарегистрироваться.

    Итак, первый Edit у нас будет для логина, а второй для пароля. По нажатию кнопки "Авторизация" у нас будет коннект с сервером и приниматься от него ответ.

    Давайте дважды клинем на кнопке "Авторизация". Дельфи сгенерирует для нас скелет процедуры нажатия кнопки, которая будет выглядеть так:

    procedure TForm1.Button1Click(Sender:TObject);
    begin

    end;

    Между Begin  и end мы разместим наш код коннекта.

    Вот как должна выглядеть наша процедура коннекта:

    procedure TForm1.Button1Click(Sender:TObject);
    var
         i: Integer;
         MrimS: string;
    begin
    mailclient1.Mail:=EdLogin.Text;
    mailclient1.PassWord:=EdPassword.Text;
         TCPClient1.Active:=True;
           if TCPClient1.Connected then
              MrimS:=TCPClient1.Receiveln(#$A);{Получилиадрес и порт}
                  TCPClient1.Disconnect;
         if MrimS <> '' then
            for i:=1 to Length(MrimS) do
                if MrimS[i] = ':' then
                    begin
                        MailClient1.Host:=Copy(MrimS, 0, i-1);
                       MailClient1.Port:=StrToInt(Copy(MrimS, i+1, Length(MrimS)-i));
                         break;
                    end;
         if MailClient1.HostInit then 
            begin
             MailClient1.Connect;  {Соединяемся}
            end
         else
            MailClient1.RequestHost;
     mailclient1.Status:=OnLine;
    end;


    Далее, если наступило соединение, обрабатываем событие у Mailclient. Для этого выбираем этот объект, в инспекторе объектов переходим на вкладку Events и дважды кликаем в поле OnConnect. Дельфи сгенерирует скелет процедуры. В ней пропишем следующий код:

    MailClient1.Hello;

    То есть при успешном соединении мы отсылаем серверу пакет Hello. Вот как будет выглядеть эта процедура:

    procedureTForm1.MailClient1Connect(Sender: TObject);
    begin
    MailClient1.Hello;
    end;

    Затем, если сервер принял у нас этот пакет, то проходим авторизацию. Для этого обрабатываем событие OnHello объекта MailClient. Для этого на вкладке Evenst инспектора объекта MailClient дважды кликаем на поле OnHello. Дельфи опять сгенерирует для нас скелет процедуры. напишем в ней процедуру авторизации. 

    procedure TForm1.MailClient1Hello(Sender:TObject);
    begin
    MailClient1.Authorize;
    end;

    И ещё один важнаый этап - это обработка события OnRequestHost. Если мы не будем обрабатывать этого события, то не сможем пройти авторизацию при нестабильном соединении.

    procedureTForm1.MailClient1RequestHost(Sender: TObject);
    begin
    MailClient1.Status := online;
    MailClient1.Connect;
    end;

    Если все прошло успешно, то подключение заканчивается загрузкой контакт листа. Для этого нам нужно будет обработать у MailClient событие OnEndRequestContactList. Мы не будем загружать контакт лист, а просто выведем сообщение об успешной авторизации:

    procedureTForm1.MailClient1EndRequestContactList(Sender: TObject);
    begin
    showmessage('Авторизацияпрошла успешно');
    end;

    Теперь запускаем наш проект, вводим логин (имя@домен.ru) и пароль и.... вуаля - появляется сообщение, что авторизация прошла успешно! 

    Для наглядной проверки вы можете запустить обычный агент с другой учётной записью, где используемый в нашей программе логин находится в списке контактов.

    И так, мы научились авторизовываться на сервере mail.ru. Но этого недостаточно. Нам нужно научится принимать и отправлять сообщения.

    Отправка сообщений. Для отправки сообщений у Mailclient есть процедура SendMessage, в которой в качесвте параметров передаётся адрес получателя и текст сообщения.

    Для инициализации отправки сообщения будем использовать нажатие клавиши Enter в нижнем memo. Выберем наш нижний memo, и во вкладке Events кликнем дважды на событии OnKeyDown (нажата клавиша). В сгенерированном скелете процедуры пропишем следующий код:

    procedure TForm1.OutMesKeyDown(Sender:TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if MailClient1.Connected  then //еслисоединение есть
     if (key = Vk_return) and (Outmes.text<>'')then  // иесли нажата клавиша Enter и в поле естьтекст
       begin
        {отсылаемсообщение}
        Mailclient1.SendMessage(EdAddress.text,Outmes.text );
        {Добавляемотправленное сообщение вверхний memo}
        InMes.Lines.Add('Я отправил '+datetimetostr(now)+ #13#10+OutMes.Text+ #13#10);
        {Очищаемнижний memo}
        Outmes.Clear ;
       end;
    end;

    Теперь запускаем наш проект, вводим логин и пароль, нажимаем "Авторизация" и ждём сообщение об успешной авторизации. Когда сообщение появится, закрываем его. Вводим адрес получателя, в нижнем memo пишем любой текст и нажимаем Enter. Наслаждаемся эффектом!!! Сообщение отправилось, дата, время и текст сообщения добавились в верний memo. А нижний memo очистился. Теперь мы научились отправлять сообщения!

    Получение сообщений.

    Здесь всё просто. Когда приходит новое сообщение, то срабатывает событие OnMessage объекта MailClient. Всё что нам нужно, это добавить входящее сообщение, а также адрес отправителя в верхний memo. В событии OnMessage адрес отправителя приходит в виде переменной From, а текст сообщения в виде переменной Text.

    Сгенерируем процедуру для этого события и пропишем следующий код:

    procedureTForm1.MailClient1Message(Sender: TObject; MsgID: Cardinal;From,
      Text: String; IsRTF: Boolean);
    begin
        InMes.Lines.Add('Мне прислали от ' +from+ ' '+ datetimetostr(now)+ #13#10+Text+ #13#10);
    end;

    Теперь запускаем проект, вводим логин, пароль, авторизуемся и с обычного агента шлём на этот адрес сообщение. Входящее сообщение появится в верхнем memo. Мы научились принимать сообщения!

    Но мы же пишем не клиента, а бота. Так? Так что нам нужно в программу добавить "автоматику". 

    Автоматический ответ и самообучение бота. Давайте создадим текстовой файл, в котором пропишем ответы для бота. Каждый ответ будет с новой строки. Так же научим нашего бота запоминать присланные ему фразы и использовать их в своих ответах.

    Итак. Создадим текстовой файл и назовём его Otvets.txt. В нём пропишем всего три строчки:
    Привет!
    Как дела?
    Что делаешь?

    Сохраняем этот файл в папке с программой.

    Теперь в процедуре MailClient1Message допишем сдедующий код:

    procedureTForm1.MailClient1Message(Sender: TObject; MsgID: Cardinal;From,
      Text: String; IsRTF: Boolean);
      var
      st: tstrings;
      s: string;
    begin
        InMes.Lines.Add('Мне прислали от' +from+ ' '+ datetimetostr(now)+ #13#10+Text+ #13#10);
        st:= tstringlist.Create ;
        if fileexists('Otvets.txt') then
         st.LoadFromFile('Otvets.txt');//загружаем файл с ответами
        s:=st[random(st.Count)];     //присваиваем переменной случайный ответ
        Mailclient1.SendMessage(from,s); //отправляем
        InMes.Lines.Add('Бот отправил ' +datetimetostr(now)+ #13#10+s+ #13#10);
        st.Add(text);  //добавляем присланный текст
        st.SaveToFile('Otvets.txt');  //сохраняем файл
        st.Free ;
    end;

    Выше приведённый код я прокомментировал по максимуму, поэтому вопросов у вас возникнуть не должно.

    Так же можно реализовать загрузку контактов, смену статусов, поиск, добавление и удаление контактов. Уведомлять что мы печатаем, узнавать, что нам печатают, отправлять смс и многое другое. Но в этой статье я уже рассказал достаточно. Будет время, напишу продолжение.

    Для того, чтобы узнать больше, задавайте вопросы на форуме.


    Автор урока: Андрей Гром.

    Разрешается перепечатывание материала с обязательной ссылкой на источник и извещением об этом автора


    Скачать исходник примера

    Мои программы ботов




    Похожие статьи:

    Просмотров: 9837
    Комментариев: 14
    0  
    Автор: Делфинист | 28.05.2013, 12:23
    У меня такая проблема:
    Скачал компонент для работы с mrim протоколом. У меня завозмущался Антивирус и я этот файл очистил. Пробую инсталировать делфи, и он пишет что project1 не найден и тут же выскакивает окошечко антивируса что project1 очищен т.к. это вирус. Я пробовал переустанавливать делфи, но это не помогает. Скажите пожалуйста что мне делать и как жить? Буду очень признателен и благодарен.
    0  
    Автор: Alik | 11.05.2013, 14:52
    kak zarabotat??
    0  
    Автор: Mattie | 10.10.2012, 07:02
    Play informative for me, Mr. inetrnet writer.
    +1  
    Автор: Николай | 18.08.2012, 00:56
    Говорит, что вирус это(
    0  
    Автор: Гром | 18.08.2012, 07:03
    Ага, Индюк как-то попал туда. Но это не вирус, а демонстрация вирусной технологии. Сам по себе этот вирус ничего не делает, просто заражает Делфи, и потом все скомпилированные программы тоже заражены. Просто удалите скомпилированный файл из архива, и всё
    0  
    Автор: 123st321 | 21.05.2012, 05:19
    теперь буду продавать слонов! good
    -1  
    Автор: Blayk | 15.05.2012, 18:26
    sad копееееееееееееееец ! я не чего не понимаю - я тупень angry посоветуйте пж прогу по проще для агента - хочу сделать квест а всё время самому писать сообщение 24 часа в сутки всем людям не вариант . cry
    0  
    Автор: Гром | 15.05.2012, 18:34
    Мне то кветы не загадывайте! Что именно хотите?
    +1  
    Автор: Qwert | 14.04.2012, 20:35
    Андрей,сделайте пожалуйсто урок по созданию флудера в агенте на mail.ru.
    Хочу поближе узнать отправку сообщений в Delphi.
    -1  
    Автор: Гром | 14.04.2012, 21:23
    В конце следующей недели напомните. Обязательно сделаю!
    -1  
    Автор: Spout | 19.03.2012, 11:20
    Классная вещь, жаль что с делфи не подружился, пишу на PHP Devel Studio.
    -1  
    Автор: таврий | 04.01.2012, 17:47
    ЖЖжфль под delphi 2010 компонент не работает(
    -1  
    Автор: LazyAlex | 23.06.2011, 18:36
    Спасибо!
    Презабавнейшая штука. smile
    -1  
    Автор: akapel | 04.06.2011, 22:09
    Гуд, спасибо за поддержку протокола=)
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
     
    Ваш логин: Ваш пароль: