table

          一個用PHP fsockopen寫的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;    //$okurl = "http://".$this->HomeUrl.$surl;
              }
              else if($surl[0]==".")
              {
                if(strlen($surl)<=2) return "";          //是不是應該是if(strlen($surl)<=1) return "";
                else if($surl[0]=="/")                   //是不是應該是else if($surl[1]=="/")      
                {
                        $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里面只要一句$okurl = "http://".$this->BaseUrlPath."/".$surl;就夠了吧?
               //調用FillUrl函數的前提好象是URL中不包含“http://”
              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;
            }
          }
          ?>

          posted on 2009-02-25 10:21 小卓 閱讀(373) 評論(0)  編輯  收藏 所屬分類: php

          主站蜘蛛池模板: 新巴尔虎左旗| 滨海县| 张家港市| 定兴县| 辽中县| 新竹市| 通江县| 聊城市| 邵阳县| 黄大仙区| 白朗县| 商城县| 藁城市| 永定县| 枣阳市| 镇远县| 景洪市| 太仆寺旗| 雅安市| 毕节市| 福贡县| 合江县| 锦屏县| 息烽县| 黔江区| 广汉市| 上杭县| 平顺县| 江孜县| 麻城市| 锡林浩特市| 崇文区| 南华县| 黑龙江省| 军事| 广昌县| 乡城县| 谢通门县| 厦门市| 越西县| 疏附县|