Проходим авторизацию на PHP в ВКонтакте

Вот и пришло время, когда мне понадобилось авторизоваться в этой социальной сети. На мое удивление, статей в Интернете было не мало. Даже множество из них были на PHP. Отлично! как раз то, что мне нужно. Но внимательно их прочитав, я понял что те методы авторизации которые там описывались либо устарели или не работают совсем правильно. Правда попадались и рабочие примеры (если судить по отзывам). Но все таки захотелось мне написать все с чистого листа , да и к тому же я в свое время написал класс в который объединил самые часто используемые функции наверное самой лучшей библиотеки что я встречал для работы с различными сетевыми протоколами – cURL. На вооружение был принят firebug. Как же без него в таких ситуациях.

Ну что понеслась! Вот собственно код с подробными комментариями.

// Устанавливаем USER_AGENT
$curl->set_useragent(‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.1’);
// Обрабатываем заголовок Location
$curl->set_followlocation(1);
// Запрещаем вывод данных в браузер
$curl->set_returntransfer(1);
// Устанавливаем ссылку для первого захода
$curl->set_url(‘http://vk.com/’);
// Нам необходимо вывести заголовки,
// поэтому устанавливаем единицу для вывода головы документа
$curl->set_header(1);
// Получаем тело документа и одновременно устанавливаем cookies
$curl->set_cookie($curl->exec(false));

// POST запрос будем передавать по этой ссылке
$curl->set_url(‘http://login.vk.com/?act=login’);
// Собственно сам POST запрос
$curl->set_post(«act=login&act=login&al_frame=1&captcha_key=&captcha_sid=&email=». EMAIL .»&expire=&from_host=vkontakte.ru&pass=». PASSWORD .»&q=1″);

// Получаем тело документа и одновременно устанавливаем cookies
$curl->set_cookie($curl->exec(false));

// Указываем реферера
$curl->set_referer(‘http://login.vk.com/?act=login’);
// Устанавливаем конечную ссылку
$curl->set_url(‘http://vk.com/login.php?’);
// Отключаем вывод головы документа
$curl->set_header(0);
// Выполняем
echo $curl->exec(false);

$curl->close();
?>
Метод exec(boolean flag) класса curl принимает один из двух параметров: true или false. Если указать true, то на выходе будет следующее: CP1251 -> UTF-8. Результат вы получите в кодировке UTF-8. С кодировками следует быть особенно внимательно. Может случиться так, что вы не получите вообще данных и будете сами искать не существующий баг, а дело то было всего лишь в неправильно переданном параметре. Очень часто надо просто экспериментировать. Вы можете скачать полный исходник . Класс cURL прилагается.