我正在尝试登录网站并从必须经过身份验证才能查看的页面中获取内容。我做了一些研究,并看到了一些同时使用 cURL 和 stream_context_create 的示例,但我无法使用任何一种方法来工作。我有要登录的页面的 URL,以及包含我需要获取的数据的页面。非常感谢您的帮助!
这是我正在处理的内容:
<?php
$pages = array('home' =>
'https://www.53.com/wps/portal/personal',
'login' =>
'https://www.53.com/wps/portal/personal',
'data' =>
'https://www.53.com/servlet/efsonline/index.html?Messages.SortedBy=DATE,REVERSE');
$ch = curl_init();
//Set options for curl session
$options = array(CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_HEADER => TRUE,
//CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_COOKIEFILE => 'cookie.txt',
CURLOPT_COOKIEJAR => 'cookies.txt');
//Hit home page for session cookie
$options[CURLOPT_URL] = $pages['home'];
curl_setopt_array($ch, $options);
curl_exec($ch);
//Login
$options[CURLOPT_URL] = $pages['login'];
$options[CURLOPT_POST] = TRUE;
$options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx';
$options[CURLOPT_FOLLOWLOCATION] = FALSE;
curl_setopt_array($ch, $options);
curl_exec($ch);
//Hit data page
$options[CURLOPT_URL] = $pages['data'];
curl_setopt_array($ch, $options);
$data = curl_exec($ch);
//Output data
echo $data;
//Close curl session
curl_close($ch);
?>
干杯,
安东尼
安东尼,不久前我不得不建造类似的东西。您需要关注的是cookie。
Curl 处理 cookie,您需要做的是确保首先登录,并在同一连接中加载数据。如果您无法使用相同的连接,您可以使用 opts CURLOPT_COOKIE 或 CURLOPT_COOKIEFILE 来帮助您。更多信息:http://ar2.php.net/manual/en/function.curl-setopt.php
如果您查看如何使用 file_get_contents 在 PHP 中发布数据?您可能会得到您需要的内容。
(我想您需要执行与登录时相同的帖子并从那里继续会话)
编辑(作为对下面问题的答复)
在第一个请求中,客户端将在登录后响应一些 cookie。您必须将此 cookie 设置为第二个请求中的标头。
如果您收到 500 错误,则可能是服务器拒绝您的请求,因为您没有向其发送足够的标头。拒绝你并不罕见。尝试以下操作:
$opts = array('http' =>
array('method' => 'Get',
'Header' => "Host: www.someserver.com\r\n".
"User-Agent: Mozilla\r\n",
'user_agent' => 'Mozilla'));
$context = stream_context_create($opts);
$fp = fopen('http://www.someserver.no', 'r', false, $context);
fpassthru($fp);
fclose($fp);
...您可能需要设置的标头因服务器而异。
您正在使用登录字段 ID 而不是名称:
$options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx';
应该是
$options[CURLOPT_POSTFIELDS] = 'UserName=xxx&Password=xxx';