我试图创建简单的网页,让我可以从信息系统查看当前的时间表。 IS是用ASP.NET编写的,使用库为输入生成随机名称值。它还使用一次性登录令牌。
我写了这个脚本来登录并获取当前的时间表。
<?php
function curl($url, $post=false,$cookie = 'cookie.txt'){
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url );
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt ($ch, CURLOPT_AUTOREFERER, true);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
if($cookie){
$agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36";
curl_setopt ($ch, CURLOPT_USERAGENT, $agent);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
}
if($post){
curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post);
}
return curl_exec ($ch);
}
// require simple html dom library to work with html later
require 'simple_html_dom.php';
// login page uri
$login_page = "http://bakalari.sosklobouky.cz:82/login.aspx";
// fetch login page
$ch = curl($login_page ,false);
// create simple html dom to read hidden inputs, etc.
$html = str_get_html($ch);
// add all hidden inputs into string
$hidden_inputs = '';
foreach ($html->find('input[type=hidden]') as $element) {
$hidden_inputs .= '&'.$element->name.'='.$element->value;
}
// fetch actual name atributes of username and password form
$username_name = $html->find('input[tabindex=1]', 0)->name;
$password_name = $html->find('input[tabindex=2]', 0)->name;
// credentials
$username = "9703042329z";
$password = "somepass";
// post data - credentials + hidden inputs
$postdata = $username_name . '=' . $username . '&' . $password_name . '=' . $password . $hidden_inputs;
// send request to login page with credentials
$ch = curl($login_page ,$postdata);
// print result
echo $ch;
// try to fetch page that is available after login
$ch = curl('http://bakalari.sosklobouky.cz:82/uvod.aspx',false);
// print return
echo $ch;
?>
但远程服务器返回应用程序错误。你有什么想法?也许我发送postdata很糟糕。我不确定,因为我第一次写这样的剧本。
答案 0 :(得分:0)
关闭卷曲手柄,否则不会为每次调用保存cookie(仅在程序结束时才会保存)。
$result = curl_exec ($ch);
curl_close($ch);
return $result;
从日志和最新对话中,这是更新
您正尝试POST大量数据(目前为1155字节)。并且通过普通帖子,你不能传递超过1024字节的数据。因此,您将从该网站获得100 Continue
回复。
因此,将您的帖子转换为multipart/form-data
,您将获得通过。这是你如何做到的。
制作一个包含所有帖子值的数组。
$post_data = array(
'name' => 'some name',
'pass' => 'some pass',
'hidden-1' => 'some hidden-1', // you may need to do urlencode() here, I am not sure
'others-1' => 'some others 1'
/// and so on
);
然后将数组直接发布到curl post中,如下所示:
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post_data);