2011-12-04 90 views
0

我一直在試圖爲過去幾天來從一個網站,但沒有成功的請求。 我總是收到錯誤301. 是否有人能夠幫助我獲取本頁內容:https://pre.corrupt-net.org/search.php?search=Lasse_Stefanz-Bara_Du-SE-CD-FLAC-1995-LoKETHTTPS鏈接獲取問題

我期待您的回覆。

編輯: 這是PHP的功能我用:

function http_request(
    $verb = 'GET',    /* HTTP Request Method (GET and POST supported) */ 
    $ip,      /* Target IP/Hostname */ 
    $port = 80,    /* Target TCP port */ 
    $uri = '/',    /* Target URI */ 
    $getdata = array(),  /* HTTP GET Data ie. array('var1' => 'val1', 'var2' => 'val2') */ 
    $postdata = array(),  /* HTTP POST Data ie. array('var1' => 'val1', 'var2' => 'val2') */ 
    $cookie = array(),   /* HTTP Cookie Data ie. array('var1' => 'val1', 'var2' => 'val2') */ 
    $custom_headers = array(), /* Custom HTTP headers ie. array('Referer: http://localhost/ */ 
    $timeout = 1000,   /* Socket timeout in milliseconds */ 
    $req_hdr = false,   /* Include HTTP request headers */ 
    $res_hdr = false   /* Include HTTP response headers */ 
    ) 
{ 
    $ret = ''; 
    $verb = strtoupper($verb); 
    $cookie_str = ''; 
    $getdata_str = count($getdata) ? '?' : ''; 
    $postdata_str = ''; 
    foreach ($getdata as $k => $v) 
     $getdata_str .= urlencode($k) .'='. urlencode($v); 
    foreach ($postdata as $k => $v) 
     $postdata_str .= urlencode($k) .'='. urlencode($v) .'&'; 
    foreach ($cookie as $k => $v) 
     $cookie_str .= urlencode($k) .'='. urlencode($v) .'; '; 
    $crlf = "\r\n"; 
    $req = $verb .' '. $uri . $getdata_str .' HTTP/1.1' . $crlf; 
    $req .= 'Host: '. $ip . $crlf; 
    $req .= 'User-Agent: Mozilla/5.0 Firefox/3.6.12' . $crlf; 
    $req .= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' . $crlf; 
    $req .= 'Accept-Language: en-us,en;q=0.5' . $crlf; 
    $req .= 'Accept-Encoding: deflate' . $crlf; 
    $req .= 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' . $crlf; 
    foreach ($custom_headers as $k => $v) 
     $req .= $k .': '. $v . $crlf; 
    if (!empty($cookie_str)) 
     $req .= 'Cookie: '. substr($cookie_str, 0, -2) . $crlf; 
    if ($verb == 'POST' && !empty($postdata_str)){ 
     $postdata_str = substr($postdata_str, 0, -1); 
     $req .= 'Content-Type: application/x-www-form-urlencoded' . $crlf; 
     $req .= 'Content-Length: '. strlen($postdata_str) . $crlf . $crlf; 
     $req .= $postdata_str; 
    } 
    else $req .= $crlf; 
    if ($req_hdr) 
     $ret .= $req; 
    if (($fp = @fsockopen($ip, $port, $errno, $errstr)) == false) 
     return "Error $errno: $errstr\n"; 
    stream_set_timeout($fp, 0, $timeout * 1000); 
    fputs($fp, $req); 
    while ($line = fgets($fp)) $ret .= $line; 
    fclose($fp); 
    if (!$res_hdr) 
     $ret = substr($ret, strpos($ret, "\r\n\r\n") + 4); 
    return $ret; 
} 
+0

爲什麼不只需使用捲曲之類的東西? – CodeCaster

回答

2

首先,301 is not an "error" as such,它表明您被重定向。您需要解析響應頭,取Location:報頭(其中HTTP協議規範要求存在於重定向響應)的值,並請求URI爲好。

其次,上述函數不會出現以提供用於訪問HTTPS URL中的任何支持。您需要安裝用於PHP實例來做到這一點OpenSSL的擴展,並且還需要實際調用它的一些方式。你可以使用上面的函數通過傳遞ssl://tls://$ip參數地址的前這樣做,但你不能簡單地通過IP。

第三,通常的方式做這樣的事情是與cURL擴展。你會做這樣的事情:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://pre.corrupt-net.org/search.php?search=Lasse_Stefanz-Bara_Du-SE-CD-FLAC-1995-LoKET'); // Set the URL 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Get the result from the execution 

if (($result = curl_exec($ch)) === FALSE) { // Execute the request 
    echo "cURL failed! Error: ".curl_error($ch); 
} else { 
    echo "Success! Result: $result"; 
} 

curl_close($ch); 

另外,如果捲曲不可用,或者你不想使用它的一些原因,你可以有去my HTTPRequest class,這是符合PHP4,無需擴展(除了用於HTTPS請求的OpenSSL)。記錄在腳本頂部的註釋中(ish)。你會做這樣的事情:

$request = new httprequest(); // Create an object 

// Set the request URL 
if (!$request->setRequestURL('https://pre.corrupt-net.org/search.php?search=Lasse_Stefanz-Bara_Du-SE-CD-FLAC-1995-LoKET')) echo "Failed! Error: ".$request->getLastErrorStr()."<br>\r\n"; 
// Send the request 
if (!$request->sendRequest()) echo "Failed! Error: ".$request->getLastErrorStr()."<br>\r\n"; 

echo "Success! Result: ".$request->getResponseBodyData(TRUE); 

在一個側面說明,很多場景PreDB經理/供應商不在自動刮過於熱衷了,你可以讓自己被禁止......

+0

+1完美答案。 – Boann

+0

感謝您的回覆。我已經試過你的捲髮代碼,試圖發送所有的頭文件,但我仍然沒有迴應。我得到成功但響應變量是空的。我將發佈您發佈的課程的反饋。 編輯:我得到了與捲曲和httprequest相同的結果。這很奇怪,因爲我可以使用標準方式獲取文件lastpred.php: $ string = file_get_contents(「http://pre.corrupt-net.org/lastpred.php」); –