Добрый день всем! Пишу небольшой скриптик для игры Grepolis. Встала проблема: нужно написать Post запрос, с параметрами проблем нет, а вот адрес, куда его отправлять меняется после каждой авторизации. Нашел в коде страницы эту злополучную изменяемую строчку, но она находится в JavaScript вот она - Game.csrfToken = '1c2eee30bf5' - знакома кому-нибудь? Я так понимаю, что мне нужно ввести какую-то переменную для этого значения, но как это сделать не знаю... Помогите плиз!!!
Снифал 1000 раз, ничего найти не могу... В заголовках так и не разобрался... В строке запроса следующие данные: action claim_info town_id 51543 h 72c70bff828 json {"id":"19413","town_id":"51543","nlreq_id":12885879 } _ 1339952182421 Проблема в том, что при каждой авторизации значения параметров h, nlreq_id и _ постоянно меняются... Нашел в коде страницы: Game.csrfToken = '1c2eee30bf5'; - параметр H (строчка в Java Script) nlreq_id - нет в коде страницы Game.server_time = '1339993087'; - параметр _ (строчка в Java Script) вообще постоянно меняется Вы бы не могли глянуть? Тестовый аккаунт: Логин: Tartang Pass: 7TXzMQvUZt3qUqh ru.grepolis.com Уже вторую неделю бьюсь... Не могу понять откуда брать значение h, а оно необходимо, потому что добавляется в конец адреса URL, куда шлются все запросы...
Ты же сам говоришь, что h берется из Game.csrfToken = '1c2eee30bf5' - вот и бери его. А nlreq это просто дата, так называемый unix timestamp, его можно просто функцией time() генерировать.
>Нашел в коде страницы: >Game.csrfToken = '1c2eee30bf5'; - параметр H (строчка в Java Script) Ну вот раз в коде он генерируется его регулярным выражением и нужно вытягивать. То есть перед пост запросом сначала загрузи себе в string код страницы и выдирай каждый раз этот код. Второй параметр как сказано выше это unix timestamp
скачиваешь страницу $page = get('http://site/script?var=bla'); preg_match("/Game\.csrfToken = '(.*?)'/", $page, $token); вытаскиваем токен и сохраняем его в переменной $token[1]; echo $token[1];
Как это сделать? Вытягивать весь код или ту строку где нужное мне значение? Можно ли это сделать при помощи preg_match()?
Куда же это вставить? И как потом использовать? $page = get('http://ru11.grepolis.com/game/index?login=1') //preg_match("/Game\.csrfToken = '(.*?)'/", $page, $token); //echo $token[1]; Вот код: <?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'; //$urlTo_City = 'http://ru11.grepolis.com/game/farm_town_info?action=claim_load&town_id=51543&h=5ab1cc29351'; $name = 'Tartang'; // Логин $password = '7TXzMQvUZt3qUqh'; // Пароль define('ROOT', dirname(__FILE__).'/'); // задаем константу для хранения куков $cookie_filename = ROOT . uniqid(md5(time()), true).'.tmp'; // Сам файл куков // Настройка курла $curl = curl_init(); //curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1:9050"); 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); //$page = get('http://ru11.grepolis.com/game/index?login=1') //preg_match("/Game\.csrfToken = '(.*?)'/", $page, $token); //echo $token[1]; curl_close($curl); // Завершаем сеанс print_r ( $html ); ?>
Похоже тут стоит защита CSRF. Функцией get_headers() или тем же curl получаем куки, оттуда парсим токен. Следующий запрос делаем с теми же куками и подставленным токеном. Советую использовать тег [ PHP][ /PHP] для отправки кода.
мда.. 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_POST, 1); curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest')); 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=&password=', $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];
Я специально завел тестовый аккаунт... Блин, теперь я окончательно запутался... 4 мучающих меня вопроса: 1. Авторизация у меня проходила успешно. Дальше я думал просто брать значения из кода страницы, так не получится? 2. В коде Slider Game\.csrfToken = это значение берется из кука? Я два дня все куки пересматривал, так там ничего и не нашел... 3. Как прочитать эту строку? $ans = requester('http://ru11.grepolis.com/game/index?login=1', 0, $cook, 1, 0); Отправляем Post запрос через функцию requester, а как прочитать 0, $cook, 1, 0 ??? 4. Нижняя строка, как я понимаю, и есть нужный мне параметр, а вот что выше... Что это означает?
>1. Авторизация у меня проходила успешно. Я сомневаюсь, что авторизация у тебя вообще проходила. >Дальше я думал просто брать значения из кода страницы, так не получится? Так и нужно делать.. > 2. В коде Slider ... Значение берётся из контента страницы после входа в игру. Ответ сохраняется в переменной $ans PHP: $ans = requester('http://ru11.grepolis.com/game/index?login=1', 0, $cook, 1, 0); Поcле, переменная $ans парсится PHP: preg_match("#Game\.csrfToken = '(\S+)'#", $ans, $token); и значение твоего токена помещается в массив $token > 3. Как прочитать эту строку? Контент сохранён в переменной, просто выведи ее PHP: print $ans; 4. >а вот что выше... Что это означает? php ругается на несуществующею переменную Удали эту строчку: PHP: curl_setopt($ch, CURLOPT_STDERR, $f); P.S: TC, советую тебе изучить\понять работу ООП и регулярных выражений, жизнь станет интересней..
Спасибо за помощь... Вроде бы разобрался... Буду дальше копаться. Я с год назад прочитал пару книжек про PHP, но потом времени не было попрактиковаться... А сейчас нужна именно практика, но и литературу буду почитывать...
Еще один вопросик...) Для чего эта строка curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-SLIDER-WITH: b00zy-njasha')); Особенно интересует b00zy-njasha...