Описания класса, его функций и внутри-классовых переменных :
Переменные :
timeout - время тайм аута для запросов ( Стандартно : 30 ( int ) )
user_agent - значения заголовка User-Agent в запросах ( Стандартно : FALSE ( bool ), что значит что этого заголовка в запросах вообще не будет )
cookies - кукис заголовки в запросах ( идут в формате "имя_куки=его_значение;" ) ( Стандартно : FALSE ( bool ), что значит что этого заголовка в запросах вообще не будет )
referer - значения заголовка Referer в запросах ( Стандартно : FALSE ( bool ), что значит что этого заголовка в запросах вообще не будет )
proxy_host, proxy_port - хост и порт прокси через который будут идти запросы ( Стандартно : FALSE ( bool ), что значит что прокси выключен )
Функции :
get ($url ( string ), $avars ( array ), $headers ( array )) - запрос типа GET, $avars - данные запроса, $headers - дополнительные заголовки, возвращает ответ сервера на запрос.
post ($url ( string ), $avars ( array ), $headers ( array )) - запрос типа POST, $avars - данные запроса ( без них функция не выполниться ), $headers - дополнительные заголовки, возвращает ответ сервера на запрос.
post_file ($url ( string ), $avars ( array ), $headers ( array )) - запрос типа POST который в себе еще передает файл, $avars - данные запроса ( без них функция не выполниться ) ( должны идти массивом следущего типа :
$avars['type'] => 'link' ( тип - ссылка на локальный файл для загрузки ( так как реализованно посредством функции file_get_contents можно попробовать и удаленные файлы)) || 'content' ( тип - содержимое )
$avars['value'] => 'value' ( если тип - ссылка тогда здесь должна быть ссылка на файл, если же content то содержимое файла закодированое посредством функции base64_encode )
$avars['filename'] => 'filename' ( имя файла в запросе )
), возвращает ответ сервера на запрос.
generate_user_agent ($type ( string ), $random ( bool ), $uaid ( int )) - сгенерировать значение для внутри-классовой переменной user_agent, есть да типа для генерации или браузеры ( browser ) или боты ( bot ), $random будет случайно генерироваться или будет генерировать определенный юзер_агент, $uaid номер юзер_агента в массиве. ( Вот содержимое массива :
if($type=='browser'){)
$user_agents = array(
0 => "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)",
1 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
2 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
3 => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
4 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)",
5 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.19) Gecko/20081201 Firefox/2.0.0.19",
6 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.25 Safari/525.19",
7 => "Opera/9.50 (Windows NT 6.0; U; en)"
);
} elseif ($type=='bot'){
$user_agents = array(
0 => "Googlebot/2.1 (+http://www.google.com/bot.html)",
1 => "Msnbot/1.0 (+http://search.msn.com/msnbot.htm)",
3 => "Yandex/1.01.001 (compatible; Win16; I)",
4 => "Mozilla/5.0 (compatible; Yahoo! Slurp China; [url="http://misc.yahoo.com.cn/help.html)""]http://misc.yahoo.com.cn/help.html)"
);
}
parse_redirect ($response) - поиск заголовка редиректа в ответе $response, если есть то возвращает его.
parse_response ($response) - парсит ответ сервера, возвращает массив содержащий два элемента headers - заголовки сервера и html - данные отданные сервером
parse_headers ($response) - парсит ответ сервера, возвращает массив содержащий заголовки ( соответственно каждый элемент массива одноименен с заголовком ) ( если ответ содержит несколько заголовков одного типа то он из этого элемента делает массив ) и также непосредственно первую стркоу ответа - Answer
add_cookies ($response) - добавляет в внутри-классовую переменную значения заголовков полученных с ответа в формате "имя_куки=его_значение;"
use_proxy ($proxy) - использовать прокси в запросах $proxy - стрка в формате ip:port например : use_proxy (127.0.0.1:8080)
unuse_proxy - перестать использовать прокси в запросах
url_exist - проверяет чтоб ответ сервера не соответствовал 404
url_allowed - проверяет чтоб ответ сервера не соответствовал 403
Исходный код с подсветкой синтаксиса ( настоятельно прошу нигде ничего не менять в ссорцах ) :
http://www.pastebin.ru/303464
http://belportal.info/paste/?show=226
http://paste2.org/p/193181
http://nopaste.info/660f8ce1db.html
Исходный код :
<?php
class TRO_HTTP
{
var $timeout = 30;
var $user_agent = FALSE;
var $cookies = FALSE;
var $referer = FALSE;
var $proxy_host = FALSE;
var $proxy_port = FALSE;
function get ($url, $avars = FALSE, $headers = FALSE) {
$parsed_url = parse_url($url);
$host = $parsed_url['host'];
$path = $parsed_url['path'];
if(isset($parsed_url['query'])) {
$query = $parsed_url['query'];
}
if( $this->proxy_host && $this->proxy_port ) {
$socket = @fsockopen($this->proxy_host, $this->proxy_port, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
$i = 1;
$acount = count($avars);
if($avars){
foreach ($avars As $name => $value) {
if($i == $acount){
$vars .= $name.'='.$value;
} else {
$vars .= $name.'='.$value.'&';
}
$i ++;
}
}
if( $vars && isset($query)){
$out = "GET http://".$host.$path."?".$query."&".$vars." HTTP/1.1\r\n";
} elseif ( $vars ) {
$out = "GET http://".$host.$path."?".$vars." HTTP/1.1\r\n";
} elseif ( isset($query) ) {
$out = "GET http://".$host.$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "GET http://".$host.$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$this->proxy_host."\r\n";
} else {
$socket = @fsockopen($host, 80, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
$i = 1;
$acount = count($avars);
if($avars){
foreach ($avars As $name => $value) {
if($i == $acount){
$vars .= $name.'='.$value;
} else {
$vars .= $name.'='.$value.'&';
}
$i ++;
}
}
if( $vars && isset($query)){
$out = "GET ".$path."?".$query."&".$vars." HTTP/1.1\r\n";
} elseif ( $vars != NULL ) {
$out = "GET ".$path."?".$vars." HTTP/1.1\r\n";
} elseif ( isset($query) ) {
$out = "GET ".$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "GET ".$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$host."\r\n";
}
if( $this->user_agent ) {
$out .= "User-Agent: ".$this->user_agent."\r\n";
}
if( $headers ) {
foreach ($headers as $header => $value) {
$out .= $header.": ".$value."\r\n";
}
}
if( $this->cookies ) {
$out .= "Cookie: ".$this->cookies."\r\n";
}
if( $this->referer ) {
$out .= "Referer: ".$this->referer."\r\n";
}
if(!isset($headers['Connection'])) {
$out .= "Connection: Close\r\n";
}
$out .= "\r\n";
fwrite($socket, $out);
while (!feof($socket)) {
$in .= fread($socket, 128);
}
fclose($socket);
return $in;
}
function post ($url, $avars, $headers = FALSE) {
$parsed_url = parse_url($url);
$host = $parsed_url['host'];
$path = $parsed_url['path'];
if(isset($parsed_url['query'])) {
$query = $parsed_url['query'];
}
if( $this->proxy_host && $this->proxy_port ) {
$socket = @fsockopen($this->proxy_host, $this->proxy_port, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
if ( isset($query) ) {
$out = "POST http://".$host.$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "POST http://".$host.$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$this->proxy_host."\r\n";
} else {
$socket = @fsockopen($host, 80, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
if ( isset($query) ) {
$out = "POST ".$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "POST ".$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$host."\r\n";
}
$i = 1;
$acount = count($avars);
foreach ($avars As $name => $value) {
if($i == $acount){
$vars .= $name.'='.$value;
} else {
$vars .= $name.'='.$value.'&';
}
$i ++;
}
if( $this->user_agent ) {
$out .= "User-Agent: ".$this->user_agent."\r\n";
}
if( $headers ) {
foreach ($headers as $header => $value) {
$out .= $header.": ".$value."\r\n";
}
}
if( $this->cookies ) {
$out .= "Cookie: ".$this->cookies."\r\n";
}
if( $this->referer ) {
$out .= "Referer: ".$this->referer."\r\n";
}
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($vars)."\r\n";
if(!isset($headers['Connection'])) {
$out .= "Connection: Close\r\n";
}
$out .= "\r\n";
$out .= $vars;
fwrite($socket, $out);
while (!feof($socket)) {
$in .= fgets($socket, 128);
}
fclose($socket);
return $in;
}
function post_file ($url, $avars, $headers = FALSE) {
$parsed_url = parse_url($url);
$host = $parsed_url['host'];
$path = $parsed_url['path'];
if(!$avars){
die('Вы хотите сделать запрос который требует данные.');
}
if($avars['type'] == 'content'){
$file .= "filename=".$avars['filename']."&content=".$avars['value'];
}
if($avars['type'] == 'link'){
$filetemp = file_get_contents($avars['value']);
$filetopost = base64_encode($filetemp);
$file .= "filename=".$avars['filename']."&content=".$filetopost;
}
if(isset($parsed_url['query'])) {
$query = $parsed_url['query'];
}
if( $this->proxy_host && $this->proxy_port ) {
$socket = @fsockopen($this->proxy_host, $this->proxy_port, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
if ( isset($query) ) {
$out = "POST http://".$host.$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "POST http://".$host.$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$this->proxy_host."\r\n";
} else {
$socket = @fsockopen($host, 80, $errno, $errstr, $this->timeout) or die ("Не могу открыть сокет :".$errstr."(".$errno.")");
if ( isset($query) ) {
$out = "POST ".$path."?".$query." HTTP/1.1\r\n";
} else {
$out = "POST ".$path." HTTP/1.1\r\n";
}
$out .= "Host: ".$host."\r\n";
}
if( $this->user_agent ) {
$out .= "User-Agent: ".$this->user_agent."\r\n";
}
if( $headers ) {
foreach ($headers as $header => $value) {
$out .= $header.": ".$value."\r\n";
}
}
if( $this->cookies ) {
$out .= "Cookie: ".$this->cookies."\r\n";
}
if( $this->referer ) {
$out .= "Referer: ".$this->referer."\r\n";
}
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($file)."\r\n";
if(!isset($headers['Connection'])) {
$out .= "Connection: Close\r\n";
}
$out .= "\r\n";
$out .= $file;
fwrite($socket, $out);
while (!feof($socket)) {
$in .= fgets($socket, 128);
}
fclose($socket);
return $in;
}
function generate_user_agent ($type = 'browser', $random = TRUE, $uaid = 1) {
if($random){
if($type=='browser'){
$user_agents = array(
0 => "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)",
1 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
2 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
3 => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
4 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)",
5 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.19) Gecko/20081201 Firefox/2.0.0.19",
6 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.25 Safari/525.19",
7 => "Opera/9.50 (Windows NT 6.0; U; en)"
);
} elseif ($type=='bot'){
$user_agents = array(
0 => "Googlebot/2.1 (+http://www.google.com/bot.html)",
1 => "Msnbot/1.0 (+http://search.msn.com/msnbot.htm)",
3 => "Yandex/1.01.001 (compatible; Win16; I)",
4 => "Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)"
);
}
$user_agent = $user_agents[rand(0,count($user_agents))];
} else {
if($type=='browser'){
$user_agents = array(
0 => "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)",
1 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
2 => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
3 => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
4 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)",
5 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.19) Gecko/20081201 Firefox/2.0.0.19",
6 => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.25 Safari/525.19",
7 => "Opera/9.50 (Windows NT 6.0; U; en)"
);
} elseif ($type=='bot'){
$user_agents = array(
0 => "Googlebot/2.1 (+http://www.google.com/bot.html)",
1 => "Msnbot/1.0 (+http://search.msn.com/msnbot.htm)",
3 => "Yandex/1.01.001 (compatible; Win16; I)",
4 => "Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)"
);
}
$user_agent = $user_agents[$uaid];
}
return $user_agent;
}
function parse_redirect ($response) {
$parsed = $this->parse_response($response);
$headers = $this->parse_headers($parsed['headers'], 1);
if(isset($headers['Location'])){
$redirect = $headers['Location'];
} else {
echo ('В ответе нету заголовков для установки Cookie файлов.');
}
return $redirect;
}
function parse_response ($response) {
$temp = explode("\r\n\r\n",$response);
$parsed['headers'] = $temp[0];
$parsed['html'] = str_replace($parsed['headers'], '', $response);
return $parsed;
}
function parse_headers ($headers, $format = 0) {
$temp = explode("\r\n",$headers['headers']);
if($format == 1) {
$parsed['Answer'] = $temp[0];
$i = 1;
while (isset($temp[$i])) {
$tempto = explode(": ",$temp[$i]);
$name = $tempto[0];
$value = $tempto[1];
if(isset($parsed[$name])){
if(is_array($parsed[$name])){
array_push($parsed[$name],$value);
} else {
$old = $parsed[$name];
$parsed[$name] = array($old, $value);
}
} else {
$parsed[$name] = $value;
}
$i++;
}
} else {
$parsed = $temp;
}
return $parsed;
}
function add_cookies ($response) {
$this->cookies = '';
$parsed = $this->parse_response($response);
$headers = $this->parse_headers($parsed, 1);
if($headers['Set-Cookie']){
if(is_array($headers['Set-Cookie'])) {
foreach ($headers['Set-Cookie'] As $Nom => $Valu) {
$tempto = explode(";", $Valu);
$this->cookies .= $tempto[0]."; ";
}
} else {
$tempto = explode(";", $headers['Set-Cookie']);
$this->cookies .= $tempto[0]."; ";
}
}
}
function use_proxy ($proxy) {
$temp = explode(":",$proxy);
$this->proxy_host = $temp[0];
$this->proxy_port = $temp[1];
}
function unuse_proxy () {
$this->proxy_host = FALSE;
$this->proxy_port = FALSE;
}
function url_exist ($url) {
$headas = @get_headers($url);
if(!substr($headas[0],9,3)=="404"){
return false;
} else {
return true;
}
}
function url_allowed ($url) {
$headas = @get_headers($url);
if(!substr($headas[0],9,3)=="403"){
return false;
} else {
return true;
}
}
}
?>
Писал дето пол-года - год назад … ща многое переделал бы но увы нима время)