Curl. Один запрос, а URL разные

Discussion in 'PHP' started by Seganapa, 19 Jun 2012.

  1. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Добрый день всем!
    Пишу небольшой скриптик для игры Grepolis.
    Встала проблема: нужно написать Post запрос, с параметрами проблем нет, а вот адрес, куда его отправлять меняется после каждой авторизации. Нашел в коде страницы эту злополучную изменяемую строчку, но она находится в JavaScript
    вот она - Game.csrfToken = '1c2eee30bf5' - знакома кому-нибудь?

    Я так понимаю, что мне нужно ввести какую-то переменную для этого значения, но как это сделать не знаю... Помогите плиз!!!
     
  2. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    проснифай заголовки и посмотри что и куда отправляется
     
  3. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Снифал 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, куда шлются все запросы...
     
    #3 Seganapa, 20 Jun 2012
    Last edited: 20 Jun 2012
  4. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    Ты же сам говоришь, что h берется из Game.csrfToken = '1c2eee30bf5' - вот и бери его. А nlreq это просто дата, так называемый unix timestamp, его можно просто функцией time() генерировать.
     
  5. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Я не знаю как его оттуда брать... Где про это почитать или как сделать???
     
  6. C.php

    C.php New Member

    Joined:
    18 Jun 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    >Нашел в коде страницы:

    >Game.csrfToken = '1c2eee30bf5'; - параметр H (строчка в Java Script)

    Ну вот раз в коде он генерируется его регулярным выражением и нужно вытягивать.
    То есть перед пост запросом сначала загрузи себе в string код страницы и выдирай каждый раз этот код.

    Второй параметр как сказано выше это unix timestamp
     
  7. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    скачиваешь страницу
    $page = get('http://site/script?var=bla');

    preg_match("/Game\.csrfToken = '(.*?)'/", $page, $token);
    вытаскиваем токен и сохраняем его в переменной $token[1];
    echo $token[1];
     
  8. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Как это сделать? Вытягивать весь код или ту строку где нужное мне значение? Можно ли это сделать при помощи preg_match()?
     
    #8 Seganapa, 20 Jun 2012
    Last edited: 20 Jun 2012
  9. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    не имеет значения
     
  10. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Куда же это вставить? И как потом использовать?

    $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 );
    ?>
     
    #10 Seganapa, 20 Jun 2012
    Last edited: 20 Jun 2012
  11. daniel777

    daniel777 Elder - Старейшина

    Joined:
    8 Jul 2010
    Messages:
    517
    Likes Received:
    90
    Reputations:
    37
    Похоже тут стоит защита CSRF.
    Функцией get_headers() или тем же curl получаем куки, оттуда парсим токен.
    Следующий запрос делаем с теми же куками и подставленным токеном.

    Советую использовать тег [ PHP][ /PHP] для отправки кода.
     
  12. Darth Padla

    Darth Padla Member

    Joined:
    21 Jun 2010
    Messages:
    141
    Likes Received:
    25
    Reputations:
    8
    Зря спалил логин-пароль
     
  13. slider

    slider Reservists Of Antichat

    Joined:
    4 Sep 2005
    Messages:
    501
    Likes Received:
    711
    Reputations:
    748
    мда..

    PHP:
    function requester($url$post 0$cookies ''$head 1$body 0)
    {
          
    $cl curl_init();
          
    curl_setopt($clCURLOPT_URL$url);
          
    curl_setopt($clCURLOPT_RETURNTRANSFER1);
          
    curl_setopt($clCURLOPT_HEADER$head);
          
    curl_setopt($clCURLOPT_COOKIE$cookies);
          
    curl_setopt($clCURLOPT_NOBODY$body);
          if (
    $post){
              
    curl_setopt($clCURLOPT_POST1);
              
    curl_setopt($clCURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest')); 
              
    curl_setopt($clCURLOPT_HTTPHEADER, array('X-SLIDER-WITH: b00zy-njasha')); 
              
    curl_setopt($clCURLOPT_POSTFIELDS$post);
          }
          
    curl_setopt($chCURLOPT_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}'010), $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='$cook10), $urls);
    preg_match_all('#Set-Cookie: (\S+;)#i'requester($urls[1], 0010), $co);
    $cook implode(' '$co[1]);

    //join to game
    $ans requester('http://ru11.grepolis.com/game/index?login=1'0$cook10);

    // other thash and stuff
    preg_match("#Game\.csrfToken = '(\S+)'#"$ans$token);
    print 
    $token[1];
     
    #13 slider, 21 Jun 2012
    Last edited: 21 Jun 2012
  14. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Я специально завел тестовый аккаунт...

    Блин, теперь я окончательно запутался... 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. [​IMG]
    Нижняя строка, как я понимаю, и есть нужный мне параметр, а вот что выше... Что это означает?
     
    #14 Seganapa, 21 Jun 2012
    Last edited: 21 Jun 2012
  15. slider

    slider Reservists Of Antichat

    Joined:
    4 Sep 2005
    Messages:
    501
    Likes Received:
    711
    Reputations:
    748
    >1. Авторизация у меня проходила успешно.
    Я сомневаюсь, что авторизация у тебя вообще проходила.
    >Дальше я думал просто брать значения из кода страницы, так не получится?
    Так и нужно делать..

    > 2. В коде Slider ...
    Значение берётся из контента страницы после входа в игру. Ответ сохраняется в переменной $ans
    PHP:
    $ans requester('http://ru11.grepolis.com/game/index?login=1'0$cook10);
    Поcле, переменная $ans парсится
    PHP:
    preg_match("#Game\.csrfToken = '(\S+)'#"$ans$token);
    и значение твоего токена помещается в массив $token

    > 3. Как прочитать эту строку?
    Контент сохранён в переменной, просто выведи ее
    PHP:
    print $ans;
    4. >а вот что выше... Что это означает?
    php ругается на несуществующею переменную
    Удали эту строчку:

    PHP:
    curl_setopt($chCURLOPT_STDERR$f); 
    P.S: TC, советую тебе изучить\понять работу ООП и регулярных выражений, жизнь станет интересней..
     
  16. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Спасибо за помощь... Вроде бы разобрался... Буду дальше копаться.

    Я с год назад прочитал пару книжек про PHP, но потом времени не было попрактиковаться... А сейчас нужна именно практика, но и литературу буду почитывать...
     
  17. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Еще один вопросик...)
    Для чего эта строка
    curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-SLIDER-WITH: b00zy-njasha'));

    Особенно интересует
    b00zy-njasha...
     
  18. slider

    slider Reservists Of Antichat

    Joined:
    4 Sep 2005
    Messages:
    501
    Likes Received:
    711
    Reputations:
    748
    Оставь ее, она говорит о том, что b00zy_c0d3r - няша.. ^_^
     
  19. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Вот это понять не могу:
    Что мы парсим и зачем? ААААА Ща голову разорвет....
     
  20. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Тут редирект.
    Тут кукисы.