[英]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文件也已更改。
最可能的原因是:
获取CRSF令牌后,您将重新初始化curl,因此它对于后续请求无效,因为就站点而言,这是完全不同的会话。
您的$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.