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

时间:2013-09-08 15:39:48

标签: php curl

我正在尝试登录: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”字样,其中包含指向登录页面的链接。我期待的页面是“拒绝访问”页面,基本上是登录页面,其句子为“找不到组”。添加到它。

2 个答案:

答案 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与你提交表格后出于安全原因给出的那个不同。