MultiCurl и socks5 возможно ?

Статус
В этой теме нельзя размещать новые ответы.

o_nix

Хранитель порядка
Регистрация
7 Ноя 2007
Сообщения
1.070
Реакции
1.063
Есть такой скрипт ProxyChecker 5.1
Весьма тормознутый скрипт но альтернатив нет.
Давно заброшен разработчиком который обещал добавить в него поддержку socks прокси

Пытаюсь добавить эту поддержку получив полные исходники
Для просмотра ссылки Войди или Зарегистрируйся

Поддержка socks в curl есть изначально

Имеем class.ProxyChecker.php - именно в нём засела функция чека прокси в оригинале файл выглядит вот так
PHP:
<?php

class ProxyChecker extends Requester 
{
	private $db;
	private $Config;
	private $Hash;
	
	private $Proxy;
	private $Worked;
	private $Contime;
	private $Time;
	private $Speed;
	private $Post;
	private $Referer;
	private $Cookies;
	private $Anon;
	private $Country;
	private $CodeCountry;
		

	
	
	public function __construct($Proxy, $Country=null, $CodeCountry=null) {
		parent::__construct();		
		$this->db = Db::Singleton();
		$this->Config = DbConfig::Singleton();
		$this->Hash = substr(md5(rand(1111,9999)), 0, 10);
		$this->Proxy = $Proxy;
		$this->Worked = 0;
		$this->Country = $Country;
		$this->CodeCountry = $CodeCountry;
		$this->PrepareRequest();
	}
	
	public function GetProxy() {
		return $this->Proxy;
	}
	
	public function GetWorked() {
		return $this->Worked;
	}
	
	public function GetContime() {
		return $this->Contime;
	}
	
	public function GetTime() {
		return $this->Time;
	}
	
	public function GetSpeed() {
		return $this->Speed;
	}
	
	public function GetPost() {
		return $this->Post;
	}
	
	public function GetReferer() {
		return $this->Referer;
	}
	
	public function GetCookies() {
		return $this->Cookies;
	}
	
	public function GetAnon() {
		return $this->Anon;
	}
	
	public function GetCountry() {
		return $this->Country;
	}
	
	public function GetCodeCountry() {
		return $this->CodeCountry;
	}
	

	
	
	/**
	* @return bool $IsWorked
	*/
	public function Parse() {
		// WORKED CHECK
		if ($this->IsError()) return false;
		$this->Worked = stristr($this->GetResult(), CONF_CHECK_PAGE_ID) ? 1:0;
		if (!$this->Worked) return false;
		
		// TIME
		$this->Contime = $this->GetInfo(CURLINFO_CONNECT_TIME);
		$this->Time = $this->GetInfo(CURLINFO_TOTAL_TIME);
		$this->Speed = $this->GetInfo(CURLINFO_SPEED_DOWNLOAD);
		
		// PARAMS CHECK
		$Arr = self::ParseCheckPage($this->GetResult());
		$Referer =	isset($Arr['HTTP_REFERER']) ? $Arr['HTTP_REFERER'] : null;
		$Post =		isset($Arr['POST']) ? $Arr['POST'] : null;
		$Cookies =	isset($Arr['COOKIE']) ? $Arr['COOKIE'] : null;
		$this->Referer =	stristr($Referer, $this->Hash) ? 1:0;
		$this->Post =		stristr($Post, $this->Hash) ? 1:0;
		$this->Cookies =	stristr($Cookies, $this->Hash) ? 1:0;
		
		// ANONYMITY CHECK
		if (empty($Arr['HTTP_X_FORWARDED_FOR'])
		&&	empty($Arr['HTTP_X_FORWARDED'])
		&&	empty($Arr['HTTP_X_COMING_FROM'])
		&&	empty($Arr['HTTP_FORWARDED_FOR'])
		&&	empty($Arr['HTTP_FORWARDED'])
		&&	empty($Arr['HTTP_COMING_FROM'])
		&&	empty($Arr['HTTP_VIA'])
		&&	empty($Arr['HTTP_XROXY_CONNECTION'])
		&&	empty($Arr['HTTP_PROXY_CONNECTION'])) {
			$this->Anon = 2;
		} else {
			$this->Anon = 1;
		}
		$Sec = $this->Config->GetParam('check_security');
		$Sec = explode("\r\n", $Sec);
		foreach ($Sec as $ip) {
			if (stristr($this->GetResult(), $ip)) {$this->Anon = 0; break;}
		}
		
		// CHECK COUNTRY
		if ($this->Config->GetParam('check_country')
		&&	empty($this->Country)
		&&	empty($this->CodeCountry)) 
		{
			$Res = self::GetCountryByIp($this->Proxy);
			if ($Res!=false) list($this->Country, $this->CodeCountry) = $Res;
		}
		return true;
	}
	


	
	/**
	* Grabs IP addresses from any text
	* @return array
	*/
	public static function GrabIp($Text) {
		if (preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#', $Text, $m)) {
			return $m[0];
		}
		return array();
	}
	
	public static function ParseCheckPage($Content)	{
		if (preg_match_all('#([\w]+)=([^\r\n]*)#', $Content, $m)) {		
			return array_combine($m[1], $m[2]);
		}
		return array();
	}	

	/**
	* Determine country and country code by IP address or hostname
	* @param string $ip - hostname or IP address (with port or not)
	* @return array(country, code) or FALSE
	*/
	public static function GetCountryByIp($ip) {
		// Get IP
		if (preg_match('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#', $ip, $m)) {
			$ip = $m[0];			
		} else {
			$ip = gethostbyname($ip);
			if (!preg_match('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#', $ip, $m)) {
				return false;
			}
		}
		// Search in database
		$db = Db::Singleton();
		$longip = sprintf("%u", ip2long($ip));
		$db->Query('SELECT * FROM countries'
				. ' WHERE ip_start <= '.$longip
				. ' AND ip_end >= '.$longip
				. ' LIMIT 0,1');
		if($db->NumRows()) {
			$Row = $db->FetchRow();
			return array($Row['name'], $Row['zone2']);
		}
		return false;
	}
	
	
	
	
	
	
	private function PrepareRequest() {
		
		$this->SetUrl($this->Config->GetParam('check_url'));

		$this->SetOpt(CURLOPT_PROXY, $this->Proxy);
		$this->SetPost('body='.$this->Hash);
		$this->SetOpt(CURLOPT_REFERER, 'http://'.$this->Hash.'/');
		$this->SetOpt(CURLOPT_COOKIE, 'bodyid='.$this->Hash);
		$this->SetOpt(CURLOPT_CONNECTTIMEOUT, $this->Config->GetParam('check_connect_timeout'));
		$this->SetOpt(CURLOPT_TIMEOUT, $this->Config->GetParam('check_request_timeout'));
		$this->SetOpt(CURLOPT_FAILONERROR, true);
	}
}

?>

Чуть чуть изменяем код для поддержки socks
PHP:
	private function PrepareRequest() {
		
		$this->SetUrl($this->Config->GetParam('check_url'));
		$this->SetOpt(CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

		$this->SetOpt(CURLOPT_PROXY, $this->Proxy);
		$this->SetPost('body='.$this->Hash);
		$this->SetOpt(CURLOPT_REFERER, 'http://'.$this->Hash.'/');
		$this->SetOpt(CURLOPT_COOKIE, 'bodyid='.$this->Hash);
		$this->SetOpt(CURLOPT_CONNECTTIMEOUT, $this->Config->GetParam('check_connect_timeout'));
		$this->SetOpt(CURLOPT_TIMEOUT, $this->Config->GetParam('check_request_timeout'));
		$this->SetOpt(CURLOPT_FAILONERROR, true);
	}

Добавлено всего одна строка после этого скрипт перестаёт нормально чекать http но при этом он начинает чекать socks но через раз ... те из 10-30 рабочих соксов скрипт считает рабочими 1-2. Но при этом если прочекать каждый socks поотдельности всё чекается нормально (функция используется таже самая).

Поковыряв исходник скрипта и гугл я так понял что в скрипте идёт проверка через MultiCurl когда прокси http всё работает замечательно а вот при чеке socks с ним начинаются какието непонятки ...

В общем вопрос к php ПРОФИ ... получить MultiCurl на SOCKS прокси вообще реально ??

Пожалуйста помогите дописать функцию чека чтобы она стала универсальной, чтобы сначала проверялась работа прокси как socks если нет ответа тогда http ... Изначально в скрипте неизвестно какого типа поступает прокси для чека.:thenks:

Update
Поправка ...
В скрипте несовсем MultiCurl - тоесть тот самый готовый класс в нём неиспользуется ... в нём чтото подобное самописное сделано... Проблемму пока так и нерешил :(
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху