CURL авторизация Вконтакте - как?
Новая тема Написать ответ
# Сб Dec 01, 2012 9:13 amYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
Всем привет!
Пожалуйста подскажите, как авторизоваться Вконтакте через cURL?
Скрипт работал до ввода последних изменений ВК, сейчас пытаюсь залогиниться, не хочет.

auth.php:
Код:
<?
    // true т.к. мы будем отправлять post запрос:
    curl_setopt($ch, CURLOPT_POST, true); 
    // чтобы сайт думал, что мы - браузер:
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    // ответ сервера будем записывать в переменную
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    // по редиректам будем переходить автоматически.
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
    //Формирование запроса таким образом, я счел более наглядным
    $post = array(
            'act' => 'login',
            'role' => 'al_frame',
            'expire' => '',
            'captcha_sid' => '',
            'captcha_key' => '',
            '_origin' => 'http://vk.com',
            'ip_h' => '',
                'email' => $login,
                'pass' => $password
            );
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); /*Все данные, передаваемые в HTTP POST-запросе. Для передачи файла,
                                                                    укажите перед именем файла @, а также используйте полный путь к файлу.
                                                                    Тип файла также может быть указан с помощью формата ';type=mimetype',
                                                                    следующим за именем файла. Этот параметр может быть передан как в
                                                                    качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...',
                                                                    так и в виде массива, ключами которого будут имена полей, а значениями -
                                                                    их содержимое. Если value является массивом, заголовок Content-Type
                                                                    будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0,
                                                                    при передаче файлов с префиксом @, value должен быть массивом.
                                                                   */
    $answer = curl_exec($ch); /* В $answer нам приходит javascript, который и устанавливает куки
                                 с названием: remixsid Нам нужно cпарсить эти 60 символов,
                                 идентификатора сессии. с помощью них vkontakte поймет,
                                 что мы авторизировались.*/
    $sid = substr($answer, strpos($answer, "setCookieEx('sid', '") + 20, 60);
    $cookie = 'remixsid=' . $sid;
    $_SESSION['cookie'] = $cookie;
   
    curl_setopt($ch, CURLOPT_POST, false); /*TRUE для использования обычного HTTP POST.
                                            Данный метод POST использует обычный application/x-www-form-urlencoded,
                                            обычно используемый в HTML-формах.
                                           */
    curl_setopt($ch, CURLOPT_COOKIE, $_SESSION['cookie']); //Содержимое заголовка "Cookie: ", используемого в HTTP-запросе. Обратите внимание, что несколько cookies разделяются точкой с запятой с последующим пробелом (например, "fruit=apple; colour=red")

?>



Сам скрипт авторизации в ВК:
Код:
<?
session_start();

$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) ' .
            'Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)';
$cookie = '';

set_time_limit (0);
ini_set('max_input_time', '0');
//$error_level = error_reporting(0);

echo "<style>body {margin:0 auto;padding:0 auto; font-family:Calibri;}</style>";


// Аккаунт
$login = 'ЛОГИН';
$password = 'ПАРОЛЬ';

$ch = curl_init();

include('auth.php');

curl_setopt($ch, CURLOPT_URL, 'http://vk.com/');

// --- открываем главную страницу, посмотреть, что залогинен ---
 echo curl_exec($ch);

 
?>



Новые поля в форме ввода выглядят так:
Код:
   'act' => 'login',
    'role' => 'al_frame',
    'expire' => '',
    'captcha_sid' => '',
    'captcha_key' => '',
    '_origin' => 'http://vk.com',
    'ip_h' => '',



А раньше было так:
Код:
                'act' => 'login',
                'q' => '',
                'al_frame' => '1',
                'expire' => '',
                'captcha_sid' => '',
                'captcha_key' => '',
                'from_host' => 'vk.com',


Подскажите пожалуйста, где ошибка, что ВК не логинит юзера.
Заранее большое спасибо! Drinks or Beer
# Сб Dec 01, 2012 12:15 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
Делаю авторизацию с вытаскиванием хэша, затем куки, затем устанавливаю куки и урл и вывожу - показывает "1":

Код:
<?php

$mail = 'ЛОГИН';
$pass = 'ПАРОЛЬ';

$otvet=connect("http://login.vk.com/?act=login&email=$mail&pass=$pass");
If(!preg_match("/hash=([a-z0-9]{1,32})/",$otvet,$hash)){
die("Login incorrect");
}
$otvet=connect("http://vk.com/login.php?act=slogin&hash=".$hash[1]);
preg_match("/remixsid=(.*?);/",$otvet,$sid);
$cookie = "remixchk=5; remixsid=$sid[1]";
 
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL,"http://vk.com/feed");
curl_setopt($ch2, CURLOPT_COOKIE, $cookie);
$otvet = curl_exec($ch2);
curl_close($ch2);
echo $otvet;



function connect($link,$cookie=null,$post=null){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
if($cookie !== null)
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
if($post !== null)
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$otvet = curl_exec($ch);
curl_close($ch);
return $otvet;
}

?>


То есть, вместо содержимого страницы "http://vk.com/feed" класса курла ch2 - показывает одну цифру, единицу.
Пожалуйста подскажите, кто с ВК-авторизом работал, как в ВК залогиниться через курл.
Заранее спасибо! Drinks or Beer
# Сб Dec 01, 2012 9:23 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
Помог daniel777 с Ачата, огромное ему спасибо!
Вопрос решен.
Новая тема Написать ответ    ГЛАВНАЯ ~ ТЕХНИЧЕСКИЕ ВОПРОСЫ
 
Любое использование материалов, размещенных на ArmadaBoard.com, без разрешения владельцев ArmadaBoard.com запрещено.