@Evgeny57

Авторизация вконтакте по curl?

$cookie = ''; //переменная нужна для сохранения печенек
  
    function pageVK(/*Передавайте параметры, если нужно*/) {
        global $cookie;   
        $curl = curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);      
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl,CURLOPT_AUTOREFERER, true);
        curl_setopt($curl,CURLOPT_POST, true);
        curl_setopt($curl,CURLOPT_COOKIEFILE, "cookiefile");
        curl_setopt($curl,CURLOPT_COOKIE, $_COOKIE['Cookie_Login']);
        curl_setopt($curl,CURLOPT_NOBODY, false);
        curl_setopt($curl,CURLOPT_HEADER, true);
        curl_setopt($curl,CURLOPT_ENCODING, "");
        curl_setopt($curl,CURLOPT_TIMEOUT, 30);
        curl_setopt($curl,CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl,CURLOPT_MAXREDIRS, 5);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding:gzip, deflate, sdch', 'Accept-Language: ru', 'Accept-Charset: utf-8', 'user-agent: Opera/9.1(Opera Mini/7.1)'));
        curl_setopt($curl,CURLOPT_URL, 'тут внутренняя страница вконтакте к которой Вам нужен доступ');
        curl_setopt($curl,CURLOPT_POSTFIELDS, null);
        $page = curl_execR($curl);
        
        //Ну а тут делайте свое грязное дело :-)
 
    }
    
    function checkLoginVk($Login, $Password) {
        global $cookie;   
        $curl = curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);      
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl,CURLOPT_AUTOREFERER, true);
        curl_setopt($curl,CURLOPT_POST, true);
        curl_setopt($curl,CURLOPT_COOKIEFILE, "cookiefile");
        curl_setopt($curl,CURLOPT_COOKIE, $_COOKIE['Cookie_Login']);
        curl_setopt($curl,CURLOPT_NOBODY, false);
        curl_setopt($curl,CURLOPT_HEADER, true);
        curl_setopt($curl,CURLOPT_ENCODING, "");
        curl_setopt($curl,CURLOPT_TIMEOUT, 30);
        curl_setopt($curl,CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl,CURLOPT_MAXREDIRS, 5);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding:gzip, deflate, sdch', 'Accept-Language: ru', 'Accept-Charset: utf-8', 'user-agent: Opera/4.1(Opera Mini/7.1)')); //Заголовки можете поизменять, но User-Agent всегда оставляйте мобильный. Как никак в мобильной версии ВК все задачи делаются намного проще, чем в полной.
        curl_setopt($curl,CURLOPT_URL, 'https://m.vk.com/login?role=fast&to=&s=1&m=1&email='.$Login);
        curl_setopt($curl,CURLOPT_POSTFIELDS, null);
        $page = curl_execR($curl);
        preg_match("/<form method=\"post\" action=\"(.*?)\" novalidate>/",$page, $hash); //Регулярку можно подправить чтоб работала наверника и novalidate убрать. А вообще, все регулярки требуют либо контроля, либо обновления на многозадачные, а то если ВК изменит одну цифру или букву в некоторых местах, скрипт падёт :-(  
        curl_setopt($curl,CURLOPT_URL, $hash[1]);
        curl_setopt($curl,CURLOPT_COOKIE, $cookie);
        curl_setopt($curl,CURLOPT_POSTFIELDS, http_build_query(array('email' => $Login, 'pass' => $Password)));
        $page = curl_execR($curl);
        curl_setopt($curl,CURLOPT_URL, 'https://m.vk.com/feed'); //Тут можно указать любую страницу авторизованного юзера
        curl_setopt($curl,CURLOPT_COOKIE, $cookie);
        $page = curl_execR($curl);
        
        $CheckAuth = preg_match("/<a.*?href=\"https:\/\/login\.vk\.com\/\?act=logout(.*?)\">/",$page); //Проверка регулярками, что мы вошли. Единственное что нужно парсить, это кнопка выход. Она всегда у авторизованного юзера будет :-)
        $checkSecure = preg_match('/id=\"security_check\"/', $page); //В моем случае попадалось много аккаунтов других стран, а точнее Украины. Естественно ВК попросит ввести цифры от телефона, это как раз проверка ))
        if($checkSecure) {
                $code = NumericPhoneVk($Login);
                preg_match("/hash: '(.*?)'/",$page, $hash);
                curl_setopt($curl,CURLOPT_URL, 'http://vk.com/login.php?act=security_check'); //Ввод недостающих цифр может хромать, так как оживил скрипт только недавно, а последний раз он у меня работал с вводом кода еще в далеком 2015-м году )))))
                curl_setopt($curl,CURLOPT_POSTFIELDS, http_build_query(array('code' => $code, 'to' => '', 'al_page' => '3', 'hash' => $hash[1])));
                $page = curl_execR($curl);      
        }
        if($CheckAuth) {
            SetCookie("Cookie_Login", deleteCopyCookies($cookie), time()+3600); //Куки служат для хранения кук, как глупо это бы не звучало. На серверных решениях Вы можете хранить их в БД и т.д.
            curl_setopt($curl, CURLOPT_URL, 'https://vk.com/id0'); //Мне нужно было имя юзера, поэтому id0 спокойно с этим справляется)))
            curl_setopt($curl,CURLOPT_COOKIE, $cookie);
            $page = curl_execR($curl);
            if(mb_check_encoding($page, 'Windows-1251') && !mb_check_encoding($page, 'UTF-8')) { $page = mb_convert_encoding($page, 'UTF-8', 'Windows-1251'); } //Какие бы заголовки я в запросе не кидал, ВК все же на кирилице отдает текст, поэтому я его конвертирую в любимую UTF-8 :-)
            preg_match("/<title>(.*?)<\/title>/", $page, $user); 
            $data = array('login' => 'ok', 'msg'=> $user[1]);
        } else { $data = array('login' => 'fail', 'msg'=> "Неправильный логин или пароль"); }
        curl_close($curl);
        
        return $data; //Я возвращаю массив, Вы можете переписать под себя, как угодно.
    }
    
    
    function curl_execR($curl) {            //альтернативная функция curl_exec для эмуляции CURLOPT_FOLLOWLOCATION (Для тех, кто пользуется халявными хостингами, где оригинальной функции нет)
        global $cookie;
        $loops = 0;
        $max_loops = 10;
            if ($loops++ >= $max_loops) { $loops = 0;  FALSE; } 
        $data = curl_exec($curl);
        preg_match_all('/Set-Cookie: (.*?; )/', $data, $cookieArr);
        for($i=0;  $i<count($cookieArr[1]); $i++) {
            $cookie = $cookie.$cookieArr[1][$i];
        }
        $temp = $data;
        list($header, $data) = explode("\n\n", $data, 2);
        $http = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if ($http == 301 || $http == 302) {
            $matches = array();
            preg_match('/Location:(.*?)\n/', $header, $matches);
            $url = @parse_url(trim(array_pop($matches)));
            if (!$url) { $loops = 0; return $data; }
            $last_url = parse_url(curl_getinfo($curl, CURLINFO_EFFECTIVE_URL));
            if (!$url['scheme'])
            $url['scheme'] = $last_url['scheme'];
            if (!$url['host'])
            $url['host'] = $last_url['host'];
            if (!$url['path'])
            $url['path'] = $last_url['path'];
            $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
            curl_setopt($curl, CURLOPT_URL, $new_url);
            return curl_execR($curl);
        } else { $loops=0; return $temp; }
    }   
    
    
    //Удаление повторяющихся Cookies из строки (Совсем не обязательная, но я люблю чтоб все как надо было)
    function deleteCopyCookies($cookieStr) {
        $cookieKV = array();
        $cookieStrS = '';
        $cookieStr = str_replace(array("\r\n", "\n", "\r", " "), "", $cookieStr);
        $cookieArray = explode(";",$cookieStr);
        $cookieArray = array_filter($cookieArray);
            foreach($cookieArray as $item) {
                $arr = explode('=', $item);
                $cookieKV[$arr[0]] = $arr[1];
            }
            foreach ($cookieKV as $key => $value) {
                $cookieStrS = $cookieStrS.$key.'='.$value.'; ';
            }
        return ($cookieStrS !== '') ? $cookieStrS : false;
    }
 
 
    //Проверка страны мобильного номера ВКонтакте(Сюда Вы можете дописать нужные страны)
    function BringPhoneVk($phone) {
        $sim = substr($phone, 0, 1);
        if($sim == '+') { $phone = substr($phone, 1); }
        $prifixRus = substr($phone, 0, 1);
        $prifixUkr = substr($phone, 0, 2);
            if($prifixRus == '7' || $prifixRus == '8') { $phone = array('tel' => $phone, 'country' => 'Russia'); }
                else if($prifixUkr == '38') { $phone = array('tel' => $phone, 'country' => 'Ukraine'); }
                    else { $phone = array('tel' => $phone, 'country' => 'Unknown'); }
        return $phone;
    }
    
    //Вывод недостающих цифр мобильного номера ВКонтакте(Соответственно тоже нужно будет подкорректировать при добавлении стран)
    function NumericPhoneVk($phone) {
        $phone = BringPhoneVk($phone);
        if(is_array($phone) && array_key_exists('tel', $phone) && array_key_exists('country', $phone)) {
            if($phone['country'] == 'Russia') {
                $numeric = substr($phone['tel'], 1, 8);
            } else if($phone['country'] == 'Ukraine') {
                $numeric = substr($phone['tel'], 1, 9);
                } else if($phone['country'] == 'Unknown') { 
                    $numeric = $phone['tel'];
                    } else { $numeric = 'Страны не существует'; }
        } else { $numeric = 'Ошибка!'; }
        return $numeric;
    }

Нужно сделать функцию, если авторизация прошла, то вывести сообщения о успешной авторизации
  • Вопрос задан
  • 737 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
многабукаф

декомпозируй
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы