我的curl post请求中是否包含cookie?

问题描述

我需要登录http://auto.vsk.ru/login.aspx,并从我的网站对其发布请求。 我编写了一个js ajax函数,该函数将发布请求发送到服务器上的PHP脚本,并通过cUrl发送跨域请求。

post.PHP

<?PHP

function request($url,$post,$cook)
{
$ch = curl_init();
$cURLconfig = array(
CURLOPT_URL            => $url,CURLOPT_POST           => 1,CURLOPT_RETURNTRANSFER => 1,CURLOPT_COOKIEFILE => $cook,CURLOPT_COOKIEJAR => $cook,CURLOPT_USERAGENT => '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)"',CURLOPT_FOLLOWLOCATION => 1,CURLOPT_REFERER => $url,CURLOPT_POSTFIELDS     => $post,CURLOPT_HEADER => 1,);
curl_setopt_array($ch,$cURLconfig);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

$result = request($_POST['url'],$_POST['data'],$_POST['cook']);

if ($result === FALSE) 
 echo('error');
else
 echo($result);

?>

Js代码

function postcross(path,data,cook,run)
{
requestsp('post.PHP','url='+path+'&data='+data+'&cook='+cook,run);
}

function requestp(path,run)
{
var http = new XMLHttpRequest();
http.open('POST',path,true);

http.setRequestHeader('Content-type','application/x-www-form-urlencoded');

http.onreadystatechange = function() 
{  
if(http.readyState == 4 && http.status == 200)
{
    run(http);
}
}

http.send(data);
}

postcross('http://auto.vsk.ru/login.aspx',encodeURIComponent('loginandpassord'),'vskcookies.txt',function(e){
document.getElementById('container').innerText=e.responseText;
});

我从响应中获得的html页面说了两件事:

  1. 我的浏览器不是Internet Explorer,我应该切换到它。(实际上它可以在Google Chrome上运行,至少可以登录)。
  2. 我的浏览器不支持cookie。

关于cookie,它与this(长期旅行)问题非常相似。文件vskcookies.txt是在我的服务器中创建的,实际上是在发出请求请求后更新的,并存储cookie。

关于IE,首先我认为该网站会从JS检查浏览器,但这是错误的,因为JS根本无法运行-我只将html页面读为纯文本,并且已经具有有关IE的通知

所以想知道如果我使cUrl请求出错了怎么办?我写了新的PHP脚本来显示请求标头,这是源代码

head.PHP

<?PHP

foreach (getallheaders() as $name => $value) 
{
echo "$name: $value\n";
}

?>

postcross('http://mysite/head.PHP',function(e){ document.getElementById('container').innerText=e.responseText; })的结果:

Host: my site
User-Agent: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
Accept: */*
Content-Type: application/x-www-form-urlencoded
Referer: mysite/head
X-1gb-Client-Ip: my ip
X-Forwarded-For: ip,ip,ip
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Port: 443
Accept-Encoding: gzip
X-Forwarded-URI: /head
X-Forwarded-Request: POST /head HTTP/1.1
X-Forwarded-Host: my site
X-Forwarded-Server: my site
Content-Length: 823
Connection: close

由于某种原因,没有Cookie:参数,但是用户代理就是我提到的IE。

我也尝试将head.PHP源替换为

print_r($_COOKIE);

并得到空数组:

enter image description here

我做错什么了吗,还是网站受到机器人保护?


更新1

仅当它们通过CURLOPT_COOKIE时才显示cookie。

所以我想我会保留CURLOPT_COOKIEFILE => $cook;的原样,而对于CURLOPT_COOKIE之类的file_get_contents($cook)来说,尽管有无用的信息。保护?


重要更新2

好吧,可能我只是愚蠢。响应html页面确实包含有关IE和错误cookie的消息,但是它们位于display:none的div中,并由js显示

因此,似乎我的尝试由于其他原因而失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)