Пишем гулялку на Delphi

Всем доброго дня :) Сегодня пишем сие занимательное приложение. Что такое гулялка? Это некий "оповещатель" или "информер" от какого-либо сайта. Т.е, допустим все браузеры у вас отключены, вы в полном инвизе. И если вам неожиданно кто-то написал сообщение на каком-либо сайте (в данном случае затрагиваю данный ресурс), то вылезет приятное на вид оповещение (в форме сообщения) с текстом "Внимание! Новое сообщение!" или что-то вроде этого. В общем погнали писать такую штуку.
Вступление.
Для начала нам надо понять, что посылается в POST-запросе к сайту, а если простым языком, то авторизироваться на данном сайте под сниффером. Я создам нового юзера, проведу пример, и после написания этой статьи юзер будет удалён за ненадобностью. Сказано - сделано:



Теперь выходим из профиля, открываем сниффер (в моём случае HTTP-analizer v6), нажимаем F9 или кнопку старт и снова авторизируемся в профиле:



Далее авторизация, и смотрим что получилось в сниффере:



Собственно гора get-ов нам нахрен не нужна, нас интересует только POST. Смотрим что же в нём передавалось:



Теперь следующая проблема - нам надо замаскироваться под браузер. Как это сделать? Так же передать некоторые параметры, какие - смотрим ниже:



Нужное, так-же подчёркнуто красным. Ничего не забыли? Тогда кодим.

Глава 1. Кодинг.

Форма:



Теперь укажем настроим компонент idHTTP так, что бы все думали и верили что мы ничто иное, как браузер:

В глобальных переменных:

var 
HTTP: TIdHTTP; //


В событии инициализации формы (Create):

HTTP:= TIdHTTP.Create; // Инициаллизируем переменную HTTP
HTTP:= IdHTTP1; // И привязываем её к компоненту IdHTTP1


В событии onclick кнопки "Авторизироваться":

with HTTP.Request do //Конструкция with .. do для подсвойств свойства Request у компонента idHTTP1
begin
  Host:= 'infrohack.ru'; 
  UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0';
  Referer:= 'http://infrohack.ru';
  ContentType:= 'application/x-www-form-urlencoded';
end;


Видим, что мы передали компоненту idHTTP1 свойства, которые были в сниффере. Теперь сайт будет думать и наивно полагать, что к нему подключается никто иной, как браузер.
Поехали дальше. А дальше составление обычного POST-запроса c данными так же из сниффера:

В глобальных переменных:

var 
listdata: TStringList;
Result: TStringList; 


В событии инициализации формы (Create):

listdata: TStringList.Create; // Инициализация StringList'а
Result: TStringList.Create; // Инициализация ещё 1-ого StringList'а :)


В событии onclick кнопки "Авторизироваться":

//POST
ListData.Add('login_name='+Edit1.Text);
ListData.Add('login_password='+Edit2.Text);
ListData.Add('login=submit');
Result.Text:= HTTP.Post('http://infrohack.ru/', listData);
//Проверка:
if pos('logout', Result.Text) <> 0 then ShowMessage('Авторизация успешна') else ShowMessage('Авторизация не удалась');
//POST


Объяснять что такое POST и как его посылать я не буду, я это уже делал. Теперь касательно проверки на успешную или не успешную авторизацию. К каждому более-ли-менее уважающему себя сайту она производится по-своему. Типичная проверка слова "logout", как в wordpress'е тут прошла, а значит не надо исследовать исходный код страницы до авторизации и после. Но иногда проверка по logout не идёт. HTTP - Analizer по какой-то странной причине ничерта не отображает, так что исследования надо производить из программы. После авторизации к исходному коду прибавляется огромное число блоков и строк, и просто выдернув любой постоянный участок кода можно произвести проверку. Код, напомню, идёт в переменную Result. Простите за этот кривой способ, но он наиболее нагляден и наиболее часто используется.

Так. Теперь едем далее. Собственно гулялка нам нужна для мониторинга каких-либо сообщений. Тут мы мониторить может только входящие. Как это сделать? На фантазию автора. Некоторые сайты, например, имеют заголовок вроде 'http://xxx.com/message/new/2'. Вот эта самая 2 и будет нас извещать о новом сообщении. Некоторые же сайты можно промониторить так же проверкой исходного кода, что мы и сделаем в данном случае:

В событии onclick кнопки "Авторизироваться":

if pos('с момента вашего отсутствия на сайте вам было прислано',Result.Text)<>0 then ShowMessage('Новое сообщение!');


Собственно, вот и всё. Теперь осталось лишь вывести сообщение из трея, о том, что нам пришло сообщение:
//Собственно говоря, тут я начил иметь секс, очень много секса. Компонент CoolTrayIcon, успешно работающий в Delphi 7, в XE отказывался работать начисто. Кидал ошибки о несовместимости типов и прочие. Суть нашлась в том, что в Delphi 7 многие параметры передавались в WideChar, а в Delphi XE нужно их приводить в AnsiChar. Затем выскакивало сообщение о неверных параметрах. В общем всё исправленно, вроде.. Начинаем работать .. и тут этот самый компонент начисто отказывается работать, выкидывая ошибки. Так что к чёртовой матери его послав, решил использовать стандартный TrayIcon.

События и свойства у него, которые нужно указать:

У события Click компонента TrayIcon:

form1.Show; // Вызов формы по клику на значёк трея
trayicon1.Visible:= false; // отключение значка трея


У события MouseMove (наведение мыши):

trayicon1.Hint:= 'infrohack - informer'; // Вызов оповещения "информер" при наведении на значёк трея


У события onclick кнопки turn (свернуть):

form1.Hide; // Сворачиваем форму
trayicon1.Visible:= true; // Показываем иконку в трее


Далее кидаем на форму таймер, ставим интервал в 10000 мс, и в событии OnTimer пишем:

Result.Text:= HTTP.Get('http://infrohack.ru');
if pos('с момента вашего отсутствия на сайте вам было прислано',Result.Text)<>0 then tray;


Отправляем обычный Get, результат же сохраняем в переменную Result типа TstringList. Затем ищем позицию данной фразы, и если она есть, то вызываем процедуру tray.
Код процедуры tray:

trayicon1.Visible:= true; //Показываем значёк
trayicon1.BalloonTitle:= 'infrohack'; //Заголовок сообщения
trayicon1.BalloonHint:= 'Новое сообщение!'; //Текст сообщения
trayicon1.ShowBalloonHint; //Вызов сообщения :)


Остаётся поставить иконку компоненту TrayIcon, и радоваться. Теперь заходим под тестовым юзером, и шлём сообщение (перед этим запустив программу):



Собственно на этом уже точно всё. Написали типичную гулялку.

Спасибо за внимание :)
Теги:
procedure, infrohack, Result, TStringList, TObject, Sender, Create, TForm1, сообщение, TIdHTTP, trayicon1, Теперь, Visible, событии, Собственно, сайте, login, кнопки, ListData, nclick
Добавлено: 24 Февраля 2015 20:49:48 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...