В общем задумался я на досуге, что, было бы неплохо научиться постить с помощью делфей в одну из известнейших социальных сетей вКонтакте, задумался, да и решил попробовать свои силы))) Самое интересное, что такой простой авторизации на мой взгляд еще не было, но не будем о лирике…
Кидаем на форму два эдита, и кнопку, которой дадим громкое название Login. Получим уродца как на скрине:

Далее в uses дописываем IdHTTP
Теперь в обработчике событий нажатия кнопки Login пишем следующее:

Procedure TForm1.btnLoginClick(Sender: TObject); var http: TIdHTTP; Data: TStringList; Coocies: string; begin HTTP:= TIdHTTP.Create(Self); HTTP.HandleRedirects:= True; HTTP.Request.UserAgent:= "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1"; try HTTP.Get("http://login.vk.com/?act=login&q=1&al_frame=1&from_host=vkontakte.ru&email="+Edit1.Text+"&pass="+Edit2.Text); except end; Cookies:= SetCookies(HTTP.Response.RawHeaders.Text); if Pos("remix", Cookies)0 then ShowMessage("Авторизовались"); HTTP.Free; end;

SetCookies — самописная функция выгребающая кукисы, т.к. кукиманагеру инди я не доверяю, в одном проекте уж больно он мне подосрал))))

Function SetCookies(Raw: string): string; var PosCook: Integer; Cook: string; begin Cook:= ""; Cook:= "Cookie: "; PosCook:= Pos("Set-Cookie:", Raw); while PosCook0 do begin Delete(Raw, 1, PosCook-1); Cook:= Cook + Copy(Raw, 12, Pos(";", Raw)-11); Delete(Raw, 1, Pos(";", Raw)); PosCook:= Pos("Set-Cookie:", Raw); end; Result:= Cook+"remixlang=0;"; end;

А теперь внимание, как вы видите, у меня не стоит проверка на появление капчи при логине, скажем так, это есть домашнее задание!)))

Захотелось попробовать сие дело в действии, да и централизованное хранение паролей тоже не помешает, хотя есть и свои минусы, но когда оборудования реально дохрена, то на каждый сервер ставить пас, потом менять его ручками, становится слегка геморно, хотя можно юзать ключи для ssh, но ведь зачастую авторизация не только по ssh необходима, в общем решил потестить как себя будет вести данная связка.

Недавно писал себе программулину, сливающую резервные копии с фтп сервера на локальный тазик, и пришлось сесть подразобраться с Indy компонентом idFTP.

Недавно задумался над тем что было бы неплохо постить автоматом новости на новостные порталы под чудесной CMS DLE, но для начала надо научиться авторизовываться автоматом, подумал я, и не долго думая достал запылившийся Delphi, запустил.

Собственно возникла такая необходимость в одной из программ вытаскивать случайное слово из строки, самому писать было лень, гугление не принесло результатов, пришлось вспомнить былые годы и напрячь мозговые центры)))) Ничего сложного нет, алгоритм прост, хотя я и не настаиваю на его универсальности и простоте, кому как, но на скорую руку написал следующее, в двух словах по алгоритму, в строке выдергиваем случайный символ, и если это не пробел, то увеличиваем номер символа пока не получаем пробел (банально)))), после удалем из строки все символы, начиная с первого, заканчивая пробелом, далее копируем в результат все, начиная с первого символа, заканчивая пробелом, номер символа которого мы получим из Pos(‘

Хех, на днях опыты с контактом привели к рождению программы, для постинга в группы контакта, умеет постить коменты в указанные топики, полностью повторяет действия человека, отловить практически невозможно этого ботика))) В общем принимаю заказы для оптимизации программы под ваши нужды.

Простая функция транслита в delphi. function Translit(s: string): string; const rus: string = ‘абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ’; lat: array of string = (‘a’, ‘b’, ‘v’, ‘g’, ‘d’, ‘e’, ‘yo’, ‘zh’, ‘z’, ‘i’, ‘y’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘r’, ‘s’, ‘t’, ‘u’, ‘f’, ‘kh’, ‘ts’, ‘ch’, ‘sh’, ‘shch’, »», ‘y’, »», ‘e’, ‘yu’, ‘ya’, ‘A’, ‘B’, ‘V’, ‘G’, ‘D’, ‘E’, ‘Yo’, ‘Zh’, ‘Z’, ‘I’, ‘Y’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘R’, ‘S’, ‘T’, ‘U’, ‘F’, ‘Kh’, ‘Ts’, ‘Ch’, ‘Sh’, ‘Shch’, »», ‘Y’, »», ‘E’, ‘Yu’, ‘Ya’);

Вполне сгодится для работы с любой социальной сетью или онлайн сервисом, которые предоставляют нам в распоряжение API. Но “ВКонтакте”, всё же из всех мне известных социальных сетей (за исключением, наверное, Twitter) является самой популярной в России, поэтому с ней и попробуем поработать, используя в работе Delphi XE6 . Ну, а чтобы было ещё более занимательно, попробуем написать небольшое приложение для Android . Кому потребуется приложение для Windows и VCL, думаю легко разберется в том, какие модули следует подключить в uses, а какие наоборот - убрать.

1. Создаем свое приложение “ВКонтакте” и пробуем авторизовать пользователя.

Для начала работы с API “ВКонтакте” необходимо создать новое приложение и получить необходимые данные для авторизации пользователей. Для этого заходим на страницу разработчиков и жмем вверху страницы кнопку “Создать приложение “:

Жмем кнопку “Подключить приложение” после чего вам предложат подтвердить свое действие, выслав на мобильный телефон проверочный код. После подтверждения Вам станет доступно изменение настроек приложения:

Переходим на вкладку “Настройки” и запоминаем ID приложения и Защищенный ключ :

Теперь можно переходить к Delphi XE6 и попробовать реализовать авторизацию пользователя.

Запускаем Delphi XE6, создаем новый проект для мобильных устройств и на главную форму бросаем компоненты, покзанные на рисунке ниже:

Сейчас нам нужны будут следующие компоненты: TButton , TRESTClient , TRESTRequest , TRESTResponse и TOAuth2Authenticator . Клик по кнопке TButton будет вызывать процесс авторизации пользователя. Для начала, напишем процедуру авторизации пользователя.

Теперь необходимо вызвать форму для авторизации пользователя “ВКонтакте” и получить Access Token. Как это делать я достаточно подробно рассказывал в самоё первой статье по . Подключаем в uses модуль REST.Authenticator.OAuth.WebForm.FMX и определяем следующую переменную:

type TForm1 = class (TForm) [ ... ] private WebForm: Tfrm_OAuthWebForm; public { Public declarations } end ;

Напомню, что Tfrm_OAuthWebForm - это форма, на которой расположен компонент TWebBrowser с помощью которого пользователь заходит на сайт, чтобы ввести свои логин/пароль и получить доступ для приложения к каким-либо данным своего аккаунта. Соответственно нам, как разработчикам, эта форма необходима, как минимум, для того, чтобы “отловить” редирект на специальный URL, который будет содержать необходимый нам Access Token. Для управления редиректами у Tfrm_OAuthWebForm определено сразу два события:

type TOAuth2WebFormRedirectEvent = procedure (const AURL: string ; var DoCloseWebView : boolean ) of object ; property OnBeforeRedirect: TOAuth2WebFormRedirectEvent read FOnBeforeRedirect write FOnBeforeRedirect; property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect;

Нам необходим обработчик события OnAfterRedirect. Напишем его:

type TForm1 = class (TForm) [ ... ] private WebForm: Tfrm_OAuthWebForm; procedure AfterRedirect(const AURL: string ; var DoCloseWebView : boolean ) ; [ ... ] public { Public declarations } end ; procedure TForm1. AfterRedirect (const AURL: string ; var DoCloseWebView: boolean ) ; var i: integer ; Str: string ; Params: TStringList; begin i: = pos ("#access_token=" , AURL) ; if (i> 0 ) and (OAuth2Authenticator1. AccessToken = EmptyStr) then begin Str: = AURL; Delete (Str, 1 , i) ; Params: = TStringList. Create ; try Params. Delimiter : = "&" ; Params. DelimitedText : = Str; OAuth2Authenticator1. AccessToken : = Params. Values [ "access_token" ] ; OAuth2Authenticator1. AccessTokenExpiry : = IncSecond(Now, StrToInt (Params. Values [ "expires_in" ] ) ) ; finally Params. Free ; end ; WebForm. Close ; end ; end ;

Таким образом, после редиректа мы проверяем есть ли в URL подстрока #access_token= и, если такая строка имеется, то вытаскиваем из URL данные по Access Token и время его жизни - значение параметра expires_in.

Обратите внимание, что данные для доступа к API мы записываем сразу в компонент TOAuth2Authenticator1

Теперь нам необходимо создать форму, определить обработчик OnAfterRedirect и в нужный момент показать эту форму пользователю.
Что касается создания/уничтожения объекта формы, то это можно сделать где вам удобно. Для примера, я создаю форму авторизации в OnCreate главной формы, а уничтожаю, соответственно, в OnDestroy:

procedure TForm1. FormCreate (Sender: TObject ) ; begin WebForm: = Tfrm_OAuthWebForm. Create (nil ) ; WebForm. OnAfterRedirect : = AfterRedirect; end ; procedure TForm1. FormDestroy (Sender: TObject ) ; begin WebForm. Free ; end ;

type TForm1 = class (TForm) [ ... ] private WebForm: Tfrm_OAuthWebForm; procedure AfterRedirect(const AURL: string ; var DoCloseWebView : boolean ) ; procedure Auth; public { Public declarations } end ; procedure TForm1. Auth ; begin OAuth2Authenticator1. AccessToken : = EmptyStr; OAuth2Authenticator1. ClientID : = cAppID; OAuth2Authenticator1. ClientSecret : = cAppKey; OAuth2Authenticator1. ResponseType : = TOAuth2ResponseType. rtTOKEN ; OAuth2Authenticator1. AuthorizationEndpoint : = cEndPoint; WebForm. ShowWithURL (OAuth2Authenticator1. AuthorizationRequestURI ) ; end ;

Здесь мы, опять же, используем компонент TOAuth2Authenticator - записываем в него данные нашего приложения (ID и секретный ключ), а также получаем URL, по которому необходимо перейти пользователю для авторизации.

В этом уроке я покажу вам достаточно простой и эффективный способ авторизации в небезызвестной социальной сети ВКонтакте, например, для получения какой-либо информации.
Всем известно, что в социальных сетях в настоящее время зарегистрировано огромное количество пользователей, в частности в соц. сети ВКонтакте. Поэтому синхронизация, привязка различных данных из аккаунтов соц. сетей к различным приложениям и играм является достаточно актуальной темой. Для того чтобы получать эту информацию в Delphi, можно провести авторизацию посредством библиотеки Indy, принять все cookies и получить необходимую информацию. В интернете можно найти огромное множество различных способов авторизации ВКонтакте посредством Indy, однако будьте уверены, что 99% этих способов не работают, или перестали работать уже очень давно. Это обуславливается тем, что ВКонтакте постоянно изменяется, в него вносится постоянно множество изменений. Способ, который предлагаю я, на сегодняшний день (12 марта 2012) работает достаточно неплохо. Итак, привожу код самой авторизации с подробными комментариями:
var
s: string;
http: TIdHTTPEx;
begin
http:= TIdHTTPEx.Create;
// Создаем экземпляр класса TIdHTTPEx
http.Request.UserAgent:=
‘Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.62 Version/11.01’;
// Маскируемся под оперу 🙂
try
s:= http.GetEx(‘http://vk.com/login.php?m=1&email=’ + email +
‘&pass=’ + pass);
// пробуем залогиниться
// для этого выполняем обычный GET запрос, в котором прямо в адресе передаем
// значения email и pass
except
// при авторизации происходит редирект,
// который обязательно необходимо обработать,
// иначе корректно залогиниться нам не удастся
if http.ResponseCode = 302 then
s:= http.GetEx(‘http://vk.com’ + http.Response.Location);
end;

Обратите внимание на то, что в качестве email`а нужно указывать email, который привязан к аккаунту! Если вы укажете вместо email свой номер телефона, по которому вы регистрировались, или логин, то авторизация скорее всего будет неуспешной. В настоящее время привязка аккаунта ВКонтакте к email не обязательна и при регистрации не требуется. Привязать ваш email к аккаунту можно в настройках аккаунта.

Как вы уже заметили, для проведения самой авторизации я использую не стандартный класс TIdHTTP, а TIdHTTPEx, который отличается тем, что более корректно принимает и отправляет печенья. TIdHTTPEx основан естественно на базе стандартного TIdHTTP. Для работы с TIdHTTPEx вам потребуется скачать модуль по этой ссылке , кинуть его в папку с будущим проектом, а затем объявить его в разделе uses.

Итак, если логин и пароль были введены правильно, то авторизация должна пройти без проблем. Чтобы проверить авторизировались ли мы, давайте пропарсим полученный исходный код страницы ВКонтакте, который я поместил в строковую переменную s. Определить успешность авторизации достаточно просто: для этого мы всего лишь поищем в той самой строке s слово ‘logout’, которое появляется в исходном коде в ссылке ‘Выйти’ (для выхода из аккаунта). Если это слово в строке s обнаружено, значит мы успешно авторизировались:
if Pos(‘logout’, s) <> 0 then
ShowMessage(‘Авторизация успешна’)
else
ShowMessage(‘Авторизация неудачна’);
Поместим этот код сразу же после кода с авторизацией.
Теперь, когда мы прошли авторизацию, мы можем получать различную информацию из аккаунта. Делается это достаточно простым парсингом строки s. Можно также зайти на другую страницу ВКонтакте, мы все равно будем авторизованны. Кстати парсить строки очень удобно при помощи библиотеки RegExpr.