【发布时间】:2016-08-08 11:54:17
【问题描述】:
有一个网站,可以搜索电话号码。我需要创建php script 或curl 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 名称/值,这不会发生。要么我在header 中明确设置cookie,就像这样:
$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 设置正确。
【问题讨论】:
-
curl_setopt($curl, RETURN_TRANSFER,1);可以做到。 -
@Robert ,也已经尝试过了。
CURLOPT_RETURNTRANSFER实际上只将输出传输到变量。不过谢谢。