我正在尝试登录: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);
?>
我希望它会登录并打印出“成功登录”页面,但它只打印出“登录”页面。
编辑:在评论和更多研究之后,我注意到我在POST中错过了“__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值。然后我尝试在页面上发布完整的登录详细信息(viewstate,用户名,密码和登录值)并回显服务器响应。服务器响应不是我想要的。我得到一个页面,其中包含“Object mover here”字样,其中包含指向登录页面的链接。我期待的页面是“拒绝访问”页面,基本上是登录页面,其句子为“找不到组”。添加到它。
答案 0 :(得分:1)
POST请求中的__VIEWSTATE
参数丢失但我不知道它是什么。
这些是我在登录测试期间传递的参数:
__VIEWSTATE:/wEPDwUJNTg3NDcxNzc1D2QWBAIGDxYCHgFzBQ1sYXRlcm9vbXMuY3NzZAIKD2QWAgIBD2QWAgIBD2QWAmYPZBYGAgMPDxYCHgRUZXh0BQVMb2dpbmRkAgQPDxYCHwEFC1NpZ24gdXAgbm93ZGQCBQ8WBB8BBQ9ObyBncm91cCBmb3VuZC4eB1Zpc2libGVnZGQ=
_ctl1:userName:test
_ctl1:passWord:test
_ctl1:btnLogin:Login
修改强>
稍后发现,CURLOPT_FOLLOWLOCATION
cURL参数应设置为true,以便让cURL遵循重定向。
答案 1 :(得分:0)
我建议您使用Chrome开发工具或firebug来跟踪他们提供的会话ID。我猜他们首先给你的会话ID与你提交表格后出于安全原因给出的那个不同。