繁体   English   中英

使用curl PHP登录

[英]login with curl php

我正在尝试使用curl登录到一个网站,但是我无法使其正常工作。
这是我正在使用的代码。

首先,我从网站上获取csrf令牌以确保其匹配。
但是我得到的结果始终是登录表单。

$url="http://www.example.com/accounts/login"; 
$postinfo = 'csrfmiddlewaretoken='.$key.'&login=email@gmail.com&password=mypassword';

$cookie = "cookies.txt";

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec($ch); 

return $result;

有谁知道我为什么不能登录?

表单字段是正确的,并且在我尝试登录时,cookies.txt文件也已更改。

最可能的原因是:

  1. 获取CRSF令牌后,您将重新初始化curl,因此它对于后续请求无效,因为就站点而言,这是完全不同的会话。

  2. 您的$postinfo是一个字符串,因此您需要手工urlencode()值( CURLOPT_POSTFIELD S也接受关联数组,在这种情况下,您不需要这样做)。

我可以想到几个建议。 这些都是基于较早的经验(当时对我不起作用),我最终通过反复试验使它起作用。

确保cookies.txt可写。 将cookies.txt放在www根目录之外的单独文件夹中,并使用绝对路径更改$ cookie的值:

$cookie = "/path/to/writable/folder/cookies.txt";

尝试登录后,检查文件是否包含cookie值。 如果它确实包含cookie值,但不包含需要识别为已登录的cookie值,则除了令牌检查外,可能还有一些其他服务器端检查,以防止从服务器外部提交表单。

查看正常的人类登录表单的URL,例如http://www.example.com/accounts/loginform.html-或用于获取令牌并将其添加为引用网址的URL:

curl_setopt($ch, CURLOPT_REFERER, 'http://www.example.com/accounts/loginform.html');
curl_setopt($ch, CURLOPT_AUTOREFERER, true);

设置一些选项,使您看起来更人性化:

 curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
 curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate,sdch");
 curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Accept-Language:en-US,en;q=0.5',
        'Origin: http://www.example.com',
        'Cache-Control:no-cache',
        'Connection:keep-alive',
        'Pragma:no-cache',
        'Expect:'
    ));

上面的示例标头数组在我的特定情况下有效。 在您的情况下,人类登录时可能还会发送其他标头。尝试使用浏览器登录一次,然后在浏览器的开发人员工具中检查发送的请求标头,然后复制/粘贴它们。 还要仔细检查发布的隐藏值(在我的情况下,需要在CURLOPT_POSTFIELDS字符串中添加“&__ VIEWSTATE = somereallylongIIScode”)。

暂无
暂无

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

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