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