Curl - отправка Get запроса

Discussion in 'PHP' started by Seganapa, 11 Jul 2012.

  1. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Добрый день!
    Имеется функция:
    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'));  //иммитируем AJAX запрос 
              
    curl_setopt($cl, CURLOPT_POSTFIELDS, $post);  
          }  
          
    $line = curl_exec($cl);  
          
    curl_close($cl);      
          return 
    $line;  
    }  
    C помощью нее успешно отправляются Post запросы.
    Но появилась необходимость отправить Get, чтобы получить код страницы и пропарсить ее...

    Сниффер мне выдает ссылку:
    http://ru11.grepolis.com/game/building_place?action=culture&town_id=51543&h=2f089cf9271&json=%7B%22town_id%22%3A%2251543%22%2C%22nlreq_id%22%3A16133329%7D&_=1342004135652]http://ru11.grepolis.com/game/building_pla..._=1342004135652

    Где h=2f089cf9271 - переменная, которая парсится из кода страницы...

    Делаю так:
    PHP:
    $culture = requester('http://ru11.grepolis.com/game/building_place?action=culture&town_id=51543&h='.$token[1]'&json=%7B%22town_id%22%3A%2251543%22%2C%22nlreq_id%22%3A16133329%7D&_=1342003348170', 0, $cook, 1, 0);
    print 
    $culture
    Выскакивает ошибка... Что не так?
     
  2. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    PHP:
    $culture = requester('http://ru11.grepolis.com/game/building_place?action=culture&town_id=51543&h='.$token[1].'&json=%7B%22town_id%22%3A%2251543%22%2C%22nlreq_id% 22%3A16133329%7D&_=1342003348170', 0, $cook, 1, 0);
    Не выспался?)
     
  3. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    И это тоже!
    Это мой первый скрипт... Post запросы научился отправлять...
    Нигде не смог найти описание как отправить get запрос с параметрами Json...

    Что не так?
     
  4. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Там где я пометил небыло точки.
     
  5. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Блин, почему я получаю не ту страницу которая мне нужна???

    Опишу подробнее:

    Вот код скрипта:
    PHP:
    <?php 
     header
    ('Content-Type: text/html; utf-8; charset=UTF-8');
     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'));  //иммитируем AJAX запрос 
              
    curl_setopt($cl, CURLOPT_POSTFIELDS, $post);  
          }  
          
    $line = curl_exec($cl);  
          
    curl_close($cl);      
          return 
    $line;  
    }  

    $login = 'Tartang';  
    $password = '7TXzMQvUZt3qUqh';  

    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]);   

    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]);  

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

    preg_match("#Game\.csrfToken = '(\S+)'#", $ans, $token);  

    ?>
    Для дальнейшего парсинга мне нужно получить вот такой ответ:
    [​IMG]

    Отправляю Get запрос, который показал сниффер:
    PHP:
    $culture = requester('http://ru11.grepolis.com/game/building_place?action=culture&town_id=51543&h='.$token[1].'&json=%7B%22town_id%22%3A%2251543%22%2C%22nlreq_id%22%3A0%7D&_=1342009498240', 0, $cook, 1, 0);
    При выводе $culture, мне выдается главная страница...
    Как же получить именно тот контент, который показан в сниффере?
     
    #5 Seganapa, 11 Jul 2012
    Last edited: 11 Jul 2012
  6. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    req_id% 22
    ИМХо в этой строчке пропуск не может быть.
     
  7. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Пропуска на самом деле нет... Это так на форуме отобразилось...

    Блин, так и не получается получить нужную страницу...
     
  8. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Не пойму как формировать эти данные:
    "nlreq_id"
    "_"

    Походу они как-то на времени сервера завязаны...
    Из-за них может не тот content возвращаться?
     
  9. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    С "nlreq_id" разобрался, а вот с "_" никак... Где же брать это значение?
     
  10. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Если использовать time(), я получаю 10-ти значное число...
    А параметр "_" состоит из 13 символов, первые 10-ть из которых генерируются time(). А что за остальные три цыфры?

    Никак не могу додуматься... Помогите, пожалуйста!!!
     
  11. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Вот что получается:
    PHP:
    <?php 
     header
    ('Content-Type: text/html; utf-8; charset=UTF-8');
     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'));  //иммитируем AJAX запрос 
              
    curl_setopt($cl, CURLOPT_POSTFIELDS, $post);  
          }  
          
    $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);  
    //echo $token[1]; 

    $time = explode(' ', microtime());
    $timef = $time[1] . substr($time[0], 2, 3);
    //echo $timef;

    $culture = requester('http://ru11.grepolis.com/game/building_place?action=culture&town_id=51543&h='.$token[1].'&json={"town_id":"51543","nlreq_id":0}&_='.$timef, 0, $cook, 1, 0);
    print 
    $culture;
    Мне нужно получить [​IMG]

    А я получаю главную страницу.... Что же не так???
     
    #11 Seganapa, 12 Jul 2012
    Last edited: 12 Jul 2012
  12. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    913
    Likes Received:
    480
    Reputations:
    724
    Возможно отправляешь не все нужные для хорошего ответа данные, например REFERER.
     
    _________________________
  13. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Все перепробовал... Не получается!!!