oauth.vk + curl

Discussion in 'PHP' started by kotkew, 17 Feb 2014.

  1. kotkew

    kotkew New Member

    Joined:
    10 Jan 2013
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток, уважаемые. Я хочу создать скрипт авторизации на стороннем сайте через oauth.vk с использованием прокси. Собсна, скрипт состоит из авторизации в самом вк и далее авторизации oauth.vk. Но проблема в том, что когда я провожу авторизацию через oauth.vk, то сабж просит меня вновь авторизоваться в вк, хотя, судя по логам в настройках страницы, авторизация вк все же была совершена. Привожу код:
    PHP:
    $ip_h хеш;

    $data = array(
        
    'email' => 'мыло',
        
    'pass' => 'пасс',
        
    'submit' => ''
    );

    $ch curl_init();
    curl_setopt($chCURLOPT_URL'https://login.vk.com/?act=login&_origin=http://m.vk.com&ip_h='.$ip_h.'&role=pda&utf8=1');
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS$data);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_PROXY$proxy);
    curl_setopt($chCURLOPT_USERAGENT$uagent);
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    echo 
    curl_exec($ch);
    curl_close($ch);

    $ch curl_init();
    curl_setopt($chCURLOPT_URL'http://oauth.vk.com/authorize?client_id=ид&redirect_uri=сайт&response_type=code');
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_PROXY$proxy);
    curl_setopt($chCURLOPT_USERAGENT$uagent);
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    echo 
    curl_exec($ch);
    curl_close($ch);
    echo 
    'OK';
    Заранее благодарен ;)
     
  2. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    а как же куки?
     
  3. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    Где кукисы?
     
    _________________________
  4. kotkew

    kotkew New Member

    Joined:
    10 Jan 2013
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Можно по-подробнее, даже с примерами?
     
  5. qw1mb1

    qw1mb1 Member

    Joined:
    8 Feb 2013
    Messages:
    113
    Likes Received:
    16
    Reputations:
    8
    вот тут прочитай, интересовать тебя должны опции CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR
     
  6. kotkew

    kotkew New Member

    Joined:
    10 Jan 2013
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Благодарю
     
  7. kotkew

    kotkew New Member

    Joined:
    10 Jan 2013
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Подключил эти опции, результат тот же. Что можно придумать?
     
  8. funny_kaplan

    funny_kaplan New Member

    Joined:
    28 Mar 2013
    Messages:
    43
    Likes Received:
    4
    Reputations:
    0
    Считывай куки, а потом их передай в заголовках.
     
  9. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    187
    Reputations:
    5
    Попробуй эту обертку Curl

    PHP:
    <?php
    Class HttpRequest
    {
        public 
    $Ajax;
        public 
    $Alwaus302;
        public 
    $Referer;

        private 
    $connecttimeout//Время ожидания подключения
        
    private $timeout;        //Время ожидания получения данных
        
    private $ArrayCookies;   //Массив Cookie
        
    private $LineCookies;    //Cookie выстроенные в строку
        
    private $inbuf;          //Ответ сервера
        
    private $proxy;          //Прокси
        
    private $lastUrl;        //Содержит последний URL по которому был переход

    //--------------------------------------------------------------------
    //Конструктор   
        
    function __construct ($proxy NULL) {
            
    $this->connecttimeout 60;
            
    $this->timeout        60;
            
    $this->LineCookies    "";
            
    $this->ArrayCookies   = array();
            
    $this->Ajax           false;
            
    $this->Alwaus302      true;
            
    //Установка прокси
            
    $this->proxy $proxy;
            
    $this->Referer NULL;
        }
    //--------------------------------------------------------------------
    //Диструктор
        
    function __destruct(){
            
    $this->ArrayCookies NULL;
        }
    //--------------------------------------------------------------------   
    //Очистка Cookies
        
    public function ClearCookies(){
            
    $this->LineCookies  "";
            
    $this->ArrayCookies NULL;
            
    $this->ArrayCookies = array();
        }
    //--------------------------------------------------------------------
    //Вернуть массив прокси
        
    public function GetArrayCookies(){
            return 
    $this->ArrayCookies;
        }
    //--------------------------------------------------------------------
    //Установить прокси
        
    public function setProxy($proxy)
        {
            
    $this->proxy $proxy;
        }
    //--------------------------------------------------------------------
    //Выключить прокси
        
    public function unsetProxy()
        {
            
    $this->proxy NULL;
        }
    //---------------------------------------------------------------------
    //Тест прокси
        
    public function testProxy($url$value=NULL)
        {
            
    $inb $this->Get($url);
            if(
    $value == NULL)
            {
                if(
    strlen($inb) > 10) return true;
                else                  return 
    false;
            }
            else
            {
                if(
    strstr($inb$value)) return true;
                else                     return 
    false;
            }
        }
    //--------------------------------------------------------------------
        
    public function Get() {
            
    //Получаем все аргументы функции
            
    $args func_get_args();
            
    $this->lastUrl $args[0];
            
    //Строим строку Cookie
            
    $this->WriteCookies($args[0]);

            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20120216 Firefox/10.0.2 SeaMonkey/2.7.2');
            
    curl_setopt($chCURLOPT_URL$args[0]);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_HEADERtrue);
            
    curl_setopt($chCURLINFO_HEADER_OUTtrue);
            
    curl_setopt($chCURLOPT_COOKIE$this->LineCookies);
            
    curl_setopt($chCURLOPT_HTTPHEADER, array("Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"));
            
    //REFERER
            
    if($this->Referer != NULL)
            {
                
    curl_setopt($chCURLOPT_REFERER$this->Referer);
                
    $this->Referer NULL;
            }
            
    //Прокси
            
    if($this->proxy !== NULL)
            {
                
    curl_setopt($chCURLOPT_CONNECTTIMEOUT$this->connecttimeout);
                
    curl_setopt($chCURLOPT_TIMEOUT$this->timeout);
                
    curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_HTTP);
                
    curl_setopt($chCURLOPT_PROXY$this->proxy);
            }

            
    $this->inbuf curl_exec($ch);
            
    $http_code curl_getinfo($chCURLINFO_HTTP_CODE);
            
    curl_close($ch);
            
    //Считываем Cookie
            
    $this->ReadCookies($args[0]);

            
    //Проверяем 301, 302 переходов
            
    if (($http_code == 301 || $http_code == 302) && $this->Alwaus302 == true)
            {
                return 
    $this->Redirect302();
            }
            return 
    $this->inbuf;
        }
    //--------------------------------------------------------------------
        
    public function Post() {
            
    //Получаем все аргументы функции
            
    $args func_get_args();
            
    $this->lastUrl $args[0];
            
    //Строим строку Cookie
            
    $this->WriteCookies($args[0]);

            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20120216 Firefox/10.0.2 SeaMonkey/2.7.2');
            
    curl_setopt($chCURLOPT_URL$args[0]);
            
    curl_setopt($chCURLOPT_POST,true);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_HEADERtrue);
            
    curl_setopt($chCURLOPT_POSTFIELDS$args[1]);
            
    curl_setopt($chCURLOPT_COOKIE$this->LineCookies);
            
    curl_setopt($chCURLOPT_HTTPHEADER, array("Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"));
            
    //REFERER
            
    if($this->Referer != NULL)
            {
                
    curl_setopt($chCURLOPT_REFERER$this->Referer);
                
    $this->Referer NULL;
            }
            
    //Прокси
            
    if($this->proxy !== NULL)
            {
                
    curl_setopt($chCURLOPT_CONNECTTIMEOUT$this->connecttimeout);
                
    curl_setopt($chCURLOPT_TIMEOUT$this->timeout);
                
    curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_HTTP);
                
    curl_setopt($chCURLOPT_PROXY$this->proxy);
            }
            if(
    $this->Ajax == true) { $this->Ajax =falsecurl_setopt($chCURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest")); }

            
    $this->inbuf curl_exec($ch);
            
    $http_code curl_getinfo($chCURLINFO_HTTP_CODE);
            
    curl_close($ch);
            
    //Считываем Cookie
            
    $this->ReadCookies($args[0]);

            
    //Проверяем 302 переход
            
    if (($http_code == 301 || $http_code == 302) && $this->Alwaus302 == true)
            {
                return 
    $this->Redirect302();
            }

            return 
    $this->inbuf;
        }
    //--------------------------------------------------------------------
    //Вренуть тело документа без заголовков
    public function getInbufBody(){
        return 
    substr($this->inbufstrpos($this->inbuf"\r\n\r\n")+4);
    }
    //--------------------------------------------------------------------
    //Копирование одних кук с одного доменного пространства в другое доменное пространство
    //Первый аргумент-домен источник куков
    //ВТорой домен-назначение куков
        
    public  function CopyCookiesFromDomainToDomain(){
            
    $args func_get_args();
            
    $domainSource strtolower($args[0]);
            
    $domainDest   strtolower($args[1]);
            if(
    strlen($domainSource) < || strlen($domainDest) < 1) return;
            if(
    count($this->ArrayCookies[$domainSource]) < 1) return;
            foreach(
    $this->ArrayCookies[$domainSource] as $k=>$v)
            {
                
    $this->ArrayCookies[$domainDest][$k] = $v;
            }
        }
    //--------------------------------------------------------------------
    //Спарсить домен с строки куки
        
    private function GetDomainFromCookieLine(){
            
    $args func_get_args();
            
    $buff strtolower($args[0]);
            if(!
    strstr($buff"domain=")) return "";
            if(
    strstr($buff"domain=."))
            {
                
    $buff strstr($buff"domain=.");
                
    $offset ="domain=.";
            }
            else
            {
                
    $buff strstr($buff"domain=");
                
    $offset ="domain=";
            }
            
    $posEnd strpos($buff";");
            if(
    $posEnd == 0)
            {
                
    //$posEnd = strpos($buff, "\r\n");
                
    $posEnd strlen($buff);
            }
            return 
    substr($buffstrlen($offset), $posEnd strlen($offset));
        }
    //--------------------------------------------------------------------
    //Взять домен с URL
        
    private function GetDomainFromURL(){
            
    $args func_get_args();
            
    $buff strtolower($args[0]);
            if(!
    strstr($buff".")) return"";
            if(
    strstr($buff"http://")) $buff substr($buffstrlen("http://"));
            if(
    strstr($buff"www."))    $buff substr($buffstrlen("www."));
            
    $posEnd strpos($buff"/");
            if(
    $posEnd 0)
                return 
    substr($buff0$posEnd);
            else
                return 
    $buff;
        }
    //--------------------------------------------------------------------  
    //Функция чтения cookie
        
    private function ReadCookies() {
            
    $args func_get_args();
            
    $url  strtolower($args[0]);
            
    $buf $this->inbuf;

            while(
    strstr($buf"Set-Cookie: "))
            {
                
    $buf strstr($buf"Set-Cookie: ");
                
    $posEnd strpos($buf"\r\n");
                
    $LineCookies substr($bufstrlen("Set-Cookie: "), $posEnd strlen("Set-Cookie: "));
                
    //Определяем домен
                
    $domain $this->GetDomainFromCookieLine($LineCookies);
                if(!
    strstr($domain".")) $domain $this->GetDomainFromURL($url);
                
    //Разбиваем куки на составные части
                
    $tok strtok($LineCookies";");
                while (
    $tok !== false)
                {
                    if(
    strstr($tok"="))
                    {
                        
    $item explode("="$tok);
                        
    $item[0] = trim($item[0], " ");
                        
    $this->ArrayCookies[$domain][$item[0]] = $item[1];
                    }
                    
    $tok strtok(";");
                }
                
    //Делаем смещение
                
    $buf strstr($buf"et-Cookie: ");
            }
        }
    //--------------------------------------------------------------------
    //Функция записи cookie
        
    private function WriteCookies() {
            
    $args func_get_args();
            
    $url  strtolower($args[0]);
            
    //Определяем домен
            
    $domain $this->GetDomainFromURL($url);
            
    $this->LineCookies ="";

            if(
    count($this->ArrayCookies[$domain]) < 1) return;
            foreach (
    $this->ArrayCookies[$domain] as $k=>$v)
            {
                
    $this->LineCookies $this->LineCookies."$k=$v; ";
            }
            
    //Убираем в конце "; "
            
    if(strlen($this->LineCookies) > 3)
                
    $this->LineCookies substr($this->LineCookies0, -2);
        }
    //--------------------------------------------------------------------
    //302 Moved Temporarily
        
    private function Redirect302() {
            
    //Получаем домен из текста 302
            
    $domain $this->GetDomainFromCookieLine($this->inbuf);
            if(
    strlen($domain) < 1) {
                
    $domain $this->GetDomainFromURL($this->lastUrl);
                if(
    strlen($domain) < 1)
                    return 
    "";
            }
            
    //Парсим Location
            
    $buff strstr($this->inbuf"Location: ");
            if(
    strlen($buff) < 1) return "";
            
    $posEnd strpos($buff"\r\n");
            
    $len strlen("Location: ");
            
    $location substr($buff$len$posEnd $len);

            if(!
    strstr($location"http://"))
                
    $url "http://$domain"."$location"
            else
                
    $url $location;
            
            return 
    $this->Get($url);
        }
    //--------------------------------------------------------------------

    }
    ?>