发送凭据后,远程服务器返回错误页面

时间:2014-03-30 02:53:11

标签: php curl login

我试图创建简单的网页,让我可以从信息系统查看当前的时间表。 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很糟糕。我不确定,因为我第一次写这样的剧本。

1 个答案:

答案 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);