REST Client Library: использование API ВКонтакте

Возможности 07.04.2019
Возможности

В общем задумался я на досуге, что, было бы неплохо научиться постить с помощью делфей в одну из известнейших социальных сетей вКонтакте, задумался, да и решил попробовать свои силы))) Самое интересное, что такой простой авторизации на мой взгляд еще не было, но не будем о лирике…
Кидаем на форму два эдита, и кнопку, которой дадим громкое название 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 ВКонтакте, точней об использовании API в Delphi. Я буду использовать в этой статье Delphi 2010, в принципе вам ее использовать не обязательно, данный материал будет применим к любой версии Delphi. И так, сегодня мы с вами рассмотрим метод авторизации в VK.COM с помощью indy, настройку компонентов indy для работы с API VK. На самом деле все очень-очень просто и 100 раз находится в гуглояндексе и других поисковиках. Но большинство из них написаны еще под vkontakte.ru, API тогда естественно было другое. Ну да ладно, давайте начинать. Для начала нам понадобятся компоненты:

  • IdHTTP
  • IdSSLIOHandlerSocketOpenSSL
  • IdCookieManager

Ну и стандартно:

  • TLabel
  • TEdit
  • TButton

Настраиваем компоненты

ВАЖНО! В папку с исполнительным файлом программы копируем эти DLL

Они есть в архиве к этому материалу.
И так, настройка компонентов для авторизации вконтакте завершена, необходимые DLL библиотеки скопированы, теперь напишем немного кода.

Procedure TForm1.Button1Click(Sender: TObject); var TmpStr: string ; json: TJSONObject ; client_id ,client_secret: string ; Token, IdUser: string ; begin client_id:= Ваш ID полученный на сайте Вконтакте; client_secret:= Секрет от туда же; try TmpStr:= IdHTTP.Get("https://oauth.vk.com/token?grant_type=password&client_id="+client_id+"&client_secret="+client_secret+"&username="+EdtEmail.Text+"&password="+EdtPass.Text); except on E: Exception do begin MessageBox(Application.Handle, PChar(Format("Ошибка: %s",)), "Error", MB_ICONHAND); exit ; end; end; json:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TmpStr),0) as TJSONObject; Token:= json.Get(0).JsonValue.ToString; Token:= StringReplace(Token, """, "", ); IdUser:= json.Get(2).JsonValue.ToString; end;

я осознанно опускаю ту часть в которой обычно рассказывают про то как получить ID и секрет от вконтакте, это вы уже читали в предыдущих постах. У нас же будет только самое необходимое, не какого левого материала).
Объясню код:
Первое что вы наверное не видели в других уроках это json: TJSONObject, да да, я правильно разбираю ответы от сервера, так как того просит религия;). Другими словами это правильная переменная для хранения ответа от сервера на наш GET запрос. Инициализируется она просто: json:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TmpStr),0) as TJSONObject; поля вытащить из нее тоже не составляет большого труда: Token:= json.Get(0).JsonValue.ToString;
Токен и айди пользователя нужны для дальнейшего выполнения API функций, о которых мы поговорим с вами в следующих статьях.
Ну собственно и все на этом по коду. Проверку авторизации не делаю, оставляю это вам)))

Вполне сгодится для работы с любой социальной сетью или онлайн сервисом, которые предоставляют нам в распоряжение 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, по которому необходимо перейти пользователю для авторизации.



Рекомендуем почитать

Наверх