Главная получена. Дальше будем логиниться в игру. Ввожу логин с паролем на сайте, смотрю результат в 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 сам работает с полученными куками, так что о них не стоит и беспокоиться.
Теперь передо мной стоит задача создать запрос для игры и подтвердить его.
Комментариев нет:
Отправить комментарий