Хочу попрактиковаться в Curl, заодно нужно произвести авторизацию на сайте ru.grepolis.com.
Сниффил форму входа, но там такой кошмар... Куча редиректов, еще и игровой мир выбрать нужно... В общем разобраться не смог. Кому не трудно, напишите код или хотя бы начало, чтобы я мог задать интересующие меня вопросы.
Если я увижу код авторизации, мне будет легче понять его суть...
Заранее ОГРОМНОЕ СПАСИБО!
P.s. Пишу тестовый Логин и пароль:
Логин: Tartang
Pass: 7TXzMQvUZt3qUqh
Спустя 3 часа, 52 секунды (13.06.2012 - 13:02) Winston написал(а):
Спустя 2 часа, 6 минут, 8 секунд (13.06.2012 - 15:08) ArtemKrass написал(а):
Я уже читал этот пост, проделывал все как там описано...
На Letibit и mail успешно авторизуюсь. Но тут частный случай.
Единственное не могу понять как формируются POST данные.
На летибит: $post = 'act=login&login=' . $login . '&password=' . $pass;
На mail: $post = 'Login=' . $login . '&Domain=' . $domain . '&Password=' . $pass;
Можно поподробнее разобрать этот момент? Как читать эти строки?
И что делать, если Post Data выглядит так:
Json {"name":"Tartang","password":"7TXzMQvUZt3qUqh","password hash":"","autologin":false}
Как сформировать Post данные?
На Letibit и mail успешно авторизуюсь. Но тут частный случай.
Единственное не могу понять как формируются POST данные.
На летибит: $post = 'act=login&login=' . $login . '&password=' . $pass;
На mail: $post = 'Login=' . $login . '&Domain=' . $domain . '&Password=' . $pass;
Можно поподробнее разобрать этот момент? Как читать эти строки?
И что делать, если Post Data выглядит так:
Json {"name":"Tartang","password":"7TXzMQvUZt3qUqh","password hash":"","autologin":false}
Как сформировать Post данные?
Спустя 21 час, 57 минут, 17 секунд (14.06.2012 - 13:06) ArtemKrass написал(а):
Укажите на ошибки ПЛЗ...
Выводит вот что:
![user posted image](http://s018.radikal.ru/i521/1206/5b/e9354640cd8bt.jpg)
Что нужно делать с passwordhash и autologin???
И почему не сохраняет куки?
<?php
header('Content-Type: text/html; utf-8; charset=UTF-8');
$url = 'http://ru.grepolis.com'; // Куда зайти
$urlTo = 'http://ru.grepolis.com/start/index?action=login_from_start_page'; // Куда данные послать
$name = 'Tartang'; // Логин
$password = '7TXzMQvUZt3qUqh'; // Пароль
$passwordhash = '';
$autologin = 'false';
$post = 'name=' . $name . '&Password=' . $password . '&passwordhash=' . $passwordhash . '&autologin=' . $autologin; // POST данные
$ch = curl_init(); // Инициализация сеанса
curl_setopt($ch, CURLOPT_URL, $url); // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Приказываем вернуть страницу в переменную
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Записываем cookies в файл, чтобы потом можно было их считать
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Теперь читаем cookies с файла
$html = curl_exec($ch); // Забираем страницу
curl_setopt($ch, CURLOPT_URL, $urlTo); // Куда шлем POST данные
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Записываем cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Читаем cookies
curl_setopt($ch, CURLOPT_POST, true); // Указываем метод отправки
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // POST данные
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Говорим скрипту, чтобы он следовал за редиректами которые происходят во время авторизации
$html = curl_exec($ch); // Забираем страницу
curl_close($ch); // Завершаем сеанс
echo $html;
?>
Выводит вот что:
![user posted image](http://s018.radikal.ru/i521/1206/5b/e9354640cd8bt.jpg)
Что нужно делать с passwordhash и autologin???
И почему не сохраняет куки?
Спустя 18 часов, 54 минуты, 33 секунды (15.06.2012 - 08:00) ArtemKrass написал(а):
Проблема так и не решена... Третий день мучаюсь. Help Me!!!
Спустя 11 часов, 46 минут, 32 секунды (15.06.2012 - 19:47) walerus написал(а):
<?php
//отправляем заголовки о том что низя нас кэшировать
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Content-Type: text/html; charset=utf-8");
header("Pragma: no-cache");
error_reporting( E_ALL );
$url = 'http://ru.grepolis.com';
$urlTo_start_page = 'http://ru.grepolis.com/start/index?action=login_from_start_page';
$urlTo_start_page_next = 'http://ru.grepolis.com/start/index?action=fetch_news';
$urlTo_login_to_game = 'http://ru.grepolis.com/start?action=login_to_game_world';
$name = 'Tartang'; // Логин
$password = '7TXzMQvUZt3qUqh'; // Пароль
define('ROOT', dirname(__FILE__).'/');
$cookie_filename = ROOT . uniqid(md5(time()), true).'.tmp';
// Настройка курла
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 30 );
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1');
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_REFERER, 'http://google.com' );
curl_setopt($curl, CURLOPT_URL, $url);
$html = curl_exec($curl); // Запускаем курл, что бы получить куки
$post = 'json={"name":"' . $name . '","password":"' . $password . '","passwordhash":"","autologin":false}';
curl_setopt($curl, CURLOPT_URL, $urlTo_start_page);
curl_setopt($curl, CURLOPT_REFERER, $url );
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($curl);
$post = 'json={}';
curl_setopt($curl, CURLOPT_URL, $urlTo_start_page_next);
curl_setopt($curl, CURLOPT_REFERER, $urlTo_start_page );
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($curl);
$post = 'world=ru11&facebook_session=&facebook_login=&gift_key=portal_sid=name=' . $name . '&password=' . $password;
curl_setopt($curl, CURLOPT_URL, $urlTo_login_to_game );
curl_setopt($curl, CURLOPT_REFERER, $urlTo_start_page_next );
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($curl);
curl_close($curl); // Завершаем сеанс
print_r ( $html );
?>
Пользуйся.
Спустя 19 минут, 33 секунды (15.06.2012 - 20:06) ArtemKrass написал(а):
Спасибо огромнейшее!!! Все работает. Жаль пока не могу плюсик поставить, постов не достаточно!
Теперь буду подробно разбирать код... Еще много для меня непонятного...
Например откуда взято это:
Теперь буду подробно разбирать код... Еще много для меня непонятного...
Например откуда взято это:
Цитата |
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); |
У меня в снифере нет таких строк
и обязательно ли это?
Спустя 26 минут, 12 секунд (15.06.2012 - 20:33) Fr05t1k написал(а):
Цитата (ArtemKrass @ 15.06.2012 - 17:06) | ||
Спасибо огромнейшее!!! Все работает. Жаль пока не могу плюсик поставить, постов не достаточно! Теперь буду подробно разбирать код... Еще много для меня непонятного... Например откуда взято это:
У меня в снифере нет таких строк и обязательно ли это? |
Способ избавления от кэшэй)
Спустя 13 часов, 11 минут, 36 секунд (16.06.2012 - 09:44) ArtemKrass написал(а):
Цитата |
Способ избавления от кэшэй) |
В каких случаях используется?
Спустя 8 часов, 29 минут, 33 секунды (16.06.2012 - 18:14) walerus написал(а):
ArtemKrass Желательно во всех, что бы тебя не кешировали )
Спустя 1 день, 1 час, 49 минут, 10 секунд (17.06.2012 - 20:03) ArtemKrass написал(а):
Вроде бы разобрал весь код, с помощью Google и осмысления все стало понятно...
Добавил Proxy, все работает...
Теперь новая проблема
Далее, как показывает сниффер, мне нужно отправить Get запрос:
В строке запроса следующие данные:
action claim_info
town_id 51543
h 72c70bff828
json {"id":"19413","town_id":"51543","nlreq_id":12885879 }
_ 1339952182421
Проблема в том, что при каждой авторизации значения параметров h, nlreq_id и _ постоянно меняются...
Как быть в такой ситуации? Откуда подставлять эти значения?
Добавил Proxy, все работает...
Теперь новая проблема
Далее, как показывает сниффер, мне нужно отправить Get запрос:
В строке запроса следующие данные:
action claim_info
town_id 51543
h 72c70bff828
json {"id":"19413","town_id":"51543","nlreq_id":12885879 }
_ 1339952182421
Проблема в том, что при каждой авторизации значения параметров h, nlreq_id и _ постоянно меняются...
Как быть в такой ситуации? Откуда подставлять эти значения?
Спустя 3 часа, 6 минут, 44 секунды (17.06.2012 - 23:10) walerus написал(а):
ArtemKrass ищи в коде страницы, должны быть эти значения.
Спустя 8 часов, 31 минута, 6 секунд (18.06.2012 - 07:41) ArtemKrass написал(а):
Нашел:
Game.csrfToken = '1c2eee30bf5'; - параметр H (строчка в Java Script)
nlreq_id - нет в коде страницы
Game.server_time = '1339993087'; - параметр _ (строчка в Java Script) вообще постоянно меняется
Можно ли без этих параметров посылать запрос и будет ли результат? Если нет, то как выйти из данной ситуации?
Game.csrfToken = '1c2eee30bf5'; - параметр H (строчка в Java Script)
nlreq_id - нет в коде страницы
Game.server_time = '1339993087'; - параметр _ (строчка в Java Script) вообще постоянно меняется
Можно ли без этих параметров посылать запрос и будет ли результат? Если нет, то как выйти из данной ситуации?
Спустя 1 день, 2 часа, 58 минут, 45 секунд (19.06.2012 - 10:39) ArtemKrass написал(а):
После авторизации, выполняется Get запрос на http://ru11.grepolis.com/cache/js/jquery-1.7.1.min.js
Там могут быть нужные мне значения? Как их подставлять в мой код?
Там могут быть нужные мне значения? Как их подставлять в мой код?
Спустя 1 день, 3 часа, 44 минуты, 38 секунд (20.06.2012 - 14:24) ArtemKrass написал(а):
Можно ли через
$page = get('http://ru11.grepolis.com/game/index?login=1');
получить код страницы?
Куда это нужно вставить? Как проверить, приходит ли код страницы?
$page = get('http://ru11.grepolis.com/game/index?login=1');
получить код страницы?
Куда это нужно вставить? Как проверить, приходит ли код страницы?
Спустя 5 дней, 20 часов, 5 минут, 40 секунд (26.06.2012 - 10:30) ArtemKrass написал(а):
Вот родили общими усилиями:
Есть два момента, в которых я не могу разобраться:
1. Нужно сгенерировать nlreq_id и его подставлять, а я использую значение 0. Все работает, но я думаю что без этого значения скрипт быстро вычислится...
2. Почему мы при парсинге выводим значение в переменную $token...
А при дальнейшем использовании пишем $token["1"]...
Вычитал что это массив, но почему? Читал о preg_match, но в мануале про массив ничего нет
<?php
function requester($url, $post = 0, $cookies = '', $head = 1, $body = 0)
{
$cl = curl_init();
curl_setopt($cl, CURLOPT_URL, $url);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl, CURLOPT_HEADER, $head);
curl_setopt($cl, CURLOPT_COOKIE, $cookies);
curl_setopt($cl, CURLOPT_NOBODY, $body);
if ($post){
curl_setopt($cl, CURLOPT_PROXY, "127.0.0.1:9050");
curl_setopt($cl, CURLOPT_POST, 1);
curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest')); //иммитируем AJAX запрос
//curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-SLIDER-WITH: b00zy-njasha'));
curl_setopt($cl, CURLOPT_POSTFIELDS, $post);
}
//curl_setopt($ch, CURLOPT_STDERR, $f); //Файл, в который будут выводиться сообщения об ошибках
$line = curl_exec($cl);
curl_close($cl);
return $line;
}
$login = 'Tartang';
$password = '7TXzMQvUZt3qUqh';
//get session [grepolis.com]
preg_match_all('#Set-Cookie: (\S+;)#i', requester('http://ru.grepolis.com/start/index?action=login_from_start_page', 'json={"name":"'.$login. '","password":"'.$password.'","passwordhash":"","autologin":false}', 0, 1, 0), $co);
$cook = implode('', $co[1]);
//get url ans sess [ru11.grepolis.com]
preg_match('#Location: (\S+)\r\n#i', requester('http://ru.grepolis.com/start?action=login_to_game_world', 'world=ru11&facebook_session=&facebook_login=&gift_key=&portal_sid=&name=&pa ssword=', $cook, 1, 0), $urls);
preg_match_all('#Set-Cookie: (\S+;)#i', requester($urls[1], 0, 0, 1, 0), $co);
$cook = implode(' ', $co[1]);
//join to game
$ans = requester('http://ru11.grepolis.com/game/index?login=1', 0, $cook, 1, 0);
// other thash and stuff
preg_match("#Game\.csrfToken = '(\S+)'#", $ans, $token);
//print $token[1];
requester ('http://ru11.grepolis.com/game/farm_town_info?action=claim_load&town_id=51543&h=' .$token["1"], 'json={"target_id":"19413","claim_type":"normal","time: 300,"town_id":"51543","nlreq_id":0}' , $cook, 1 , 0);
sleep(rand(5,20));
requester ('http://ru11.grepolis.com/game/farm_town_info?action=claim_load&town_id=51543&h=' .$token["1"], 'json={"target_id":"19410","claim_type":"normal","time":300,"town_id":"51543","nlreq_id":0}' , $cook, 1 , 0);
?>
Есть два момента, в которых я не могу разобраться:
1. Нужно сгенерировать nlreq_id и его подставлять, а я использую значение 0. Все работает, но я думаю что без этого значения скрипт быстро вычислится...
2. Почему мы при парсинге выводим значение в переменную $token...
А при дальнейшем использовании пишем $token["1"]...
Вычитал что это массив, но почему? Читал о preg_match, но в мануале про массив ничего нет
Спустя 2 дня, 5 часов, 21 минута, 27 секунд (28.06.2012 - 15:51) ArtemKrass написал(а):
После долгих мучений получилось вот что:
Скрипт успешно проработал неделю... А сегодня перестал получать переменную token.
Посмотрел в коде страницы, ничего вроде не изменилось. Снова проснифил все переходы, вроде все по старому... А скрипт не работает... Взгляните кто-нибудь свежим взглядом, пожалуйста...
PS на других акках работает без проблем...
<?php
ini_set("max_execution_time", "700");
function requester($url, $post = 0, $cookies = '', $head = 1, $body = 0)
{
$cl = curl_init();
curl_setopt($cl, CURLOPT_URL, $url);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl, CURLOPT_HEADER, $head);
curl_setopt($cl, CURLOPT_COOKIE, $cookies);
curl_setopt($cl, CURLOPT_NOBODY, $body);
if ($post){
//curl_setopt($cl, CURLOPT_PROXY, "127.0.0.1:9050");
curl_setopt($cl, CURLOPT_POST, 1);
curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest')); //иммитируем AJAX запрос
//curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-SLIDER-WITH: b00zy-njasha'));
curl_setopt($cl, CURLOPT_POSTFIELDS, $post);
}
//curl_setopt($ch, CURLOPT_STDERR, $f); //Файл, в который будут выводиться сообщения об ошибках
$line = curl_exec($cl);
curl_close($cl);
return $line;
}
$login = ('Tartang');
$password = '7TXzMQvUZt3qUqh';
//get session [grepolis.com]
preg_match_all('#Set-Cookie: (\S+;)#i', requester('http://ru.grepolis.com/start/index?action=login_from_start_page', 'json={"name":"'.$login.'","password":"'.$password.'","passwordhash":"","autologin":false}', 0, 1, 0), $co);
$cook = implode('', $co[1]);
//get url ans sess [ru11.grepolis.com]
preg_match('#Location: (\S+)\r\n#i', requester('http://ru.grepolis.com/start?action=login_to_game_world', 'world=ru1&facebook_session=&facebook_login=&gift_key=&portal_sid=&name=&pas sword=', $cook, 1, 0), $urls);
preg_match_all('#Set-Cookie: (\S+;)#i', requester($urls[1], 0, 0, 1, 0), $co);
$cook = implode(' ', $co[1]);
//join to game
$ans = requester('http://ru11.grepolis.com/game/index?login=1', 0, $cook, 1, 0);
// other thash and stuff
preg_match("#Game\.csrfToken = '(\S+)'#", $ans, $token);
print $token[1];
/* requester ('http://ru11.grepolis.com/game/farm_town_info?action=claim_load&town_id=51543&h='.$ token["1"], 'json={"target_id":"19413","claim_type":"normal","time& quot;:300,"town_id":"51543","nlreq_id":0}' , $cook, 1 , 0);
sleep(rand(5,20));
requester ('http://ru11.grepolis.com/game/farm_town_info?action=claim_load&town_id=51543&h='.$ token["1"], 'json={"target_id":"19410","claim_type":"normal","time":300,"town_id":"51543","nlreq_id":0}' , $cook, 1 , 0);
*/
?>
Скрипт успешно проработал неделю... А сегодня перестал получать переменную token.
Посмотрел в коде страницы, ничего вроде не изменилось. Снова проснифил все переходы, вроде все по старому... А скрипт не работает... Взгляните кто-нибудь свежим взглядом, пожалуйста...
PS на других акках работает без проблем...