PHP,cURL:尝试登录仅返回登录页面


PHP, cURL: logging in attempt just returns the login page

我正在尝试登录:http://hoteladmin.laterooms.com/en/SignIn.aspx

我研究了如何使用cURL,并提出了这个:

<?php
$username = 'myusername';
$password = 'mypassword';
$loginUrl = 'http://hoteladmin.laterooms.com/en/SignIn.aspx';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '_ctl1:userName='.$username.'&_ctl1:passWord='.$password.'_ctl1:btnLogin=Login');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$store = curl_exec($ch);
?>

我希望它能让我登录并打印出"成功登录"页面,但它只是打印出"登录"页面。

编辑:在评论和更多研究之后,我注意到我在帖子中缺少"__VIEWSTATE"字段。我已经添加了这个。这是我的代码现在的状态:

<?php
// GRAB VIEWSTATE VALUE
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "hoteladmin.laterooms.com/en/SignIn.aspx");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);    
// grab position of __VIEWSTATE
$position = strpos($output, "id='"__VIEWSTATE'" value='"");
// echo at substr position
// 25
$viewStateTag = substr($output, $position, 185); 
echo $viewStateTag;
echo "<br />";
echo "<br />";
$viewState = substr($viewStateTag, 25, 148);
echo $viewState;
// ---------------------------------------------------------------------------

$username = 'test';
$password = 'test';
$loginUrl = 'hoteladmin.laterooms.com/en/SignIn.aspx';
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, '__VIEWSTATE=%2F' . $viewState . '&_ctl1%3AuserName=' . $username . '&_ctl1%3ApassWord=' . $password . '&_ctl1%3AbtnLogin=Login');
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$store = curl_exec($ch);
echo $store;
?>

如您所见,我首先请求登录页面并获取__VIEWSTATE值。然后,我尝试在页面上发布完整的登录详细信息(视图状态,用户名,密码和登录值)并回显服务器响应。服务器响应不是我想要的。我得到一个页面,其中包含"此处的对象移动器"字样,并带有指向登录页面的链接。我期待的页面是"访问被拒绝"页面,基本上是带有句子"未找到组"的登录页面。

POST 请求中的 __VIEWSTATE 参数丢失,但我不知道它是什么。这些是在我的登录测试期间传递的参数:

__VIEWSTATE:/wEPDwUJNTg3NDcxNzc1D2QWBAIGDxYCHgFzBQ1sYXRlcm9vbXMuY3NzZAIKD2QWAgIBD2QWAgIBD2QWAmYPZBYGAgMPDxYCHgRUZXh0BQVMb2dpbmRkAgQPDxYCHwEFC1NpZ24gdXAgbm93ZGQCBQ8WBB8BBQ9ObyBncm91cCBmb3VuZC4eB1Zpc2libGVnZGQ=
_ctl1:userName:test
_ctl1:passWord:test
_ctl1:btnLogin:Login

编辑
正如后来发现的那样,CURLOPT_FOLLOWLOCATION cURL 参数应设置为 true,以便让 cURL 跟随重定向。

我建议您使用Chrome开发工具或Firebug来跟踪他们提供的会话ID。 我想他们最初给您的会话 ID 与出于安全原因提交表单后他们给您的会话 ID 不同。