С 17.06.2015 прямая авторизация ВКонтакте через логин и пароль перестала работать. Речь идет не об авторизации через OAuth, а именно через отправку GET запросов с помощь Curl PHP, имитирующих браузер.
Для чего этого необходимо? Для вызова некоторых функций Вконтакте, которые не доступны через API Вконтакте, или из-за существующий ограничений.
Раньше достаточно было отправить GET запрос наhttp://login.vk.com/?act=login
передав параметры&email=***
(логин) и &pass=***
(пароль). С недавних пор авторизация не происходит, вместо этого производится переадрессация по адресу:
http://vk.com/login.php?&to=&s=0&m=1&email=
Решение
Для того, чтобы произвести авторизацию необходимо отправить запрос на авторизацию по адресу https://login.vk.com/?act=login
. Для этого нужно использовать POST запрос, в котором кроме логина и пароля необходимо указать следующие параметры:
act: login role: al_frame ip_h: <ip_h> lg_h: <lg_h> email: <логин> pass: <пароль> expire: captcha_sid: captcha_key: _origin: http://vk.com q: 1
Из важного: добавились параметры ip_h
и lg_h
, которе легко парсятся со страницы http://vk.com
и выглядят так:
<input type="hidden" name="ip_h" value="47bf161c03f465d43a"/> <input type="hidden" name="lg_h" value="3f4654161cd43f07bf"/>
Алгоритм авторизации Вконтакте на PHP становится следующим:
1. С помощью CURL открываем http://vk.com
и парсим значения ip_h
и lg_h
. Простенькие регулярки будут иметь вид:
preg_match('/<input type="hidden" name="ip_h" value="(.+)" \/>/i', $vk_html, $ip_h); preg_match('/<input type="hidden" name="lg_h" value="(.+)" \/>/i', $vk_html, $lg_h)
2. Передаем полученные значения вместе с остальными параметрами POST запросом на url https://login.vk.com/?act=login
. В итоге запрос будет иметь приблезительно такой вид:
https://login.vk.com/?act=login&ip_h=***&lg_h=***&role=al_frame&email=***&pass=***&expire=&captcha_sid=&captcha_key=&_origin=http://vk.com&q=1
3. Сохраняем куки в файл и вызываем необходимую страницу Вконтакте для парсинга, например https://vk.com/feed?section=photos
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
Проделайте предварительно п.1 и п.2 вручную чтоб убедится что все работает, получив предварительно значения ip_h
и lg_h
через исходный код страницы (комбинация Ctrl+U
в браузере). В результате вас должно перенаправить на пустую страницу, а в адресной строке должно содержатся некое значение __q_hash
.