воскресенье, 28 марта 2010 г.

Злодеи войны и денег. Часть 1, глава 2 "Врата столицы"

Ворота стольного града забавно раскрашены в веселенькие цвета. Двумя метрами левее ворот выложена бойница караульного помещения. В этих землях не бывает ни дня, ни ночи, поэтому караул работает в 3 смены и готов принимать посетителей когда-угодно. Странная особенность: стражники глуховаты. Непонятно, с рождения это у них, или в караульную службу ссылают только контуженных на поле брани, но имя и номер пропуска приходится произносить громко и внятно. Недалеко от караульного помещения вижу воровку Еву. Эта девушка часто появляется возле таких вот полисов, где начальники гарнизонов ссылают инвалидов в караулку. После встречи с ней не стоит удивляться, что на вашем банковском счете пропали деньги, или что о вас по городу ходят слухи, как о пьянице и дебошире.



Главная получена. Дальше будем логиниться в игру. Ввожу логин с паролем на сайте, смотрю результат в HTTP Analyzer’e:



В отличие от случая, когда я получал главную страничку с помощью метода GET, здесь используется метод POST. Он отличается от GET метода тем, что пользовательские параметры передаются в теле запроса, а не в URI.

Кроме того. В ответе есть строки Set-Cookie, которые говорят нам, что надо сохранить в куках идентификатор сесии и идентификатор игрока. Их, видимо, придется использовать далее при навигации по сайту.

Надо, значит, писать функцию для POST запроса. Она будет отправлять запрос для необходимой страницы с заданными параметрами и сохранять принятые данные в буфер, выделенный вызывающей функцией. Прототип функции будет выглядеть так:
ProcessPOSTRequest(HINTERNET session, char* buffer, WCHAR* siteobject, char* params)

Создаю запрос методом HttpOpenRequest, аналогично методу GET, но второй параметр (lpszVerb) будет “POST” вместо “GET”.

В HttpSendRequestA уже используются все параметры:

HttpSendRequestA(
request,//дескриптор запроса
hdrs, //заголовок
strlen(hdrs), //длина заголовка
params,//параметры
strlen(params))//длина параметров

hdrs, или заголовок устанавливаю Content-Type: application/x-www-form-urlencoded. Это используется в оригинальном запросе и используется для отправки данных формы, в то время, как multipart/form-data используется, в основном, для отправки файлов.
Теперь разбираю параметры:
LOGIN_redirect – судя-по всему означает, что я буду перенаправлен на свою домашнюю страницу, после того как залогинюсь.
login, pass – тут все понятно.
lreseted – непонятно, смотрю исходник страницы


input type="hidden" name="lreseted" value="0"
input name="pass" class="inp_pass" type="password" maxlength="20" title="Пароль в игре" value="12345678901234567890" onfocus="clearPassw();"
function clearLogin()
{
if (log.lreseted.value == 0)
{
log.login.value= '';
log.lreseted.value = 1;
}
}

То есть, когда поле с логином оказывается в фокусе, то он сбрасывается, а в переменную lreseted заносится единичка.

preseted – то же самое, что и lreseted, только с паролем.
lbut.x, lbut.y – координаты, по которым была нажата кнопка логина.

Я, честно говоря слабо могу представить, зачем нужны последние 4 параметра, поэтому лучше сделаю их случайными:


lreseted = rand()%1;// 0 или 1
preseted = rand()%1;// 0 или 1
lbut_x = rand()%59 + 20; //от 20 до 79
lbut_y = rand()%13 + 5; //от 5 до 18

формирую строку параметров:


sprintf(logindata,“LOGIN_redirect=1&login=%s&pass=%s&
lreseted=%d,preseted=%d&
lbut.x=%d&lbut.y=%d”,login,
password,lreseted,preseted,lbut_x,lbut_y);


Вызываю функцию ProcessPOSTRequest с параметрами ("/login.php",logindata), и получаю страничку своего персонажа в буфере.
Теперь пробую зайти в таверну. Для этого вызываю
ProcessGetRequest(session,data,L"/tavern.php");
И, судя по полученному буферу - я в таверне! Умный WinInet сам работает с полученными куками, так что о них не стоит и беспокоиться.

Теперь передо мной стоит задача создать запрос для игры и подтвердить его.

Комментариев нет:

Отправить комментарий