0

我正在尝试登录: 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 值。然后我尝试在页面上发布完整的登录详细信息(视图状态、用户名、密码和登录值)并回显服务器响应。服务器响应不是我想要的。我得到一个页面,其中包含“此处的对象移动器”以及指向登录页面的链接。我期待的页面是“拒绝访问”页面,基本上是带有“未找到组”语句的登录页面。添加到它。

4

2 回答 2

1

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

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

编辑
稍后发现,CURLOPT_FOLLOWLOCATIONcURL 参数应该设置为 true,以便让 cURL 跟随重定向。

于 2013-09-08T15:53:33.390 回答
0

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

于 2013-09-08T15:49:33.920 回答