Класс Explorer - PHP класс для работы с курлом

Тема в разделе "PHP", создана пользователем zerg, 4 ноя 2010.

  1. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Простой PHP класс для работы с курлом
    Использую для написания спамерок, парсеров и тд. Пока удовлетворяет все потребности. По мере необходимости буду обновлять.

    Возможности:
    • Подделка юзерагента
    • Подделка рефки
    • Работа с куками
    • Работа с прокси
    • Отправка заголовков
    • Получение заголовков
    • Получение ошибок
    • Отправка пост и гет запросов

    PHP:
    <?php

    /**
     * Класс для работы с курлом
     * @link http://forumseo.org
     * @author zerg
     */ 
    class Explorer
    {
        
    // Последний урл
        
    var $url;
            
        
    // Последняя POST DATA
        
    var $post_data;
            
        
    // Скачанные данные
        
    var $data;
            
        
    // User Agent
        
    var $user_agent 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8';
            
        
    // Реферер
        
    var $referer 'http://yandex.ru/yandsearch';
        
        
    // Файл куков
        
    var $user_cookie_file;
        
        
    // задаем заголовок
        
    var $header;
        
        
    // полученный заголовок
        
    var $headers;
        
        
    // задаем прокси
        
    var $proxy;
        
        
    // задаем тип прокси: CURLPROXY_HTTP или CURLPROXY_SOCKS5
        
    var $proxytype;
        
        
    // задаем логин:пароль прокси
        
    var $proxyuserpwd;
        
        var 
    $error;
        
        
        
    /**
         * Конструктор
         */
        
    public function __construct()
        {
            
    //пусто
        
    }
        
        
    /**
         * Задаем url
         * @param $url
         */
        
    public function setUrl($url
        {
            
    $this->url $url;
            return 
    $this;
        }
        
        
    /**
         * Задаем пост запрос
         * @param $post_data
         */
        
    public function setPost_data($post_data
        {
            
    $this->post_data $post_data;
            return 
    $this;
        }
        
        
    /**
         * Задаем юзер агент
         * @param $user_agent
         */
        
    public function setUser_agent($user_agent
        {
            
    $this->user_agent $user_agent;
            return 
    $this;
        }
        
        
    /**
         * Задаем referer
         * @param $referer
         */
        
    public function setReferer($referer
        {
            
    $this->referer $referer;
            return 
    $this;
        }
        
        
    /**
         * 
         * @param $user_cookie_file
         */
        
    public function setUser_cookie_file($user_cookie_file
        {
            
    $this->user_cookie_file $user_cookie_file;
            return 
    $this;
        }
        
        
    /**
         * Задаем заголовок
         * @param $header
         */
        
    public function setHeader($header
        {
            
    $this->header $header;
            return 
    $this;
        } 
        
        
    /**
         * Задаем прокси
         * @param $proxy
         */
        
    public function setProxy($proxy
        {
            
    $this->proxy $proxy;
            return 
    $this;
        }  

        
    /**
         * Задаем тип прокси
         * @param $proxytype
         */
        
    public function setProxytype($proxytype
        {
            
    $this->proxytype $proxytype;
            return 
    $this;
        }    
        
        
    /**
         * Задаем логин:пароль прокси
         * @param $proxyuserpwd
         */
        
    public function setProxyuserpwd($proxyuserpwd
        {
            
    $this->proxyuserpwd $proxyuserpwd;
            return 
    $this;
        }
        
        
    /**
         * Получаем заголовок
         */
        
    public function getHeader() 
        {
            return 
    $this->headers;
        }
        
        
    /**
         * Получаем данные
         */
        
    public function getData() 
        {
            return 
    $this->data;
        }
        
        
    /**
         * Получаем ошибку
         */
        
    public function getError() 
        {
            return 
    $this->error;
        }
      
        
    /**
         * Получаем страницу
         */
        
    public function send()
        {       
            
    // инициализируем
            
    $ch curl_init($this->url); 
            
    curl_setopt($chCURLOPT_URL$this->url);
            
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);        

            
    // передаем юзерагент
            
    curl_setopt($chCURLOPT_USERAGENT$this->user_agent); 
            
            
    // передаем реферер
            
    curl_setopt($chCURLOPT_REFERER$this->referer);
            
            
    // разрешаем переадресацию
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
            
            
    // работа с https
            
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
            
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
            
            
    // Проверяем есть ли печеньки
            
    if(!empty($this->user_cookie_file)){   
                
    // работаем с печеньками
                
    curl_setopt($chCURLOPT_COOKIEFILE$this->user_cookie_file); 
                
    curl_setopt($chCURLOPT_COOKIEJAR,  $this->user_cookie_file);
            }
            
            
    // проверяем есть ли пост запрос
            
    if( !empty($this->post_data) ){
                
    // если есть то опправляем
                
    curl_setopt($chCURLOPT_POST,1);
                
    curl_setopt($chCURLOPT_POSTFIELDS$this->post_data); 
                
    // очищаем, для следующих запросов
                
    unset($this->post_data);
            }
            
            
    // проверяем есть ли заголовок
            
    if( !empty($this->header) ){   
                
    // Формирование заголовка
                
    curl_setopt($chCURLOPT_HTTPHEADER$this->header); 
                unset(
    $this->header);
            }
            
            
    // проверяем есть ли прокси
            
    if( !empty($this->proxy) ){
                
    // если есть то задаем прокси
                
    curl_setopt($chCURLOPT_PROXY$this->proxy);
                
    // очищаем, для следующих запросов
                
    unset($this->proxy);
                
                
    // проверяем указан ли тип прокси
                
    if( !empty($this->proxytype) ){
                    
    // если указан то задаем тип прокси
                    
    curl_setopt($chCURLOPT_PROXYTYPE$this->proxytype);
                    
    // очищаем, для следующих запросов
                    
    unset($this->proxytype);
                }
                
                
    // проверяем указан ли тип прокси
                
    if( !empty($this->proxyuserpwd) ){
                    
    // если указан то задаем тип прокси
                    
    curl_setopt($chCURLOPT_PROXYUSERPWD$this->proxyuserpwd);
                    
    // очищаем, для следующих запросов
                    
    unset($this->proxyuserpwd);
                }            
            }

            
    // получаем данные
            
    $this->data curl_exec($ch); 
            
            
    // получаем размер заголовка
            
    $this->headers = (object)curl_getinfo($ch);
                    
            
    // записываем ошибку
            
    $this->error  curl_error($ch);
            
            
    // завершаем сеанс
            
    curl_close($ch);
            
            
    // проверяем результат
            
    if($this->error == AND $this->headers->http_code 400){
                return 
    true;
            }else{
                return 
    false;
            }
        }
    }
    Пример использования:
    PHP:
    // подгужаем класс работы с загрузкой
    include 'includes/explorer.php';


    $explorer = new Explorer

    $explorer->setUrl('http://forumseo.org/'); 

    //$explorer->setUser_agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8');

    //$explorer->setReferer('http://yandex.ru');

    //$explorer->setHeader(array('Content-Type: application/x-www-form-urlencoded; charset=UTF-8'));

    //$explorer->setProxy('121.34.111.42:9415'); 

    //$explorer->setProxytype('CURLPROXY_SOCKS5');  

    //$explorer->setPost_data('login=zerg&password=12345');

    if($explorer->send()){ 
        echo 
    $explorer->getData(); 
    }else{ 
        
    print_r($explorer->getHeader()); 


    Обновил до версии 0.1, 7 ноября 2010
     
  2. FFman

    FFman New Member

    Регистр.:
    20 сен 2009
    Сообщения:
    171
    Симпатии:
    0
    Ответ: PHP класс для работы с курлом

    Тут вместо "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20" нужно поставить $this->user_agent
     
  3. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: PHP класс для работы с курлом

    FFman, ага, была функция и когда переписывал забыл заменить.
     
  4. stargazerrrrr

    stargazerrrrr New Member

    Регистр.:
    5 сен 2010
    Сообщения:
    130
    Симпатии:
    0
    Ответ: Explorer - PHP класс для работы с курлом

    А с флеш-кукисами вы как работаете? Я так понимаю, что сайт, который ставит флеш-куки ищет плагин от adobe, и пытается через него поставить, но если это так, то как на курле эмитировать наличие плагина? :pc:
     
  5. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Explorer - PHP класс для работы с курлом

    Наверное тоже самое как и с JS, я не работал поэтому точно не знаю, просто логически.
     
  6. Vincent

    Vincent New Member

    Регистр.:
    10 ноя 2010
    Сообщения:
    10
    Симпатии:
    0
    Ответ: Explorer - PHP класс для работы с курлом

    Насколько я знаю curl бессилен, если при авторизации используется js. Обойти такую защиту можно лишь рассчитав алгоритм формирования печеньев. Верно?
     
  7. leksus

    leksus Супер-модератор

    Регистр.:
    24 авг 2009
    Сообщения:
    466
    Симпатии:
    0
    Ответ: Explorer - PHP класс для работы с курлом

    нене, немного не так. При любой авторизации идет запрос (POST, GET) к серверу. А уже скрипт на сервере дает команду браузеру поставить куку при успешной авторизации. И если используются сессии (а это практически всегда), то в куку кидается сгенерированный php идентификатор, и через него уже идет общение. Да, после ввода логина-пароля в форму js может как-либо изменить их некой функцией и уже результат отправить серверу. Но ничто не мешает нам разобрать функцию js и сделать такую-же на php.
     
  8. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Explorer - PHP класс для работы с курлом

    Собственно leksus дал ответ, нужно сделать аналог функции на PHP.
     
  9. stargazerrrrr

    stargazerrrrr New Member

    Регистр.:
    5 сен 2010
    Сообщения:
    130
    Симпатии:
    0
    Ответ: Explorer - PHP класс для работы с курлом

    В общем для сложных дел курл за борт я так понял. Есть вариант поинтересней [HIDE="70"], называется Selenium 2.0, гугл на нем своих пауков пишет(возможно, не только на нем). Я одно время с ним работал, когда версия была еще 1.0, уже тогда он эмулировал браузер(лис, ие), исполнял любые js как нормальный браузер, можно было на пхп его программить (хотя заточен под яву), даже скриншоты делать. OpenSource. Сейчас активно копаю 2.0, но флеш куки пока мне неподвласны. Могу линками закидать, если интересно[/HIDE]
     
    Последнее редактирование: 25 ноя 2010
  10. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Explorer - PHP класс для работы с курлом

    stargazerrrrr, мне интересно но только в новой теме.
     
  11. s3user

    s3user New Member

    Регистр.:
    4 мар 2011
    Сообщения:
    2
    Симпатии:
    0
    Ответ: Explorer - PHP класс для работы с курлом

    просто, но интересно.
     
  12. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Explorer - PHP класс для работы с курлом

    Ну собственно я и делал чтобы все было просто. Для тех кому нужно сложно, вот рекомендую - http://framework.zend.com/manual/1.11/en/zend.http.client.advanced.html
     

Поделиться этой страницей