繁体   English   中英

PHP cURL登录到站点

[英]PHP cURL to login to a site

我在这里充满希望解决我的问题。 我有这个网站,我想登录并访问会员专用页面。 所以基本上是使用cURL进行登录的php代码,然后打开一个仅会员页面。 下面是我使用的代码。 但是每次我尝试访问仅会员页面时,它都会要求我登录。 因此它不会保存在我已经登录的会话或cookie中。

..........
set_time_limit(0);
$username = 'myemail@yahoo.com';
$password = 'mypassword';
$loginUrl = 'http://radaris.com/login/a.login';
$cookie_file_path = getcwd() . '/tmp/cookie.txt';


//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, 0);

//Set the post parameters
curl_setopt($ch, CURLOPT_HEADER, 1); // set to 0 to eliminate header info from response
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email='.$username.'&password='.$password."&remember_me=1");

//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);

//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//execute the request (the login)
$store = curl_exec($ch);

echo "<font color=red>Login</font><br>".$store."<br><br>";



$postfields = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://radaris.com/my/');
curl_setopt($ch, CURLOPT_HEADER, 1); // set to 0 to eliminate header info from response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, 1);
//Handle cookies for the login
// Edit: prior variable $postFields should be $postfields;
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = curl_exec($ch);


echo "<font color=red>Report</font><br>".$result."<br><br>";
..........

我得到的结果是:

登录HTTP / 1.1 200 OK服务器:nginx日期:2014年6月12日,星期四14:21:01 GMT内容类型:application / json传输编码:分块的连接:keep-alive Keep-Alive:timeout = 20 Cache-Control:无存储,无缓存,必须重新验证缓存控制:后检查= 0,前检查= 0过期:2009年1月14日星期三19:00:00 GMT X-Robots-Tag:noindex {“ / Rdf .showError“:[[”无效的电子邮件或密码“,” login_form“],[”检查您的电子邮件“,” login_email“],[”检查您的密码“,” login_password“]]}}

报告HTTP / 1.1 302找到的服务器:nginx日期:2014年6月12日,星期四14:21:03 GMT内容类型:text / html; charset = utf-8传输编码:分块连接:保持活动保持活动:超时= 20位置:/ login?backurl =%2Fmy%2F HTTP / 1.1 200 OK服务器:nginx日期:2014年6月12日,星期四14: 21:03 GMT内容类型:text / html; charset = utf-8传输编码:分块连接:keep-alive保持活动:超时= 20变化:接受编码变化:接受编码设置Cookie:PHPSESSID = qdg80d48dd17hl879h86v9ruo5; 路径= /; HttpOnly过期:星期四,1981年11月19日08:52:00 GMT缓存控制:无存储,无缓存,必须重新验证,后检查= 0,预检查= 0语法:无缓存登录我们永远不会共享或披露您的信息!

以上仅是标题。 在第二个标题中,我再次获得登录表单以进行登录,这意味着在代码的第一位中成功登录并没有保存会话,这就是为什么当我访问仅会员页面时,它要求登录的原因。

我真的很想把事情做好。 提前谢谢大家。

您使用了两个单独的卷曲手柄,并且从未在第二个中设置cookie。 每个curl句柄是彼此完全独立的,因此,如果您不告诉第二个句柄您在第一个句柄中创建的cookiejar / cookiefile,则您实际上不会使用从登录请求中获得的cookie。

从技术上讲,您不必每次处理一个请求。 一个句柄可以执行多个请求。 唯一一次启动新请求可能更容易,那就是如果您提出了一个复杂的自定义请求,并且设置了许多选项,并且重新启动而不是为下一个请求重置这些选项会更容易。

因此,您的代码序列应为:

init curl
set up cookiefile/cookiefar and other options
do login request
do next next request
close curl

如果您不想重写,则至少将cookiejar / cookiefile选项添加到第二个请求中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM