【问题标题】:php cURL cookie is not passedphp cURL cookie 未通过
【发布时间】:2016-08-08 11:54:17
【问题描述】:

有一个网站,可以搜索电话号码。我需要创建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 名称/值,这不会发生。要么我在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 实际上只将输出传输到变量。不过谢谢。

标签: php curl cookies


【解决方案1】:

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

【讨论】:

  • 嗨,安德鲁,我遇到了同样的问题。在某处创建了第二个会话,我无法弄清楚如何抓住它或找到它是如何创建的......你能给我帮助吗?谢谢
  • 很抱歉评论晚了,如果您还没有弄清楚,请提供更多详细信息。我们应该找个地方聊天,所以不适合聊天。或者您可能想发布一个问题,并在此处写下它的链接。
  • 我想通了!谢谢!
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2011-08-25
  • 2018-05-28
  • 2013-12-27
  • 1970-01-01
  • 2010-12-10
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多