2012-02-19 2 views
0

Моего кодаPHP + Curl Post. Он заполняет форму, но не отправляет

<?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 Pragma: нет кэша Cache-Control: нет кэша, нет-магазина, нужно обязательно перепроверять Expires: Thu, 01 Jan 1970 00:00 : 00 GMT Content-Type: text/html; charset = ISO-8859-1 Содержимое-язык: ru-RU Контент-длина: 5901 Дата: Вс, 19 фев 2012 12:24:08 GMT Сервер: Apache

Любые идеи?

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

+0

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

+0

Указывает ли код статуса 200, что форма была опубликована? Или он не ответил бы этой информацией? У формы есть две кнопки отправки, и я указал один, говоря «publicRegisterVehicle = Search», правильно ли это? – Tom

+0

На странице есть две скрытые поля формы, которые могут потребоваться установить. _sourcePage и __fp – ben

ответ

3

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

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

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

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; 
?> 
+0

Абсолютно фантастический! Большое спасибо за Вашу помощь. – Tom

1

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

+0

Привет, спасибо за ответ. Сделав еще несколько исследований, я обнаружил, что если я перейду к URL-адресу вручную, сделайте сообщение, я получаю файл cookie jsessionID. Теперь, когда я обновляю файл cookie с этим jsessionID, мой скрипт работает, и он загружает страницу. Однако, похоже, он загружает информацию только с момента ее создания. Похоже, что когда мой скрипт отправляет форму, он сохраняет jsessionID, но созданные на моем сайте недействительны и не работают. Однако, если я использую тот, который создан на самом родном сайте и обновляет файл cookie.txt, он работает. – Tom

+0

Проблема заключается в том, что sessionID истекает через 10 минут. Поэтому мне нужно будет идти на этот сайт, публиковать форму, получать идентификатор сеанса, а затем обновлять файл cookie.txt. Любая идея, почему при отправке формы через curl созданный sessionID не работает. Он обновляет файл cookie.txt и создает сеанс, но это ничего не значит для сервера.Но я не понимаю, почему нет - сервер считает, что ссылающаяся страница сама по себе, и что это обычный запрос. – Tom

0
$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); 
Смежные вопросы