Добрый день.
Необходимо авторизировать пользователя vk с помощью PHP скрипта и библиотеки cURL.
Были рассмотрены следующие решения:
https://forum.antichat.ru/threads/426901/
http://sauron.org.ua/post/938
На основе решений были составлены следующие скрипты.
Получение значений lg_h и ip_h (работает, получает):
$url = 'http://vk.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT
6.1)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'content-type: application/x-www-form-urlencoded',
'origin: http://vk.com',
'referer: http://vk.com/',
));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$content = curl_exec($ch);
preg_match_all("/name=\"ip_h\" value=\"(.*?)\" \\//s", $content, $ip_h);
preg_match_all("/name=\"lg_h\" value=\"(.*?)\" \\//s", $content, $lg_h);
Отправка запроса авторизации вида:
http://login.vk.com/?
act=login&
role=al_frame&
_origin=http://vk.com&
ip_h=$ip_h&
lg_h=$lg_h&
email=&
pass=
Сам скрипт:
$url = 'http://login.vk.com/?act=login';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:42.0)
Gecko/20100101 Firefox/42.0");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);
$data = array(
'act' => 'login',
'role' => 'al_frame',
'_origin' => 'http://vk.com',
'ip_h' => $ip_h[0][1][0],
'lg_h' => $lg_h[0][1][0],
'email' => '',
'pass' => ''
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'content-type: application/x-www-form-urlencoded',
'origin: http://vk.com',
'referer: http://vk.com/',
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, '/home//Development/vk/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home//Development/vk/cookie.txt');
echo curl_exec($ch);
На выходе получаю следующее содержимое страницы:
В свою очередь куки принимают следующие значения:
Set-Cookie: remixmid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsid6=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixgid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixemail=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixpass=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixapi_sid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;
domain=.vk.com
Set-Cookie: remixpermit=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsslsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Смею предположить, что не удается передать значение email, т.к. в коде JS именно
на это и ошибка. При ручном составлении URL и перехода по нему — успешное возвращение
хэша и содержимое страницы следующее:
Авторизация проходит успешно. После доступен профиль пользователя.
Ответы
Ответ 1
Только что написал рабочий код авторизации во ВКонтакте — http://pastebin.com/5YecKuUs
Только учтите, каптча не поддерживается, поэтому сами уже её добавьте.
Тест успешно пройден на моём тестовом аккаунте ;)
Ответ 2
Есть рабочая библиотека для PHP, которая получает куку remixsid.
Ответ 3
По состоянию на июль 2018 это рабочий код.
Авторизация через мобильную страницу т.к. проще.
$email = "{ТЕЛЕФОН}";
$pass = "{ПАРОЛЬ}";
$auth_url = "https://m.vk.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $auth_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//файл для сохранения кукис - cookie.txt
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//получаем содержимое формы авторизации (URL атрибута action)
$login_page = curl_exec($ch);
curl_close($ch);
//парсим страницу...
$html = str_get_html($login_page);
//..и узнаем урл авторизации (использовал библиотеку Simple PHP DOM Parser)
$login_url = $html->find("form",0)->action;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//отправляем ПОСТ запрос
curl_setopt($ch, CURLOPT_POST, 1);
//следуем за редиректом
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//данные запроса
curl_setopt($ch, CURLOPT_POSTFIELDS, ["email"=>$email, "pass"=>$pass]);
//СНАЧАЛА ЧИТАЕМ КУКИ полученные в первом запросе
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
//потом ДОБАВЛЯЕМ НОВЫЕ
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
//пользователь авторизован
//далее тестируем
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://vk.com/groups?act=catalog");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//только читаем куки
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($ch);
curl_close($ch);
//если ваш сервер работает на UTF-8, в отличие от VK (windows-1251)
echo iconv('windows-1251','utf-8',$page);
Ответ 4
Попробуйте закодировать функцией urlencode