3

我正在尝试使用 php curl 使用用户名和密码登录网站。

<?php
$url = 'http://XXXXX.com/login';
$ch = curl_init();
$formFields = array('username' => 'XXXX', 'password' => 'WAO', 'button' => 'Login');
$cookiefile = 'C:/wamp/www/tests/cookies.txt';

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $formFields);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

echo $response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

但我没有在 $response 中获得完整的 html。意味着如果在浏览器中我在 html 中得到 1000 行。在 curl 中,我得到了大约 350 行 html。

它以前工作,但突然停止工作。

有什么帮助吗?

4

2 回答 2

0

服务器可能会响应元刷新或某种错误。检查响应标头...这是一个很好的起点

$response = curl_exec($ch);
print_r(curl_getinfo($ch));

您还应该使用 http_build_query() 将您的帖子字段作为字符串而不是数组发送

$formFields = http_build_query( array('username' => 'XXXX', 'password' => 'WAO', 'button' => 'Login'));
于 2012-11-02T06:58:14.880 回答
0

如果您正在加载的页面是通过 Ajax 将内容加载到页面上,那么您显然会得到不同的结果。而且,您提到的网站似乎确实通过 ajax 请求加载内容。

cURL 不能/不能解析 javascript,因此不能通过 ajax 加载内容。因此,您无法获得与从普通浏览器获得的完全相同的内容。

您可以通过比较 cURL 的输出和 browser-with-javascript-disabled 的输出并发现它们相同来验证上述声明。

于 2012-11-02T08:51:55.387 回答