http://www.abc.com/showv " /> 猫色网站,麻豆精品传媒一二三区在线视频,国产视频福利在线

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

發布一個用PHP fsockopen寫的HTTP下載的類

如果支持打開遠程內容的選項的話,實際上php用fopen或file_get_contents都能獲得一個網頁的內容,但是默認的函數有個不足的地方就是無法獲取HTTP頭,這在一些特殊的應用中很不方便,如,有一個鏈接:

http://www.abc.com/showvd.ASP?id=18 

假如它返回的是一個圖片,用默認函數就很難識別,但如果通過HTTP應答頭來判斷就簡單多了,此外如果對方通過 Refer 來防盜鏈的話,也是無法獲取的,用HTTP類就能完美解決這些問題,而且速度也相差無幾。


使用方法:

$hd = new DedeHttpDown();
$hd->OpenUrl("http://www.dedecms.com");
echo $hd->GetHtml();
//如果保存為文件則用 $hd->SaveBin("dede.html");
$hd->Close();

獲得http請求頭用
$hd->GetHead("key")
設置請求頭
$hd->SetHead(key,value); (必須在調用 OpenUrl 之前設定)


代碼如下:

<?
/* ---------------------------------------------------------------------
//織夢Http下載類V1.0
//出自:織夢之旅 http://www.dedecms.com
//作者: IT柏拉圖
//時間: 2005-11-13 12:39
//聲明: 首發在落伍者網站,轉載請保留版權信息
--------------------------------------------------------------------- */
class DedeHttpDown
{
        var $m_url = "";
        var $m_urlpath = "";
        var $m_scheme = "http";
        var $m_host = "";
        var $m_port = "80";
        var $m_user = "";
        var $m_pass = "";
        var $m_path = "/";
        var $m_query = "";
        var $m_fp = "";
        var $m_error = "";
        var $m_httphead = "" ;
        var $m_html = "";
        var $m_puthead = "";
        var $BaseUrlPath = "";
        var $HomeUrl = "";
        var $JumpCount = 0;//防止多重重定向陷入死循環
        //
        //初始化系統
        //
        function PrivateInit($url)
        {
                        if($url=="") return ;
                        $urls = "";
                        $urls = @parse_url($url);
                        $this->m_url = $url;
            if(is_array($urls))
            {
                          $this->m_host = $urls["host"];
                          if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"];

                          if(!empty($urls["user"])){
                                        $this->m_user = $urls["user"];
                          }

                          if(!empty($urls["pass"])){
                                        $this->m_pass = $urls["pass"];
                          }

                          if(!empty($urls["port"])){
                                        $this->m_port = $urls["port"];
                          }

                          if(!empty($urls["path"])) $this->m_path = $urls["path"];
                          $this->m_urlpath = $this->m_path;

                          if(!empty($urls["query"])){
                                        $this->m_query = $urls["query"];
                                        $this->m_urlpath .= "?".$this->m_query;
                          }
                          $this->HomeUrl = $urls["host"];
                          $this->BaseUrlPath = $this->HomeUrl.$urls["path"];
                          $this->BaseUrlPath = ereg_replace("/([^/]*)/.(.*)$","/",$this->BaseUrlPath);
                          $this->BaseUrlPath = ereg_replace("/$","",$this->BaseUrlPath);
                 }
        }
        //
        //打開指定網址
        //
        function OpenUrl($url)
        {
                //重設各參數
                $this->m_url = "";
                $this->m_urlpath = "";
                $this->m_scheme = "http";
                $this->m_host = "";
                $this->m_port = "80";
                $this->m_user = "";
                $this->m_pass = "";
                $this->m_path = "/";
                $this->m_query = "";
                $this->m_error = "";
                $this->JumpCount = 0;
                $this->m_httphead = Array() ;
                //$this->m_puthead = "";
                $this->m_html = "";
                $this->Close();
                //初始化系統
                $this->PrivateInit($url);
                $this->PrivateStartSession();
        }
        //
        //打開303重定向網址
        //
        function JumpOpenUrl($url)
        {
                //重設各參數
                $this->m_url = "";
                $this->m_urlpath = "";
                $this->m_scheme = "http";
                $this->m_host = "";
                $this->m_port = "80";
                $this->m_user = "";
                $this->m_pass = "";
                $this->m_path = "/";
                $this->m_query = "";
                $this->m_error = "";
                $this->JumpCount++;
                $this->m_httphead = Array() ;
                $this->m_html = "";
                $this->Close();
                //初始化系統
                $this->PrivateInit($url);
                $this->PrivateStartSession();
        }
        //
        //獲得某操作錯誤的原因
        //
        function printError()
        {
                echo "錯誤信息:".$this->m_error;
                echo "具體返回頭:<br>";
                foreach($this->m_httphead as $k=>$v)
                { echo "$k => $v <br>/r/n"; }
        }
        //
        //判別用Get方法發送的頭的應答結果是否正確
        //
        function IsGetOK()
        {
                if( ereg("^2",$this->GetHead("http-state")) )
                {        return true; }
                else
                {
                        $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br>";
                        return false;
                }
        }
        //
        //看看返回的網頁是否是text類型
        //
        function IsText()
        {
                if(ereg("^2",$this->GetHead("http-state"))
                        && eregi("^text",$this->GetHead("content-type")))
                {        return true; }
                else
                {
                        $this->m_error .= "內容為非文本類型或網址重定向<br>";
                        return false;
                }
        }
        //
        //判斷返回的網頁是否是特定的類型
        //
        function IsContentType($ctype)
        {
                if(ereg("^2",$this->GetHead("http-state"))
                        && $this->GetHead("content-type")==strtolower($ctype))
                {        return true; }
                else
                {
                        $this->m_error .= "類型不對 ".$this->GetHead("content-type")."<br>";
                        return false;
                }
        }
        //
        //用Http協議下載文件
        //
        function SaveToBin($savefilename)
        {
                if(!$this->IsGetOK()) return false;
                if(@feof($this->m_fp)) { $this->m_error = "連接已經關閉!"; return false; }
                $fp = fopen($savefilename,"w");
                while(!feof($this->m_fp)){
                        fwrite($fp,fread($this->m_fp,1024));
                }
                fclose($this->m_fp);

                fclose($fp);
                return true;
        }
        //
        //保存網頁內容為Text文件
        //
        function SaveToText($savefilename)
        {
                if($this->IsText()) $this->SaveBinFile($savefilename);
                else return "";
        }
        //
        //用Http協議獲得一個網頁的內容
        //
        function GetHtml()
        {
                if(!$this->IsText()) return "";
                if($this->m_html!="") return $this->m_html;
                if(!$this->m_fp||@feof($this->m_fp)) return "";
                while(!feof($this->m_fp)){
                        $this->m_html .= fgets($this->m_fp,256);
                }
                @fclose($this->m_fp);
                return $this->m_html;
        }
        //
        //開始HTTP會話
        //
        function PrivateStartSession()
        {

                if(!$this->PrivateOpenHost()){
                        $this->m_error .= "打開遠程主機出錯!";
                        return false;
                }

                if($this->GetHead("http-edition")=="HTTP/1.1") $httpv = "HTTP/1.1";
                else $httpv = "HTTP/1.0";

                //發送固定的起始請求頭GET、Host信息
                fputs($this->m_fp,"GET ".$this->m_urlpath." $httpv/r/n");
                $this->m_puthead["Host"] = $this->m_host;

                //發送用戶自定義的請求頭
                if(!isset($this->m_puthead["Accept"])) { $this->m_puthead["Accept"] = "*/*"; }
                if(!isset($this->m_puthead["User-Agent"])) { $this->m_puthead["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)"; }
                if(!isset($this->m_puthead["Refer"])) { $this->m_puthead["Refer"] = "http://".$this->m_puthead["Host"]; }
                foreach($this->m_puthead as $k=>$v){
                        $k = trim($k);
                        $v = trim($v);
                        if($k!=""&&$v!=""){
                                fputs($this->m_fp,"$k: $v/r/n");
                        }
                }

                //發送固定的結束請求頭
                //HTTP1.1協議必須指定文檔結束后關閉鏈接,否則讀取文檔時無法使用feof判斷結束
                if($httpv=="HTTP/1.1") fputs($this->m_fp,"Connection: Close/r/n/r/n");
                else fputs($this->m_fp,"/r/n");

                //獲取應答頭狀態信息
                $httpstas = explode(" ",fgets($this->m_fp,256));
                $this->m_httphead["http-edition"] = trim($httpstas[0]);
                $this->m_httphead["http-state"] = trim($httpstas[1]);
                $this->m_httphead["http-describe"] = "";
                for($i=2;$i<count($httpstas);$i++){
                        $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]);
                }
                //獲取詳細應答頭
                while(!feof($this->m_fp)){
                        $line = trim(fgets($this->m_fp,256));
                        if($line == "") break;
                        $hkey = "";
                        $hvalue = "";
                        $v = 0;
                        for($i=0;$i<strlen($line);$i++){
                                if($v==1) $hvalue .= $line[$i];
                                if($line[$i]==":") $v = 1;
                                if($v==0) $hkey .= $line[$i];
                        }
                        $hkey = trim($hkey);
                        if($hkey!="") $this->m_httphead[strtolower($hkey)] = trim($hvalue);
                }
                //判斷是否是3xx開頭的應答
                if(ereg("^3",$this->m_httphead["http-state"]))
                {
                        if($this->JumpCount > 3) return;
                        if(isset($this->m_httphead["location"])){
                                $newurl = $this->m_httphead["location"];
                                if(eregi("^http",$newurl)){
                                        $this->JumpOpenUrl($newurl);
                                }
                                else{
                                        $newurl = $this->FillUrl($newurl);
                                        $this->JumpOpenUrl($newurl);
                                }
                        }
                        else
                        {        $this->m_error = "無法識別的轉移應答!"; }
                }//
        }
        //
        //獲得一個Http頭的值
        //
        function GetHead($headname)
        {
                $headname = strtolower($headname);
                if(isset($this->m_httphead[$headname]))
                        return $this->m_httphead[$headname];
                else
                        return "";
        }
        //
        //設置Http頭的值
        //
        function SetHead($skey,$svalue)
        {
                $this->m_puthead[$skey] = $svalue;
        }
        //
        //打開連接
        //
        function PrivateOpenHost()
        {
                if($this->m_host=="") return false;
                $this->m_fp = @fsockopen($this->m_host, $this->m_port, &$errno, &$errstr,10);
                if(!$this->m_fp){
                        $this->m_error = $errstr;
                        return false;
                }
                else{
                        return true;
                }
        }
        //
        //關閉連接
        //
        function Close(){
                @fclose($this->m_fp);
        }
        //
        //補全相對網址
        //
        function FillUrl($surl)
  {
    $i = 0;
    $dstr = "";
    $pstr = "";
    $okurl = "";
    $pathStep = 0;
    $surl = trim($surl);
    if($surl=="") return "";
    $pos = strpos($surl,"#");
    if($pos>0) $surl = substr($surl,0,$pos);
    if($surl[0]=="/"){
            $okurl = "http://".$this->HomeUrl."/".$surl;
    }
    else if($surl[0]==".")
    {
      if(strlen($surl)<=2) return "";
      else if($surl[0]=="/")
      {
              $okurl = "http://".$this->BaseUrlPath."/".substr($surl,2,strlen($surl)-2);
            }
      else{
        $urls = explode("/",$surl);
        foreach($urls as $u){
          if($u=="..") $pathStep++;
          else if($i<count($urls)-1) $dstr .= $urls[$i]."/";
          else $dstr .= $urls[$i];
          $i++;
        }
        $urls = explode("/",$this->BaseUrlPath);
        if(count($urls) <= $pathStep)
                return "";
        else{
          $pstr = "http://";
          for($i=0;$i<count($urls)-$pathStep;$i++)
          { $pstr .= $urls[$i]."/"; }
          $okurl = $pstr.$dstr;
        }
      }
    }
    else
    {
      if(strlen($surl)<7)
        $okurl = "http://".$this->BaseUrlPath."/".$surl;
      else if(strtolower(substr($surl,0,7))=="http://")
        $okurl = $surl;
      else
        $okurl = "http://".$this->BaseUrlPath."/".$surl;
    }
    $okurl = eregi_replace("^(http://)","",$okurl);
    $okurl = eregi_replace("/{1,}","/",$okurl);
    return "http://".$okurl;
  }
}
?>

php技術發布一個用PHP fsockopen寫的HTTP下載的類,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲激情综合 | 国产精品免费久久久久影院小说 | 青青伊人91久久福利精品 | 色哟哟网站在线观看 | h网站亚洲 | 精品国产夜色在线 | 久久影视一区 | 日本在线一区二区 | 青青自拍视频一区二区三区 | 国产激情在线观看 | 热99re久久精品香蕉 | 国产成人鲁鲁免费视频a | 在线欧美色 | 欧美特黄一级片 | 国产一区免费在线观看 | 午夜在线播放视频 | 日本高清视频成人网www | 亚洲国产精品久久久天堂麻豆 | 国产精品成人免费视频 | 麻豆精品91 | 亚洲色图偷 | 国产福利专区精品视频 | 精品欧美一区二区三区四区 | 六月婷婷在线视频 | 天天干网址 | 久久91精品久久91综合 | 国产午夜毛片 | 福利片欧美| 亚洲伊人色图 | 成年视频在线 | 一区精品麻豆经典 | 97午夜视频 | 欧洲精品码一区二区三区免费看 | 久久91亚洲精品中文字幕 | 亚洲国产激情 | 国产成人精品三级 | 婷婷色影院 | 特黄一级毛片 | 5月色婷婷| 欧洲免费无线码二区5 | 久久综合网久久综合 |