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

PHP curl login couldn't pass login page

$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为例来测试我的代码,我得到的是登录页面,为什么我不能得到登录页面?我想抓取需要用户登录的内容。用户名和密码是正确的,但不知道为什么我无法通过。

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

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

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

Cookie 已创建,但查看网络监视器会发送更多参数: return_url=&action=login&username=emp&password=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(请参阅其他位置)。可以使用 CURL 的选项 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE 来检索 cookie。看看说明书。

因此您可能需要手动执行另一个 curl 调用,发送收到的 cookie。

注意检索完整详细信息的额外选项headers以了解发生了什么!

我的回复:

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/。但是您应该解析输出以检测此地址,因此它也适用于其他位置。

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