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

Тема в разделе "Как сделать...", создана пользователем o_nix, 30 янв 2010.

Статус темы:
Закрыта.
  1. o_nix

    o_nix

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

    Пытаюсь добавить эту поддержку получив полные исходники
    http://www.nulled.ws/showpost.php?p=1368060&postcount=106

    Поддержка 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)), 010);
            
    $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_FAILONERRORtrue);
        }
    }

    ?>
    Чуть чуть изменяем код для поддержки socks
    PHP:
        private function PrepareRequest() {
            
            
    $this->SetUrl($this->Config->GetParam('check_url'));
            
    $this->SetOpt(CURLOPT_PROXYTYPECURLPROXY_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_FAILONERRORtrue);
        }
    Добавлено всего одна строка после этого скрипт перестаёт нормально чекать http но при этом он начинает чекать socks но через раз ... те из 10-30 рабочих соксов скрипт считает рабочими 1-2. Но при этом если прочекать каждый socks поотдельности всё чекается нормально (функция используется таже самая).

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

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

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

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