В этой статье я подробно расскажу, как написать своего бота для агента mail.ru на дельфи 7. Бот будет самообучающийся и автоматический.
Что нам для этого нужно?
- Среда разработки Дельфи 7
- Компонент для работы с 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);
beginMailClient1.Hello;
end;
Затем, если сервер принял у нас этот пакет, то проходим авторизацию. Для этого обрабатываем событие OnHello объекта MailClient. Для этого на вкладке Evenst инспектора объекта MailClient дважды кликаем на поле OnHello. Дельфи опять сгенерирует для нас скелет процедуры. напишем в ней процедуру авторизации.
procedure TForm1.MailClient1Hello(Sender:TObject);
beginMailClient1.Authorize;
end;
И ещё один важнаый этап - это обработка события OnRequestHost. Если мы не будем обрабатывать этого события, то не сможем пройти авторизацию при нестабильном соединении.
procedureTForm1.MailClient1RequestHost(Sender: TObject);
beginMailClient1.Status := online;
MailClient1.Connect;
end;
Если все прошло успешно, то подключение заканчивается загрузкой контакт листа. Для этого нам нужно будет обработать у MailClient событие OnEndRequestContactList. Мы не будем загружать контакт лист, а просто выведем сообщение об успешной авторизации:
procedureTForm1.MailClient1EndRequestContactList(Sender: TObject);
beginshowmessage('
Авторизацияпрошла успешно');
end;
Теперь запускаем наш проект, вводим логин (имя@домен.ru) и пароль и.... вуаля - появляется сообщение, что авторизация прошла успешно!
Для наглядной проверки вы можете запустить обычный агент с другой учётной записью, где используемый в нашей программе логин находится в списке контактов.
И так, мы научились авторизовываться на сервере mail.ru. Но этого недостаточно. Нам нужно научится принимать и отправлять сообщения.
Отправка сообщений. Для отправки сообщений у Mailclient есть процедура SendMessage, в которой в качесвте параметров передаётся адрес получателя и текст сообщения.
Для инициализации отправки сообщения будем использовать нажатие клавиши Enter в нижнем memo. Выберем наш нижний memo, и во вкладке Events кликнем дважды на событии OnKeyDown (нажата клавиша). В сгенерированном скелете процедуры пропишем следующий код:
procedure TForm1.OutMesKeyDown(Sender:TObject; var Key: Word;
Shift: TShiftState);
beginif 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;
Выше приведённый код я прокомментировал по максимуму, поэтому вопросов у вас возникнуть не должно.
Так же можно реализовать загрузку контактов, смену статусов, поиск, добавление и удаление контактов. Уведомлять что мы печатаем, узнавать, что нам печатают, отправлять смс и многое другое. Но в этой статье я уже рассказал достаточно. Будет время, напишу продолжение.
Для того, чтобы узнать больше, задавайте вопросы на форуме.
Автор урока: Андрей Гром.
Разрешается перепечатывание материала с обязательной ссылкой на источник и извещением об этом автора
Скачать исходник примераМои программы ботов