PHP curl登录无法通过登录页面

时间:2015-02-06 14:51:43

标签: php curl

$username = 'emp';
$pass = 'emp';

$login = array(
    'username' => $username,
    'password' => $pass
);

$loginUrl = 'http://demo.smartjobboard.com/login';

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$content = curl_exec($ch);


echo $content;

我以smartjobboard.com为例测试我的代码,我得到的是登录页面,为什么我无法登录页面?我想抓取需要用户登录的内容。用户名和密码是正确的,但不知道为什么我无法通过。

1 个答案:

答案 0 :(得分:1)

在网站中手动登录,并检查通过浏览器网络监视器确切发布的内容。也许你的参数有一个简单的拼写错误?您可以使用F12(Google CHrome或IE)打开网络监视器。然后按相应的按钮开始记录(确保在加载新页面时保留日志)并观察条目滚动。然后登录并通过打开详细视图查看记录内容并查看标题和响应。

在加载登录页面之前开始记录HTTP请求非常重要。有时在您登录之前会创建一个cookie。这可能会给你一些发送内容的提示。

请记住,不使用浏览器时需要手动发送cookie。因此,当您 登录时,请记住在使用CURL时发送Cookie等其他信息。

创建Cookie但看看网络监视器会发送更多参数: return_url =安培;动作=登录&安培;用户名= EMP&安培;密码= EMP

试试这个:

<?php
$username = 'emp';
$pass = 'emp';

$login = array(
    'username' => $username,
    'password' => $pass,
    'action' =>  'login',
    'return_url' => '/my-account/'
);

$loginUrl = 'http://demo.smartjobboard.com/login';

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

$content1 = curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, "http://demo.smartjobboard.com/my-account/");
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

$content2 = curl_exec($ch);

curl_close($ch);

echo $content2;

?>

这有效;如果可以,请从命令行尝试。但是,返回状态303(参见其他locatoin)。可以使用CURL的选项CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE来检索cookie。看一下手册。

所以你需要手动做另一个curl调用,发送收到的cookie。

请注意检索完整详细标题的额外选项,以了解正在发生的事情!

我的回答:

HTTP/1.1 303 See Other
Server: nginx
Date: Fri, 06 Feb 2015 15:53:16 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=35
X-Powered-By: PHP/5.3.28
Set-Cookie: PHPSESSID=b33b1a0bd7a3bcd50e5e73671c383182; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=baf0d249c8fd7795fa1234cbaf16995e; path=/
Location: http://demo.smartjobboard.com/my-account/

* Hostname was NOT found in DNS cache
*   Trying 96.30.31.40...
* Connected to demo.smartjobboard.com (96.30.31.40) port 80 (#0)
> POST /login HTTP/1.1
Host: demo.smartjobboard.com
Accept: */*
Content-Length: 66
Content-Type: application/x-www-form-urlencoded

* upload completely sent off: 66 out of 66 bytes
< HTTP/1.1 303 See Other
* Server nginx is not blacklisted
< Server: nginx
< Date: Fri, 06 Feb 2015 15:53:16 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Keep-Alive: timeout=35
< X-Powered-By: PHP/5.3.28
< Set-Cookie: PHPSESSID=b33b1a0bd7a3bcd50e5e73671c383182; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Set-Cookie: PHPSESSID=baf0d249c8fd7795fa1234cbaf16995e; path=/
< Location: http://demo.smartjobboard.com/my-account/
< 
* Connection #0 to host demo.smartjobboard.com left intact

(位置有点乱,但不知道为什么)。重定向位置= http://demo.smartjobboard.com/my-account/。但是您应该解析输出以检测此地址,因此它也适用于其他位置。

我也学到了一些东西;)。

相关问题