有一个网站,用于搜索电话号码。我需要设置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名称/值,这不会发生。我可以在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。
答案 0 :(得分:0)
问题与cookie无关。有一个第二个会话ID ,由javascript在表单的操作上以get参数的形式设置。一旦通过,所有工作都按预期进行。