我尝试使用 curl 登录 SSL 安全网站,但不知何故我做错了。
第一个 curl 连接检索登录表单。最初的 SSL 问题现在已解决。用于身份验证的字段和所有隐藏字段都被识别并用于以下 POST。cookie 文件和要读取的 jar 文件都已定义。cookie 文件是可访问的,并随着每次登录尝试而更新。curl 成功设置了会话 cookie。移除 HTTPHEADER 以阻止请求到达 100 Continue 墙。Curl 被配置为跟进并发送推荐人。但是,我仍然找不到脚本卡住的地方。Curl 和 PHP 都不会发出任何错误消息或警告。
这是缩短的脚本:
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // remove Expect header to avoid 100 Continue situations
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla [abbreviated]');
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/cacert.pem');
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.hq.txt'); // write cookies
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.hq.txt'); // read cookies
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_URL, 'https://the_url.jsp');
$data = curl_exec($ch);
$error= curl_error($ch);
if(!empty($error))
echo '<p>'.$error.'</p>';
else
echo '<p>ok</p>';
现在脚本读取表单,填写凭据并使用相同的 curl_init 句柄将其返回:
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $options);
$data = curl_exec($ch);
$error=curl_error($ch);
但我得到的只是再次使用相同的表单和相同的会话 cookie 或新的会话 cookie,具体取决于 CURLOPT_COOKIESESSION 设置。
当我手动登录时,我注意到还有两个 cookie 集:LtpaToken 和 LtpaToken2,但我从未看到它们出现在脚本打印的请求标头中。即使没有激活 Javascript,也可以手动提交表单。因此,在提交表单数据之前,不可能有一些 JS 魔术在后台修改表单数据。显然我在这里遗漏了一些东西。有什么想法可以让我进一步了解吗?
已解决:最后,问题是由于 POST 中的编码问题。最初,POST 数据是使用 http_build_query() 从数组创建的。现在 POST 数据被简单地连接起来,键和值都分别进行了 urlencoded:
$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value'));