PHP CURL:不允许完全操纵HTTP标头?

时间:2010-10-23 19:36:41

标签: php curl

我一直在编写一个自动登录我学校网络的脚本,检查我试图进入的课程是否已经完全填满,如果有一个地方已经打开,请注册课程我。但是,我在登录过程中遇到了很大麻烦。

基本上,我一直在查看登录时尝试复制它们时发送的标头。问题是我一直收到错误说“HTTP / 1.1 400 Bad Request Content-Type:text / html Date:Sat,23 Oct 2010 18:42:20 GMT Connection:close Content-Length:42 错误请求(无效的标题名称)“。

我猜它与Host参数有关我设置的与实际不同(我设置它是elion.psu.edu,但是从我的脚本查看标题时它有更改回授予脚本的grantbachman.com)。我想最好只是告诉你。 我试图创建标题的开头:

https://elion.psu.edu/cgi-bin/elion-student.exe/submit

POST /cgi-bin/elion-student.exe/submit HTTP/1.1
Host: elion.psu.edu

我运行脚本时显示的标题的开头:

http://myDomain.com/myScriptName.php

GET /elionScript.php HTTP/1.1
Host: myDomain.com

基本上,第一行是不同的,主机名是不同的,它说我发送的信息是用GET变量而不是POST变量(即使我将curlopt_post设置为true)。我基本上寻找任何改变这些信息的帮助,以便服务器接受我的脚本。我是新鲜的想法。感谢。

哦,这是我正在使用的代码:

$data = array(
    "$userIDName" => '********',
    "$passName" => '********',
    "$submitName" => 'Login+to+eLion',
    'submitController' => '',
    'forceUnicode' => '%D0%B4%D0%B0',
    'sessionKey' => "$sessionValue",
    'pageKey' => "$pageKeyValue",
    'shopperID' => '');

$contentLength = strlen($userIDName . '=*********&' . $passName . '=********&' . $submitName .'=Login+to+eLion&submitController=&forceUnicode=%D0%B4%D0%B0&sessionKey=' . $sessionValue . '&pageKey=' . $pageKeyValue . '&shopperID=');

$ch = curl_init("https://elion.psu.edu/cgi-bin/elion-student.exe/submit");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE,'sessionKey="$sessionValue";pageKey="$pageKeyValue";BIGipServerelion_prod_pool="$prodPoolValue"');
curl_setopt($ch,CURLOPT_HTTPHEADER,array(
    'Host: elion.psu.edu',
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-us,en;q=0.5','Accept-Encoding: gzip,deflate',
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Keep-Alive: 115',
    'Referer: https://elion.psu.edu/cgi-bin/elion-student.exe/launch/ELionMainGUI/Student',
    "Cookie: sessionKey=$sessionValue; pageKey=$pageKeyValue; BIGipServerelion_prod_pool=$prodPoolValue", 'Content-Type: application/x-www-form-urlencoded',
    "Content-Length: $contentLength"));
$contents2 = curl_exec ($ch);

我也很重要的是要注意,当我运行脚本时,当我查看标题时,“Keep-Alive:115”行下方的信息都没有显示。

1 个答案:

答案 0 :(得分:0)

似乎它在你的问题中遗漏了一些代码,但试试这个:

1-将证书保存在服务器上

2-尝试此代码

$pg = curl_init();
// Set the form data for posting the login information
$postData = array();
$postData["username"] = $username;
$postData["password"] = $password;

$postText = "";

foreach( $postData as $key => $value ) {
$postText .= $key . "=" . $value . "&";
}

curl_setopt( $pg, CURLOPT_URL, $YOUR_URL );
curl_setopt( $pg, CURLOPT_POST, true );
curl_setopt( $pg, CURLOPT_POSTFIELDS, $postText );
curl_setopt( $pg, CURLOPT_SSL_VERIFYPEER, true );
curl_setopt( $pg, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $pg, CURLOPT_CAINFO, getcwd() . '/web'); //web is the exported certificate


//curl_setopt( $pg, CURLOPT_VERBOSE, true ); // for debug 
//curl_setopt( $pg, CURLOPT_RETURNTRANSFERT, true); // if you want a ouput
curl_setopt( $pg, CURLOPT_COOKIEJAR, "cookies.txt" );
curl_setopt( $pg, CURLOPT_COOKIEFILE, "cookies.txt" );
curl_setopt( $pg, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)" );
curl_setopt( $pg, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $pg, CURLOPT_COOKIE, session_name() . '=' . session_id() );

if( ( $response = curl_exec( $pg ) ) === false ) {
        echo '*Curl erro' . curl_error($pg) . "\n";
}

curl_close($pg)

$ YOUR_URL:HTTPS://elion.psu.edu/cgi-bin/elion-student.exe/launch/ELionMainGUI/Student

使用动态名称的表单因此不像“用户名”和“密码”那样简单。在网站上查看“好”的信息。

不要忘记像在postData数组中那样添加其他隐藏字段,也要更新cookie部分。