@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;
    }

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

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽