【问题标题】:PHP + Curl Post. It fills the form, but does not postPHP + 卷发。它填写表格,但不发布
【发布时间】:2012-03-10 02:04:38
【问题描述】:

我的代码

<?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: no-cache Cache-Control: no-cache,no-store,must-revalidate 过期:Thu, 01 Jan 1970 00:00:00 GMT 内容类型:text/html;charset=ISO-8859-1 内容语言:en-GB 内容长度:5901 日期:2012 年 2 月 19 日星期日 12:24:08 GMT 服务器: 阿帕奇

有什么想法吗?

感谢您的帮助

【问题讨论】:

  • 看来你的代码是正确的,所以你应该确保你请求的字段是正确的,状态为200的响应表明你的请求是正确的,但可能你的字段不正确,你可以写一个测试服务器上的页面并使用上面的代码进行测试。
  • 状态 200 代码是否显示表单已发布?或者它不会回复这些信息?表单有两个提交按钮,我通过说“publicRegisterVehicle=Search”指定了一个,对吗?
  • 页面上可能需要设置 2 个隐藏的表单域。 _sourcePage 和 __fp

标签: php post curl


【解决方案1】:

您可能想要做一些事情,首先我相信如果您提供 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; 
?> 

【讨论】:

  • 太棒了!非常感谢您的帮助。
【解决方案2】:

使用浏览器打开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');

【讨论】:

  • 您好,感谢您的回复。在自己做了一些研究之后,我发现如果我手动访问 URL,发帖,我会得到一个 jsessionID cookie。现在,当我使用该 jsessionID 更新我的 cookies.txt 时,我的脚本可以正常工作并加载页面。但是,它似乎只从会话开始时加载信息。看来,当我的脚本发布表单时,它会保存一个 jsessionID,但在我的网站上创建的那些是无效的并且不起作用。但是,如果我使用在本机站点本身上创建的那个并更新我的 cookies.txt,它就可以工作。
  • 问题是,sessionID 在 10 分钟后过期。所以我必须继续访问那个网站,发布表单,获取会话 ID,然后更新我的 cookies.txt 文件。知道为什么,当通过 curl 发布表单时,创建的 sessionID 不起作用。它更新 cookies.txt,并创建了一个会话,但它对服务器没有任何意义。但我不明白为什么不 - 服务器认为引用页面是它自己,并且它是一个常规请求。
【解决方案3】:
$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);

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2012-12-30
    • 2016-05-17
    • 2012-06-12
    • 2018-02-28
    • 2023-03-21
    • 2015-05-09
    • 2021-04-29
    相关资源
    最近更新 更多