! c 2013 .

Авторизация Вконтакте C++Builder

17 2012

Сколько же статей на эту тему в рунете.. Но хоть один из способов работает?

Пробуйте хоть все, - ни один!

Когда появилось желание написать xBoolPlayer, я столкнулся с этой проблемой.. перечитал официальную документацию по работе с компонентами TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, но результата не было...

Но сейчас способ все таки нашелся. С одной стороны ничего особенного в нем нет, просто нужно учитывать несколько факторов. 

Все что нам понадобится, это TIdHTTP, снифер, барузер, ну и немного смышленности.

Для начала зайдем на vk.com, если вы авторизированы - произведите выход.

Вот наш объект:

Исследуем исходный код страницы авторизации и проследим последовательность событий

Находим функцию quick_login()

 

Необязательно осмысливать каждую строку, в этой функции ключевой момент try_to_login
 

Ключевой момент:ge('login').submit(); - если вы создали хоть одну html форму, то сразу почувствуете, вот она, отправка запроса!
И вот на какую формочку мы наткнулись:

Самые простые параметры, в нашем запросе будем использовать лишь те, которые имеют значение. Разве что кроме полей to, al_test> и ip_h - хешированный IP уж нам точно не понадобится..

Как кажется на первый взгляд - это победа! Сформировать POST-запрос и все готово... нуну...

 

Включим снифер, посмотрим что отправляет браузер

 

Host: vk.com
Proxy-Connection: keep-alive
Content-Length: 46
Origin: http://vk.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://vk.com/login.php?m=1&email=fuckall_666%40mail.ru
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: remixlang=0; remixdt=7200; audio_vol=100; remixseenads=1; remixflash=11.1.102; remixchk=5
 
op=a_login_attempt&login=***мой эмейл***­fdOGј
 
После этого запроса сразу же следуют редиректы с GET-запросами!
 
GET http://www.tns-counter.ru/V13a***R%3Ehttp://vk.com/login.php?m=1&email=**мой эмейл**vkontakte_ru/ru/UTF-8/tmsec=vk_total/899708346 HTTP/1.1
Host: www.tns-counter.ru
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11
Accept: */*
Referer: http://vk.com/feed
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: guid=49D10B044F5328ECX1330850028
 
Чего там только не летит! ООоопа!!! А вот это уже интересно!
Вот вам секретный агент, который знает о вас все!
Это своеобразный "счётчик" который владеет информацией о просмотре страниц с вашего IP, какие сообщения читали, какие сообщения отправляли, и много всего прочего!
Может кто не знает, но слежка происходит не только с сайта vk.com. А так же и с вашего любимого компьютера! Подобного рода счетчики "натыканы" повсюду! Но об этом как-нибудь в другой статье)
 
 
Пора приступать к написанию нашей функции авторизации!
Разумеется все моменты объяснять нет смысла, т.к. статья будет содержать избыточную информацию.
Лишь основные, важные моменты буду комментировать.
 
Алгоритм:
1) Подготавливаем авторизационные данные
2) Выключаем редирект
3) Формируем POST-запрос авторизации в нужной кодировке
4) Посылаем сформированный запрос
5) Получаем адрес редиректа
6) Роемся в хедерах на предмет cookies
7) Устанавливаем найденные cookies + те что выдал снифер
8) Включаем редирект (да, пусть отправляет инфу о том, что мы зашли, пусть нас контролируют хД)
9) Получаем страницу по адресу на который были перенаправлены
10) Проверяем результат
 
Поехали:
1)
Объявляем следующие переменные:

2) 

3)

 
Не видел ни одного примера в рунете, где так делают..
А ведь без этого кириллица у вас не пройдет)))
 

 
4)

5)

На всякий случай сохраним результат.. полюбоваться.. и Выведем Хм.. А вот и функция установки vk кук)))

6)
 

7)

8)

9)

10)
Проверяем результат. Как? 
Заходим на vk.com, смотрим что там есть такого, чего не может быть в случае безуспешного входа
Можно сначала обратиться к начальному исследованию страницы входа в vk.com
А именно, там было скрытое поле со значением login
Вот оно:

Руководствуясь логикой, функция отключения должна называться logout
Так ли это? Снова исследуем исходный код страницы vk.com
 
И правда, вот оно:

Это и будет являться определяющим фактором успешной авторизации:
 
Проверяем:

И что получаем в итоге? Думали все наконец-то закончилось и можно парсить странички на предмет музыки/видео/сообщений?
А вот не так то просто оказывается с vk.com
Возможно кого-то уже могло смутить сообщение о редиректе подобное следующему:

 

"Project Project1.exe raised exception class EIdHTTPProtocolException with message 'HTTP/1.0 302 Moved Temporarily'."

 

Но это не должно вас смущать, это совершенно нормально, отладчик предупреждает вас о перенаправлении!
С этим можно жить, но как жить с тем, что все исследование коту под хвост?
 
Ок, разочаровываемся, отчаиваемся и ради успокоения проходим авторизацию vkontakte посредством браузера.
Нууу ладно.. посмотрим чуток исходник страницы..
Нуу почемууу... что же еще ему отправить, чтоб заработало...
Хм... а что он отправляет чтоб не работало? Точнее чтоб отключиться?
 
А вот такая штука:

Все тоже самое.. но что это за ткое al_frame?
Скажу честно когда я увидел это, я даже предположить не мог, что это за чудо такое..
10 минут поиска в Google не дали практически ничего.. кроме ссылок авторизации следующего вида:
 
https://login.vk.com/?al_frame=1&from_host=vk.com
 
Хмм..м.м.мм... ну попробуем отправить и мы ему этот al_frame, чем бы он не являлся!
 
Добавляем в пункт 3:

ПРОБУЕМ! Ииии! Получилось!!!!
Вот так дорогие друзья! Нельзя отчаиваться, когда, руководствуясь логикой, и опытом, вы приходите к негативному результату!
Есть смысл еще позаниматься магией! :D
 
 
Честно говоря я так и не понял что это за al_frame такой... почему он не палится ни снифером, ни в формах запроса авторизации...
можно лишь предположить что это тип выравнивания - alignment: frame