php cURL cookie未通过

时间:2016-08-08 11:54:17

标签: php curl cookies

有一个网站,用于搜索电话号码。我需要设置php scriptcurl command才能从cron job进行搜索。

当我访问搜索页面时,会创建一个“会话”cookie,用于获取结果。在结果页面上,如果cookie丢失或包含错误信息,搜索不会产生结果。

所以我想我访问搜索页面,抓取cookie,然后post该cookie,以及我需要的搜索参数到结果页面,这是不同的(搜索页面的表单操作指向那个)

第一部分完成了。我能够抓取cookie,或者解析标题:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do');
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, true);
$result = curl_exec($curl);
curl_close($curl);

preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches);
$cookiesStringToPass = '';
$cookies = array();
foreach($matches[1] as $item) {
    parse_str($item, $cookie);
    $cookies = array_merge($cookies, $cookie);
}
$cookiesStringToPass = '';
foreach ($cookies as $name=>$value) {
    if ($cookiesStringToPass) {
         $cookiesStringToPass  .= ';';
    }
    $cookiesStringToPass .= $name . '=' . addslashes($value);
}
// $cookiesStringToPass now contains the cookie names and values 

或使用以下方法将其存储在文件中

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

到目前为止一切顺利。现在在第二部分中,我需要提交/发布信息以获取结果(同样,它是与搜索结果不同的页面),应该传递cookie名称/值,这不会发生。我可以在cookie中明确设置header,如下所示:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Cookie: '.$cookiesStringToPass,
    'Content-Type: application/x-www-form-urlencoded'
));
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "nrt=2&pnp=000221&doSearchFreeByNumber=Search");
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,0);
curl_setopt($curl, CURLOPT_HEADER , 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
$result = curl_exec($curl);
curl_close($curl);

或我设置之前生成的文件:

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

结果相同:生成另一个cookie。由于值不同,我得不到结果。

尝试在同一个会话中操作(因此在第一次请求后没有关闭curl连接),结果相同。我知道在连接关闭之前不会创建cookie文件,并且curl_setopt的顺序很重要,也试图摆弄它们。不过,从浏览器中它可以正常工作。

有人能告诉我发生了什么事吗?为什么没有设置cookie(或忽略?!...)?即使这是https请求,我也不知道它需要某种证书等(在这种情况下,请求可能不会返回页面,抱怨它......)。

提前致谢。

编辑:忘记提及,我也尝试过使用

curl_setopt($curl, CURLOPT_COOKIE, $cookiesStringToPass);

没有成功。

编辑2 还尝试重建整个header,因为它来自服务器,并且还尝试包含referrer,但无济于事。

编辑3:从命令行中,从搜索页面转储标题:

curl -v --dump-header headers https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do > aa.html

然后将其重新用于POST到结果页

curl -v -L -b headers --data "nrt=2&pnp=000991&doSearchFreeByNumber=Search" https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do > ab.html

仍会产生相同的错误结果,这次正确设置了cookie。

1 个答案:

答案 0 :(得分:0)

问题与cookie无关。有一个第二个会话ID ,由javascript在表单的操作上以get参数的形式设置。一旦通过,所有工作都按预期进行。