欢迎来到虎佩网_虎佩_hupei_hupeinet_hupei.net!
当前位置:首页 > PHP Web开发 > php实例 > 获取远程文件内容之浏览器模拟器(BrowserEmulator) 内容

获取远程文件内容之浏览器模拟器(BrowserEmulator)

选择字号: 超大 标准 发布时间:2015-09-06 17:37 | 作者:hupei

出于安全的考虑,常常会关闭fopen, file_get_contents, 也就是会把 allow_url_fopen设置为OFF,如果想要继续使用这些函数,就可以用到这个类。

 

 

Php代码  收藏代码
  1. <?php  
  2.   
  3.   
  4. /* used for the transmission RPC connection  
  5.  * and the SABnzbd+ file submit  
  6.  */  
  7.   
  8.   
  9. /*************************************************************************** 
  10.  
  11.  
  12. Browser Emulating file functions v2.0.1-torrentwatch 
  13. (c) Kai Blankenhorn 
  14. www.bitfolge.de/browseremulator 
  15. kaib@bitfolge.de 
  16.  
  17.  
  18.  
  19.  
  20. This program is free software; you can redistribute it and/or 
  21. modify it under the terms of the GNU General Public License 
  22. as published by the Free Software Foundation; either version 2 
  23. of the License, or (at your option) any later version. 
  24.  
  25.  
  26. This program is distributed in the hope that it will be useful, 
  27. but WITHOUT ANY WARRANTY; without even the implied warranty of 
  28. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  29. GNU General Public License for more details. 
  30.  
  31.  
  32. You should have received a copy of the GNU General Public License 
  33. along with this program; if not, write to the Free Software 
  34. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  35.  
  36.  
  37. **************************************************************************** 
  38.  
  39.  
  40. Changelog: 
  41.  
  42.  
  43. v2.0.1-torrentwatch2 by Erik Bernhardson 
  44.   multi-part post with file submit 
  45.  
  46.  
  47. v2.0.1-torrentwatch by Erik Bernhardson 
  48.   converted file() to file_get_contents() 
  49.   converted lastResponse to string from array to mimic file_get_contents 
  50.   added gzip compression support 
  51.  
  52.  
  53. v2.0.1 
  54.   fixed authentication bug 
  55.   added global debug switch 
  56.  
  57.  
  58. v2.0   03-09-03 
  59.   added a wrapper class; this has the advantage that you no longer need 
  60.     to specify a lot of parameters, just call the methods to set 
  61.     each option 
  62.   added option to use a special port number, may be given by setPort or 
  63.     as part of the URL (e.g. server.com:80) 
  64.   added getLastResponseHeaders() 
  65.  
  66.  
  67. v1.5 
  68.   added Basic HTTP user authorization 
  69.   minor optimizations 
  70.  
  71.  
  72. v1.0 
  73.   initial release 
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80. ***************************************************************************/  
  81.   
  82.   
  83. /** 
  84. * BrowserEmulator class. Provides methods for opening urls and emulating 
  85. * a web browser request. 
  86. **/  
  87. class BrowserEmulator {  
  88.   var $headerLines = Array();  
  89.   var $postData = Array();  
  90.   var $multiPartPost = False;  
  91.   var $authUser = "";  
  92.   var $authPass = "";  
  93.   var $port;  
  94.   var $lastResponse = '';  
  95.   var $lastRequest = '';  
  96.   var $debug = false;  
  97.   var $customHttp = False;  
  98.    
  99.   public function BrowserEmulator() {  
  100.     $this->resetHeaderLines();  
  101.     $this->resetPort();  
  102.   }  
  103.     /** 
  104.   * Adds a single header field to the HTTP request header. The resulting header 
  105.   * line will have the format 
  106.   * $name: $value\n 
  107.   **/  
  108.   public function addHeaderLine($name$value) {  
  109.     $this->headerLines[$name] = $value;  
  110.   }  
  111.    
  112.   /** 
  113.   * Deletes all custom header lines. This will not remove the User-Agent header field, 
  114.   * which is necessary for correct operation. 
  115.   **/  
  116.   public function resetHeaderLines() {  
  117.     $this->headerLines = Array();  
  118.      
  119.     /*******************************************************************************/  
  120.     /**************   YOU MAX SET THE USER AGENT STRING HERE   *******************/  
  121.     /*                                                   */  
  122.     /* default is "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",         */  
  123.     /* which means Internet Explorer 6.0 on WinXP                       */  
  124.      
  125.     $this->headerLines["User-Agent"] = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10';  
  126.   
  127.   
  128.     /*******************************************************************************/  
  129.     /** 
  130.     * Set default to accept gzip encoded files 
  131.     */  
  132.     $this->headerLines["Accept-Encoding"] = "*/*";  
  133.   }  
  134.    
  135.   /**  
  136.   * Add a post parameter. Post parameters are sent in the body of an HTTP POST request.  
  137.   **/  
  138.   public function addPostData($name$value = '') {  
  139.     $this->postData[$name] = $value;  
  140.   }  
  141.    
  142.   /** 
  143.   * Deletes all custom post parameters. 
  144.   **/  
  145.   public function resetPostData() {  
  146.     $this->postData = Array();  
  147.   }  
  148.   
  149.   
  150.   public function handleMultiPart() {  
  151.     $boundry = '----------------------------795088511166260704540879626';  
  152.   
  153.   
  154.     $this->headerLines["Accept"] = ' text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';  
  155.     $this->headerLines["Connection"] = 'Close';  
  156.     $this->headerLines["Content-Type"] = "multipart/form-data; boundary=$boundry";  
  157.     $out = '';  
  158.     foreach($this->postData as $item => $data) {  
  159.       if(is_array($data)) {  
  160.         $out .= "--$boundry\r\n"  
  161.                ."Content-Disposition: form-data; name=\"$item\"; filename=\"{$data['filename']}\"\r\n"  
  162.                ."Content-Type: application/octet-stream\r\n"  
  163.                ."\r\n"  
  164.                .$data['contents']."\r\n";  
  165.       } else {  
  166.         $out .= "--$boundry\r\n"  
  167.                ."Content-Disposition: form-data; name=\"$item\"\r\n"  
  168.                ."\r\n"  
  169.                .$data."\r\n";  
  170.       }  
  171.     }  
  172.     $out .= "--{$boundry}--\r\n";  
  173.     return $out;  
  174.   }  
  175.   
  176.   
  177.   /**  
  178.   * Sets an auth user and password to use for the request.  
  179.   * Set both as emptyempty strings to disable authentication.  
  180.   **/  
  181.   public function setAuth($user$pass) {  
  182.     $this->authUser = $user;  
  183.     $this->authPass = $pass;  
  184.   }  
  185.   /** 
  186.   * Selects a custom port to use for the request. 
  187.   **/  
  188.   public function setPort($portNumber) {  
  189.     $this->port = $portNumber;  
  190.   }  
  191.    
  192.   /** 
  193.   * Resets the port used for request to the HTTP default (80). 
  194.   **/  
  195.   public function resetPort() {  
  196.     $this->port = 80;  
  197.   }  
  198.   
  199.   
  200.   /** 
  201.    * Parse any cookies set in the URL, and return the trimed string 
  202.    **/  
  203.   public function preparseURL($url) {  
  204.     if($cookies = stristr($url':COOKIE:')) {  
  205.       $url = rtrim(substr($url, 0, -strlen($cookies)), '&');  
  206.       $this->addHeaderLine("Cookie"'$Version=1; '.strtr(substr($cookies, 8), '&'';'));  
  207.     }  
  208.     return $url;  
  209.   }  
  210.   
  211.   
  212.   /** 
  213.   * Make an fopen call to $url with the parameters set by previous member 
  214.   * method calls. Send all set headers, post data and user authentication data. 
  215.   * Returns a file handle on success, or false on failure. 
  216.   **/  
  217.   public function fopen($url) {  
  218.     $url = $this->preparseURL($url);  
  219.     $this->lastResponse = Array();  
  220.      
  221.     $parts = parse_url($url);  
  222.     $protocol = $parts['scheme'];  
  223.     $server = $parts['host'];  
  224.     $port = $parts['port'];  
  225.     $path = $parts['path'];  
  226.     if(isset($parts['query'])) {  
  227.       $path .= '?'.$parts['query'];  
  228.     }  
  229.   
  230.   
  231.     if($protocol == 'https') {  
  232.       // TODO: https is locked to port 443, why?  
  233.       $server = 'ssl://'.$server;  
  234.       $this->setPort(443);  
  235.     } elseif ($port!="") {  
  236.         $this->setPort($port);  
  237.     }  
  238.     if ($path==""$path = "/";  
  239.     $socket = false;  
  240.     $socket = fsockopen($server$this->port);  
  241.     if ($socket) {  
  242.         if ($this->authUser!="" && $this->authPass!="") {  
  243.           $this->headerLines["Authorization"] = "Basic ".base64_encode($this->authUser.":".$this->authPass);  
  244.         }  
  245.         
  246.         if($this->customHttp)  
  247.           $request = $this->customHttp." $path\r\n";  
  248.         elseif (count($this->postData)==0)  
  249.           $request = "GET $path HTTP/1.0\r\n";  
  250.         else  
  251.           $request = "POST $path HTTP/1.1\r\n";  
  252.   
  253.   
  254.         $request .= "Host: {$parts['host']}\r\n";  
  255.          
  256.         if ($this->debug) echo $request;  
  257.         if (count($this->postData)>0) {  
  258.           if($this->multiPartPost) {  
  259.             $PostString = $this->handleMultiPart();  
  260.           } else {  
  261.             $PostStringArray = Array();  
  262.             foreach ($this->postData AS $key=>$value) {  
  263.               if(emptyempty($value))  
  264.                 $PostStringArray[] = $key;  
  265.               else  
  266.                 $PostStringArray[] = "$key=$value";  
  267.             }  
  268.             $PostString = join("&"$PostStringArray);  
  269.           }  
  270.           $this->headerLines["Content-Length"] = strlen($PostString);  
  271.         }  
  272.          
  273.         foreach ($this->headerLines AS $key=>$value) {  
  274.           if ($this->debug) echo "$key: $value\n";  
  275.           $request .= "$key: $value\r\n";  
  276.         }  
  277.         if ($this->debug) echo "\n";  
  278.         $request .= "\r\n";  
  279.         if (count($this->postData)>0) {  
  280.           $request .= $PostString;  
  281.         }  
  282.     }  
  283.     $this->lastRequest = $request;  
  284.   
  285.   
  286.     for ($written = 0; $written < strlen($request); $written += $fwrite) {  
  287.       $fwrite = fwrite($socketsubstr($request$written));  
  288.       if (!$fwrite) {  
  289.         break;  
  290.       }  
  291.     }  
  292.     if ($this->debug) echo "\n";  
  293.     if ($socket) {  
  294.       $line = fgets($socket);  
  295.       if ($this->debug) echo $line;  
  296.       $this->lastResponse .= $line;  
  297.       $status = substr($line,9,3);  
  298.       while (trim($line = fgets($socket)) != ""){  
  299.         if ($this->debug) echo "$line";  
  300.         $this->lastResponse .= $line;  
  301.         if ($status=="401" AND strpos($line,"WWW-Authenticate: Basic realm=\"")===0) {  
  302.           fclose($socket);  
  303.           return FALSE;  
  304.         }  
  305.       }  
  306.     }  
  307.     return $socket;  
  308.   }  
  309.     
  310.   /** 
  311.   * Make an file call to $url with the parameters set by previous member 
  312.   * method calls. Send all set headers, post data and user authentication data. 
  313.   * Returns the requested file as a string on success, or false on failure. 
  314.   **/  
  315.   public function file_get_contents($url) {  
  316.     if(file_exists($url)) // local file  
  317.       return file_get_contents($url);  
  318.     $file = '';  
  319.     $socket = $this->fopen($url);  
  320.     if ($socket) {  
  321.         while (!feof($socket)) {  
  322.           $file .= fgets($socket);  
  323.         }  
  324.     } else {  
  325.         Yii::log('Browser Emulator: file_get_contents bad socket', CLogger::LEVEL_ERROR);  
  326.         return FALSE;  
  327.     }  
  328.     fclose($socket);  
  329.   
  330.   
  331.     if(strstr($this->lastResponse, 'Content-Encoding: gzip') !== FALSE) {  
  332.       if(function_exists('gzinflate')) {  
  333.         $file = gzinflate(substr($file,10));  
  334.         if($this->debug) echo "Result file: ".$file;  
  335.       }  
  336.     }  
  337.   
  338.   
  339.     return $file;  
  340.   }  
  341.   
  342.   
  343.   /** 
  344.    * Simulate a file() call by exploding file_get_contents() 
  345.    **/  
  346.   public function file($url) {  
  347.     $data = $this->file_get_contents($url);  
  348.     if($data)  
  349.       return explode('\n'$data);  
  350.     return False;  
  351.   }  
  352.    
  353.   public function getLastResponseHeaders() {  
  354.     return $this->lastResponse;  
  355.   }  
  356. }  

 

 

实例:

 

Php代码  收藏代码
  1. $be = new BrowserEmulator();  
  2.   
  3. $output = $be->file_get_contents("http://tvbinz.net/rss.php");  
  4. $response = $be->getLastResponseHeaders();  
  5.   
  6. echo $output;  

 

 

 

来源: http://code.google.com/p/torrentwatch/source/browse/branches/yii/protected/components/downloadClients/browserEmulator.php?spec=svn780&r=780

 

 

关联:

PHP获取远程文件内容

 

 

 

Php代码  收藏代码
  1. function curl_get_contents($url)  
  2. {  
  3.     $dir = pathinfo($url);  
  4.     $host = $dir['dirname'];  
  5.     $refer = $host.'/';  
  6.   
  7.     $ch = curl_init($url);  
  8.     curl_setopt ($ch, CURLOPT_REFERER, $refer);  
  9.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
  10.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  11.     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);  
  12.     $data = curl_exec($ch);  
  13.     curl_close($ch);  
  14.       
  15.     return $data;  
  16. }  

 

 

 


网站分类
最新文章
随机文章