Относительно недавно контакт обновил схему авторизации на более приличную. Сейчас расскажу как она устроена Первым делом мы отправлем запрос: Code: http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&[B]email=мыло@mail.ru&pass=пароль[/B] В ответ мы всегда получаем редирект (заголовок Location). Дальше возможны несколько вариантов: 1. Логин успешен В ответ получаем куки l и p для домена login.vk.com (дальше объясню что это) + редирект (заголовок Location) на vkontakte.ru с параметром hash Code: http://vkontakte.ru/login.php?act=slogin&al_frame=1&[B]hash=96d63a936733f13fe286b0cd5114873d[/B]&s=1 при переходе по редиректу в ответе контакт установит куки remixsid. 2. Контакт хочет капчи Если в ответе есть параметр sid, значит контакт требует капчу. Code: http://vkontakte.ru/login.php?act=slogin&al_frame=1&[B]sid=237888803913[/B]&dif=0&email=мыло@mail.ru Дальнейшие действия такие: a. качаем картинку Code: http://vkontakte.ru/captcha.php?s=1&sid=237888803913 b. пытаемся залогиниться с дополнительными параметрами captcha_sid и captcha_key Code: http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&email=мыло@mail.ru&pass=пароль&[B]captcha_sid=237888803913&captcha_key=буквы[/B] 3. Аккаунт невалидный В этом случае мы получаем редирект типа Code: http://vkontakte.ru/login.php?m=1&email=мыло%40mail.ru В нем нет ни hash ни sid. Куки remixsid, l и p. Давайте посмотрим какая между ними разница. Куки remixsid ставятся для домена vkontakte.ru и используются для всех действий с ВК. Но у них есть один минус – при смене ip они становятся недействительны. В этом случае при любом запросе вместо ожидаемого ответа вы получите редирект Code: http://login.vk.com/?fast=1&from_host=vkontakte.ru&to=bG9jYWpob3N0 При переходе по этому редиректу login.vkontakte.ru проверяет наличие куков l и p. Они, в отличие от remixsid, не привязаны к ip адресу, они привязаны только к логину и паролю (отсюда и название). Дальше все происходит так как описано выше, но с одной особенностью – при попытке логина по кукам l и p никогда не бывает капчи, то есть возможны только варианты 1 и 3. Так что рекомендую их запоминать и авторизоваться всегда по кукам. Бонус У контакта все еще работает старый способ авторизации в 1 запрос: Code: http://vkontakte.ru/login.php?act=login&email=мыло@mail.ru&pass=пароль Этот способ проще, но с ним сложнее отличить невалидный акк от запроса на капчу. Более детально можете изучить сами.
делаем перед авторизацией запрос Code: http://vkontakte.ru/login.php?op=a_login_attempt если в ответе есть упоминанием капчи -- парсим айди капчи,скачиваем, и отправляем этот же запрос с captcha_sid и captcha_key,а потом уже производим авторизацию вроде как уже несколько месяцев..
Проблема с многопоточностью: 1 поток сделал a_login_attempt и получил добро (vklogin) 2 поток быстренько почекал невалидов и схлопотал капчу 1 поток пытается залогиниться, ничего не выходит, и он решает что акк невалидный. Несколько месяцев назад вроде вариант с капчей был как раньше - через a_login_attempt и только потом login.vk.com.
ну дак, a_login_attempt надо делать перед каждой авторизацией,а не при старте потока (или я чего то не понял? )
Потоки работают неравномерно. Каждый поток делает Code: цикл { 1. a_login_attempt 2. авторизация } но может случиться так, что второй поток почекает невалидный акк между этими действиями первого потока.
Если потоков много, то очень часто происходит на практике. Причем с этим сложно что-то сделать. Если поток между этими действиями будет блокировать остальные то получится фактически однопоточно (самое долгое это делать запросы к сети). Чекать невалидные по 2 раза плохо - расход капчи сильно увеличится. Раньше чтобы такой фигни не случалось приходилось durov.ru использовать.
Вариант запроса когда ВК просит проверку по номеру телефона (четыре посл. цифры): PHP: if(stristr($response, "телефона, к которому привязана")) { $tel_code = 'xxxx' // 4 посл. цифры телефона preg_match("#to: '(.+?)'.*?hash: '(.+?)'#is",$response,$match); $post_d = array('al'=>'1','act'=>'security_check','code'=>$tel_code,'to'=>"$match[1]",'al_page'=>'2','hash'=>"$match[2]"); echo sendPost( "http://vkontakte.ru/login.php", $post_d); } Это проверка вылазит когда регион в профиле не соответствует "гео IP". ЗЫ: для ленивых можно просто в CURL использовать опцию: PHP: curl_setopt($ch, CURLOPT_INTERFACE, 'ANY_YOUR_REGION_IP');
Доброго времени суток! Скажите, этот вариант еще актуален? Я использую ViKing.Engine, отправляю запрос Code: http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&email=мыло@mail.ru&pass=пароль В ответ получаю (*** - хэш) Далее при переходе по редиректу Вроде всё ок, но при следующих запросах на страницы контакта получаю редирект Что это значит? Переход по этому редиректу ничего не меняет..
теперь до 4 редиректов выдает домен, при авторизации. надо просто проходить по редиректу по успешной авторизации ставь в цикл проверку на 302
4 раза прошел по редиректу на https://login.vk.com и все равно на 5 опять Location на https://login.vk.com/?fast=1&from_host=vk.com&from_protocol=http&ip_h=
Совсем не ок Set-Cookie: remixsid=***; expires=Sat, 09-Mar-2013 04:56:45 GMT; path=/; domain=.vkontakte.ru
Не забывайте про переезд ВК на vk.com Как минимум http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vk.com&email=мыло@mail.ru&pass=пароль Но желательно еще ip_h (он же ip_hash) парсить.
Вроде получилось! Я просто уже туплю к вечеру.. Переходил по редиректу на логин а потом снова слал запрос на страничку вместо перехода по редиректу от login.vk.com... Всем большое спасибо за ответы! P.S: а зачем парсить? Могут еще какие то проблемы возникнуть?
При авторизации пользователя через браузер отправляется запрос A. При авторизации аккаунта через программу отправляется запрос B, отличающийся от запроса A. Логично, что все пользователи, авторизовавшиеся с помощью запроса B используют программы (что запрещено правилами ВК) или аккаунты были взломаны. Ничто не мешает забанить сразу все аккаунты, авторизующиеся запросом B, честным юзерам это не повредит.