添加到 trunk
+YUCHENG HU+ git-svn-id: https://svn.code.sf.net/p/hawebs/svn@131 a2543c7e-f6e9-4f8a-8bff-1ffc34733512
This commit is contained in:
@@ -0,0 +1,393 @@
|
||||
<?php
|
||||
/*
|
||||
* Filename.......: class_http.php
|
||||
* Author.........: Troy Wolf [troy@troywolf.com]
|
||||
* Last Modified..: Date: 2005/06/21 10:30:00
|
||||
* Description....: Screen-scraping class with caching. Includes image_cache.php
|
||||
companion script. Includes static methods to extract data
|
||||
out of HTML tables into arrays or XML.
|
||||
*/
|
||||
|
||||
class http {
|
||||
var $log;
|
||||
var $dir;
|
||||
var $name;
|
||||
var $filename;
|
||||
var $url;
|
||||
var $port;
|
||||
var $status;
|
||||
var $header;
|
||||
var $body;
|
||||
var $ttl;
|
||||
var $headers;
|
||||
var $postvars;
|
||||
var $connect_timeout;
|
||||
var $data_ts;
|
||||
|
||||
/*
|
||||
The class constructor. Configure defaults.
|
||||
*/
|
||||
function http() {
|
||||
$this->log = "New http() object instantiated.<br />\n";
|
||||
$this->headers = array();
|
||||
$this->postvars = array();
|
||||
$this->ttl = 0;
|
||||
|
||||
/*
|
||||
Seconds to attempt socket connection before giving up.
|
||||
*/
|
||||
$this->connect_timeout = 30;
|
||||
|
||||
/*
|
||||
Set the 'dir' property to the directory where you want to store the cached
|
||||
content. End this value with a "/".
|
||||
*/
|
||||
$this->dir = realpath("./")."/"; //Default to current dir.
|
||||
|
||||
/*
|
||||
Try to use user agent of the user making this request. If not available,
|
||||
default to IE6.0 on WinXP, SP1.
|
||||
*/
|
||||
if (isset($_SERVER['HTTP_USER_AGENT'])) {
|
||||
$this->headers["User-Agent"] = $_SERVER['HTTP_USER_AGENT'];
|
||||
} else {
|
||||
$this->headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
|
||||
}
|
||||
|
||||
/*
|
||||
Set referrer to the current script since in essence, it is the referring
|
||||
page.
|
||||
*/
|
||||
if (substr($_SERVER['SERVER_PROTOCOL'],0,5) == "HTTPS") {
|
||||
$this->headers["Referer"] = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
|
||||
} else {
|
||||
$this->headers["Referer"] = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
fetch() method to get the content. fetch() will use 'ttl' property to
|
||||
determine whether to get the content from the url or the cache.
|
||||
*/
|
||||
function fetch($url="", $ttl=0, $name="", $user="", $pwd="") {
|
||||
$this->log .= "--------------------------------<br />fetch() called<br />\n";
|
||||
$this->log .= "url: ".$url."<br />\n";
|
||||
$this->status = "";
|
||||
$this->header = "";
|
||||
$this->body = "";
|
||||
if (!$url) {
|
||||
$this->log .= "OOPS: You need to pass a URL!<br />";
|
||||
return false;
|
||||
}
|
||||
$this->url = $url;
|
||||
$this->ttl = $ttl;
|
||||
$this->name = $name;
|
||||
$need_to_save = false;
|
||||
if ($this->ttl == "0") {
|
||||
if (!$fh = $this->getFromUrl($url, $user, $pwd)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (strlen(trim($this->name)) == 0) { $this->name = MD5($url); }
|
||||
$this->filename = $this->dir."http_".$this->name;
|
||||
$this->log .= "Filename: ".$this->filename."<br />";
|
||||
$this->getFile_ts();
|
||||
if ($this->ttl == "daily") {
|
||||
if (date('Y-m-d',$this->data_ts) != date('Y-m-d',time())) {
|
||||
$this->log .= "cache has expired<br />";
|
||||
if (!$fh = $this->getFromUrl($url, $user, $pwd)) {
|
||||
return false;
|
||||
}
|
||||
$need_to_save = true;
|
||||
if ($this->getFromUrl()) { return $this->saveToCache(); }
|
||||
} else {
|
||||
if (!$fh = $this->getFromCache()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ((time() - $this->data_ts) >= $this->ttl) {
|
||||
$this->log .= "cache has expired<br />";
|
||||
if (!$fh = $this->getFromUrl($url, $user, $pwd)) {
|
||||
return false;
|
||||
}
|
||||
$need_to_save = true;
|
||||
} else {
|
||||
if (!$fh = $this->getFromCache()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Get response header.
|
||||
*/
|
||||
$this->header = fgets($fh, 1024);
|
||||
$this->status = substr($this->header,9,3);
|
||||
while ((trim($line = fgets($fh, 1024)) != "") && (!feof($fh))) {
|
||||
$this->header .= $line;
|
||||
if ($this->status=="401" and strpos($line,"WWW-Authenticate: Basic realm=\"")===0) {
|
||||
fclose($fh);
|
||||
$this->log .= "Could not authenticate<br />\n";
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Get response body.
|
||||
*/
|
||||
while (!feof($fh)) {
|
||||
$this->body .= fgets($fh, 1024);
|
||||
}
|
||||
fclose($fh);
|
||||
if ($need_to_save) { $this->saveToCache(); }
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
/*
|
||||
PRIVATE getFromUrl() method to scrape content from url.
|
||||
*/
|
||||
function getFromUrl($url, $user="", $pwd="") {
|
||||
global $adb;
|
||||
$this->log .= "getFromUrl() called<br />";
|
||||
preg_match("~([a-z]*://)?([^:^/]*)(:([0-9]{1,5}))?(/.*)?~i", $url, $parts);
|
||||
$protocol = $parts[1];
|
||||
$server = $parts[2];
|
||||
$port = $parts[4];
|
||||
$path = $parts[5];
|
||||
if ($port == "") {
|
||||
if (strtolower($protocol) == "https://") {
|
||||
$port = "443";
|
||||
} else {
|
||||
$port = "80";
|
||||
}
|
||||
}
|
||||
$query = "select * from vtiger_systems where server_type='proxy'";
|
||||
$result = $adb->query($query);
|
||||
$noofrows = $adb->num_rows($result);
|
||||
if($noofrows != 0)
|
||||
{
|
||||
$server = $adb->query_result($result,0,"server");
|
||||
$port = $adb->query_result($result,0,"server_port");
|
||||
$user = $adb->query_result($result,0,"server_username"); // added
|
||||
$pwd = $adb->query_result($result,0,"server_password"); // added
|
||||
}
|
||||
|
||||
if ($path == "") { $path = "/"; }
|
||||
|
||||
if (!$sock = @fsockopen($server, $port, $errno, $errstr, $this->connect_timeout)) {
|
||||
$this->log .= "Could not open connection. Error "
|
||||
.$errno.": ".$errstr."<br />\n";
|
||||
echo '<b><font color="red">Kindly set proxy server settings under Settings tab</font></b>';
|
||||
die;
|
||||
return false;
|
||||
}
|
||||
if (!$sock) {return false;}
|
||||
fputs($sock, "GET $url HTTP/1.0\r\nHost: $server\r\n");
|
||||
fputs($sock, "Proxy-Authorization: Basic " . base64_encode ("$user:$pwd") . "\r\n\r\n");
|
||||
|
||||
|
||||
$this->headers["Host"] = $server;
|
||||
//echo 'server is >>>>>>>>>' .$server;
|
||||
if ($user != "" && $pwd != "") {
|
||||
$this->log .= "Authentication will be attempted<br />\n";
|
||||
$this->headers["Authorization"] = "Basic ".base64_encode($user.":".$pwd);
|
||||
}
|
||||
|
||||
if (count($this->postvars) > 0) {
|
||||
$this->log .= "Variables will be POSTed<br />\n";
|
||||
$request = "POST ".$path." HTTP/1.0\r\n";
|
||||
$post_string = "";
|
||||
foreach ($this->postvars as $key=>$value) {
|
||||
$post_string .= "&".$key."=".$value;
|
||||
}
|
||||
$post_string = substr($post_string,1);
|
||||
$this->headers["Content-Length"] = strlen($post_string);
|
||||
} else {
|
||||
$request = "GET ".$path." HTTP/1.0\r\n";
|
||||
}
|
||||
|
||||
if (fwrite($sock, $request) === FALSE) {
|
||||
fclose($sock);
|
||||
$this->log .= "Error writing request type to socket<br />\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($this->headers as $key=>$value) {
|
||||
if (fwrite($sock, $key.": ".$value."\r\n") === FALSE) {
|
||||
fclose($sock);
|
||||
$this->log .= "Error writing headers to socket<br />\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (fwrite($sock, "\r\n") === FALSE) {
|
||||
fclose($sock);
|
||||
$this->log .= "Error writing end-of-line to socket<br />\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (count($this->postvars) > 0) {
|
||||
if (fwrite($sock, $post_string."\r\n") === FALSE) {
|
||||
fclose($sock);
|
||||
$this->log .= "Error writing POST string to socket<br />\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return $sock;
|
||||
}
|
||||
|
||||
/*
|
||||
PRIVATE getFromCache() method to retrieve content from cache file.
|
||||
*/
|
||||
function getFromCache() {
|
||||
$this->log .= "getFromCache() called<br />";
|
||||
//create file pointer
|
||||
if (!$fp=@fopen($this->filename,"r")) {
|
||||
$this->log .= "Could not open ".$this->filename."<br />";
|
||||
return false;
|
||||
}
|
||||
return $fp;
|
||||
}
|
||||
|
||||
/*
|
||||
PRIVATE saveToCache() method to save content to cache file.
|
||||
*/
|
||||
function saveToCache() {
|
||||
$this->log .= "saveToCache() called<br />";
|
||||
|
||||
//create file pointer
|
||||
if (!$fp=@fopen($this->filename,"w")) {
|
||||
$this->log .= "Could not open ".$this->filename."<br />";
|
||||
return false;
|
||||
}
|
||||
//write to file
|
||||
if (!@fwrite($fp,$this->header."\r\n".$this->body)) {
|
||||
$this->log .= "Could not write to ".$this->filename."<br />";
|
||||
fclose($fp);
|
||||
return false;
|
||||
}
|
||||
//close file pointer
|
||||
fclose($fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
PRIVATE getFile_ts() method to get cache file modified date.
|
||||
*/
|
||||
function getFile_ts() {
|
||||
$this->log .= "getFile_ts() called<br />";
|
||||
if (!file_exists($this->filename)) {
|
||||
$this->data_ts = 0;
|
||||
$this->log .= $this->filename." does not exist<br />";
|
||||
return false;
|
||||
}
|
||||
$this->data_ts = filemtime($this->filename);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
Static method table_into_array()
|
||||
Generic function to return data array from HTML table data
|
||||
rawHTML: the page source
|
||||
needle: optional string to start parsing source from
|
||||
needle_within: 0 = needle is BEFORE table, 1 = needle is within table
|
||||
allowed_tags: list of tags to NOT strip from data, e.g. "<a><b>"
|
||||
*/
|
||||
function table_into_array($rawHTML,$needle="",$needle_within=0,$allowed_tags="") {
|
||||
$upperHTML = strtoupper($rawHTML);
|
||||
$idx = 0;
|
||||
if (strlen($needle) > 0) {
|
||||
$needle = strtoupper($needle);
|
||||
$idx = strpos($upperHTML,$needle);
|
||||
if ($idx === false) { return false; }
|
||||
if ($needle_within == 1) {
|
||||
$cnt = 0;
|
||||
while(($cnt < 100) && (substr($upperHTML,$idx,6) != "<TABLE")) {
|
||||
$idx = strrpos(substr($upperHTML,0,$idx-1),"<");
|
||||
$cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
$aryData = array();
|
||||
$rowIdx = 0;
|
||||
/* If this table has a header row, it may use TD or TH, so
|
||||
check special for this first row. */
|
||||
$tmp = strpos($upperHTML,"<TR",$idx);
|
||||
if ($tmp === false) { return false; }
|
||||
$tmp2 = strpos($upperHTML,"</TR>",$tmp);
|
||||
if ($tmp2 === false) { return false; }
|
||||
$row = substr($rawHTML,$tmp,$tmp2-$tmp);
|
||||
$pattern = "/<TH>|<TH\ |<TD>|<TD\ /";
|
||||
preg_match($pattern,strtoupper($row),$matches);
|
||||
$hdrTag = $matches[0];
|
||||
|
||||
while ($tmp = strpos(strtoupper($row),$hdrTag) !== false) {
|
||||
$tmp = strpos(strtoupper($row),">",$tmp);
|
||||
if ($tmp === false) { return false; }
|
||||
$tmp++;
|
||||
$tmp2 = strpos(strtoupper($row),"</T");
|
||||
$aryData[$rowIdx][] = trim(strip_tags(substr($row,$tmp,$tmp2-$tmp),$allowed_tags));
|
||||
$row = substr($row,$tmp2+5);
|
||||
preg_match($pattern,strtoupper($row),$matches);
|
||||
$hdrTag = $matches[0];
|
||||
}
|
||||
$idx = strpos($upperHTML,"</TR>",$idx)+5;
|
||||
$rowIdx++;
|
||||
|
||||
/* Now parse the rest of the rows. */
|
||||
$tmp = strpos($upperHTML,"<TR",$idx);
|
||||
if ($tmp === false) { return false; }
|
||||
$tmp2 = strpos($upperHTML,"</TABLE>",$idx);
|
||||
if ($tmp2 === false) { return false; }
|
||||
$table = substr($rawHTML,$tmp,$tmp2-$tmp);
|
||||
|
||||
while ($tmp = strpos(strtoupper($table),"<TR") !== false) {
|
||||
$tmp2 = strpos(strtoupper($table),"</TR");
|
||||
if ($tmp2 === false) { return false; }
|
||||
$row = substr($table,$tmp,$tmp2-$tmp);
|
||||
|
||||
while ($tmp = strpos(strtoupper($row),"<TD") !== false) {
|
||||
$tmp = strpos(strtoupper($row),">",$tmp);
|
||||
if ($tmp === false) { return false; }
|
||||
$tmp++;
|
||||
$tmp2 = strpos(strtoupper($row),"</TD");
|
||||
$aryData[$rowIdx][] = trim(strip_tags(substr($row,$tmp,$tmp2-$tmp),$allowed_tags));
|
||||
$row = substr($row,$tmp2+5);
|
||||
}
|
||||
$table = substr($table,strpos(strtoupper($table),"</TR>")+5);
|
||||
$rowIdx++;
|
||||
}
|
||||
return $aryData;
|
||||
}
|
||||
|
||||
/*
|
||||
Static method table_into_xml()
|
||||
Generic function to return xml dataset from HTML table data
|
||||
rawHTML: the page source
|
||||
needle: optional string to start parsing source from
|
||||
allowedTags: list of tags to NOT strip from data, e.g. "<a><b>"
|
||||
*/
|
||||
function table_into_xml($rawHTML,$needle="",$needle_within=0,$allowedTags="") {
|
||||
if (!$aryTable = http::table_into_array($rawHTML,$needle,$needle_within,$allowedTags)) { return false; }
|
||||
$xml = "<?xml version=\"1.0\" standalone=\"yes\" ?>\n";
|
||||
$xml .= "<TABLE>\n";
|
||||
$rowIdx = 0;
|
||||
foreach ($aryTable as $row) {
|
||||
$xml .= "\t<ROW id=\"".$rowIdx."\">\n";
|
||||
$colIdx = 0;
|
||||
foreach ($row as $col) {
|
||||
$xml .= "\t\t<COL id=\"".$colIdx."\">".trim(utf8_encode(htmlspecialchars($col)))."</COL>\n";
|
||||
$colIdx++;
|
||||
}
|
||||
$xml .= "\t</ROW>\n";
|
||||
$rowIdx++;
|
||||
}
|
||||
$xml .= "</TABLE>";
|
||||
return $xml;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
/*
|
||||
* Filename.......: image_cache.php
|
||||
* Author.........: Troy Wolf [troy@troywolf.com]
|
||||
* Last Modified..: Date: 2005/06/21 10:30:00
|
||||
* Description....: Companion script to clas_http.php. When used in conjunction
|
||||
with class_http.php, can be used to "screen-scrape" images
|
||||
and cache them locally for any number of seconds. You use
|
||||
this script in-line within img tags like so:
|
||||
<img src="image_cache.php?ttl=300&url=http%3A%2F%2Fwww.somedomain.com%2Fsomeimage.gif" />
|
||||
(You must url encode the url within the src attribute.)
|
||||
*/
|
||||
|
||||
/*
|
||||
Include the http class. Modify path according to where you put the class
|
||||
file.
|
||||
*/
|
||||
require_once('class_http.php');
|
||||
|
||||
$h = new http();
|
||||
$h->fetch($_GET['url'], $_GET['ttl']);
|
||||
header("Content-Type: image/jpeg");
|
||||
echo $h->body;
|
||||
?>
|
||||
Reference in New Issue
Block a user