PHP + Curl Post. Заполняет форму, но не публикует - PullRequest
0 голосов
/ 19 февраля 2012

Мой код

<?php

$url='Search.jsp';
// disguises the curl using fake headers and a fake user agent. 
function disguise_curl($url) 
{ 
  $curl = curl_init(); 

  // Setup headers - I used the same headers from Firefox version 2.0.0.6 
  // below was split up because php.net said the line was too long. :/ 
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
  $header[] = "Cache-Control: max-age=0"; 
  $header[] = "Connection: keep-alive"; 
  $header[] = "Keep-Alive: 300"; 
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
  $header[] = "Accept-Language: en-us,en;q=0.5"; 
  $header[] = "Pragma: "; // browsers keep this blank. 


  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)'); 
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
  curl_setopt($curl, CURLOPT_REFERER, 'https://lalpacweb.blackpool.gov.uk/protected/wca/publicRegisterVehicleSearch.jsp'); 
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
  curl_setopt($curl, CURLOPT_AUTOREFERER, 1); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($curl, CURLOPT_COOKIESESSION, false);

   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

   curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($curl, CURLOPT_COOKIEFILE, "cookies.txt");
   curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt( $curl, CURLOPT_POST, 1);
     curl_setopt ($curl, CURLOPT_POSTFIELDS, 'search.licenceTypeID=34&search.licenceLinkFileID=2&search.vehicleRegNumber=5&publicRegisterVehicle=Search');
  $html = curl_exec($curl); // execute the curl command 
  echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
  curl_close($curl); // close the connection 
  return $html; // and finally, return $html 
} 

// uses the function and displays the text off the website 
$text = disguise_curl($url); 
echo $text; 
?> 

Возвращает страницу с заполненной формой, но не публикует ее. Ответ curl_getinfo, который я получаю ..

200HTTP / 1.1 200 OK Прагма: без кэширования Cache-Control: no-cache, no-store, must-revalidate Срок действия истекает: четверг, 01 января 1970 00:00:00 GMT Content-Type: text / html; charset = ISO-8859-1 Content-Language: en-GB Контент-длина: 5901 Дата: вс, 19 фев 2012 12:24:08 GMT Сервер: Apache

Есть идеи?

Спасибо за вашу помощь

Ответы [ 3 ]

3 голосов
/ 25 февраля 2012

Есть несколько вещей, которые вы, вероятно, захотите сделать, во-первых, я считаю, что он лучше работает в разных операционных системах, если вы укажете абсолютный путь к cookiejar:

curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookies.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies.txt");

Кроме того, вы можете сделать так, чтобы скрипт сначала зашел на домашнюю страницу, чтобы получить сессионный cookie:

disguise_curl("https://lalpacweb.blackpool.gov.uk"); 

Затем вы можете опубликовать форму на https://lalpacweb.blackpool.gov.uk/protected/actions/PublicRegister.action (убедитесь, что cookies.txt существует):

<?php

// disguises the curl using fake headers and a fake user agent. 
function disguise_curl($url, $post = false) 
{ 
  $curl = curl_init(); 

  // Setup headers - I used the same headers from Firefox version 2.0.0.6 
  // below was split up because php.net said the line was too long. :/ 
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
  $header[] = "Cache-Control: max-age=0"; 
  $header[] = "Connection: keep-alive"; 
  $header[] = "Keep-Alive: 300"; 
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
  $header[] = "Accept-Language: en-us,en;q=0.5"; 
  $header[] = "Pragma: "; // browsers keep this blank. 


  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)'); 
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
  curl_setopt($curl, CURLOPT_REFERER, 'https://lalpacweb.blackpool.gov.uk/protected/wca/publicRegisterVehicleSearch.jsp'); 
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
  curl_setopt($curl, CURLOPT_AUTOREFERER, 1); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_COOKIESESSION, false);

  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookies.txt");
  curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies.txt");
  curl_setopt($curl, CURLOPT_HEADER, 1);
  if ($post)
  {
    curl_setopt( $curl, CURLOPT_POST, 1);
    curl_setopt ($curl, CURLOPT_POSTFIELDS, 'search.licenceTypeID=34&search.licenceLinkFileID=2&search.vehicleRegNumber=5&publicRegisterVehicle=Search');
  }
  $html = curl_exec($curl); // execute the curl command 
  //echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
  curl_close($curl); // close the connection 
  return $html; // and finally, return $html 
} 

// Visit the home-page first to get the session cookie
disguise_curl("https://lalpacweb.blackpool.gov.uk"); 

// uses the function and displays the text off the website 

$url = 'https://lalpacweb.blackpool.gov.uk/protected/actions/PublicRegister.action';

$text = disguise_curl($url, true); 
echo $text; 
?> 
1 голос
/ 24 февраля 2012

При открытии https://lalpacweb.blackpool.gov.uk/protected/wca/publicRegisterVehicleSearch.jsp в моем браузере я перенаправляюсь на https://lalpacweb.blackpool.gov.uk/sessiontimeout.jsp и получаю сообщение об ошибке «Session Timeout». Может быть, вы должны сделать два запроса. Один для входа в систему (и, возможно, получения файла cookie сеанса) и один для фактического поиска curl должен автоматически отправлять куки, которые он получил в предыдущих запросах в течение того же сеанса. В противном случае установите его curl_setopt($curl, CURLOPT_COOKIE, 'CookieName=CookieValue');.

0 голосов
/ 25 февраля 2012
$post =  urlencode('search.licenceTypeID=34&search.licenceLinkFileID=2&search.vehicleRegNumber=5&publicRegisterVehicle=Search');

или

$post = array(
'search.licenceTypeID' => 34,
'search.licenceLinkFileID' => 2,
'search.vehicleRegNumber' => 5,
'publicRegisterVehicle' => 'Search'
)


curl_setopt ($init, CURLOPT_POSTFIELDS, $post);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...