我需要登录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, data, 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页面说了两件事:
关于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',encodeURIComponent('loginandpassord'),'vskcookies.txt',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);
并得到空数组:
我做错什么了吗,还是网站受到机器人保护?
更新1
仅当它们通过CURLOPT_COOKIE
时才显示cookie。
所以我想我会保留CURLOPT_COOKIEFILE => $cook;
的原样,而对于CURLOPT_COOKIE
之类的file_get_contents($cook)
来说,尽管有无用的信息。保护?
重要更新2
好吧,可能我只是愚蠢。响应html页面确实包含有关IE和错误cookie的消息,但是它们位于display:none
的div中,并由js显示。
因此,似乎我的尝试由于其他原因而失败。