уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Небольшая заметка по мотивам обсуждения предыдущей статьи на тему использования API ВКонтакте в Delphi.  Чтобы дважды не повторяться и не писать один и тот же код снова и снова, скажу, что в этой статье будут использованы наработки из предыдущей статьи и здесь я просто продолжу писать небольшое Android-приложение для ВК.

В принципе, задача реализации того  или иного API онлайн-сервиса в Delphi с использованием REST Client Library очень сильно упрощается и сводится, по большому счёту, к двум простым операциям: 1. составить и отправить запрос; 2. получить ответ в формате JSON и разобрать его. Нам уже не надо писать свои классы и целые модули для авторизации, как я это делал ранее. Не требуется даже разбирать ответ сервера, чтобы получить JSON-объект, т.к. библиотека вернет нам его сама, в случае успешного запроса. Однако, в некоторых случаях, например, как в случае с Dropbox, все же требуется небольшое вмешательство в работу библиотеки, но это, я бы сказал, особенности конкретного API, а не проблемы REST Client Library. 

После того, как я опубликовал заметку «REST Client Library: использование API ВКонтакте» в комментариях произошла небольшая беседа относительно кодировок текста. Что тут сказать? «Кракозябры» вместо текста — это настоящий бич разработчика :) А, если серьезно, то работа с кодировкой текста — дело серьезное и об этом я писал, но, правда, уже давным давно.

Итак,  как же REST Client Library справится с отправкой текста на сервер ВК? Проверим это на примере отправки простого текстового сообщения на стену авторизованного пользователя. Для этого немного допишем код нашего приложения для ВК (весь код которого представлен тут).

Первое, что нам необходимо добавить в приложении — это запросить необходимые права доступа. В API ВКонтакте при авторизации, как и в любых других API можно указывать параметр scopes, которые устанавливает права доступа для нашего приложения. О всех возможных правах доступа в ВК можно почитать на этой странице документации. Нам, по большому счету, потребуется всего одно значение — wall, чтобы иметь возможность публиковать записи на стене пользователя, но Вы также можете добавить свои значения из предложенного в документации списка и, например, попросить выдавать бессрочный токен доступа, право менять статус и т.д.

Второе, как правильно заметил один из постоянных читателей блога в предыдущей статье про ВК — это то, что при любых запросах к API ВК необходимо в обязательном порядке указывать версию API. Для того, чтобы узнать, какая версия API актуальная, необходимо зайти вот на эту страницу документации. На момент написания этой заметки актуальной версией API была версия 5.24.

Третье. Для многих запросов к API нам необходимо указывать идентификатор пользователя. Идентификатор текущего пользователя возвращается нам вместе с токеном доступа при авторизации.

Теперь реализуем все вышесказанное в коде. Для реализации первых двух пунктов  создадим две константы:

const
  cAppID = 'ХХХХХ';
  [....]
  cScope = 'wall';
  cAPIVersion = '5.24';

Для хранение идентификатора пользователя создадим переменную:

type
  TForm1 = class(TForm)
    [..]
  private
    UserId: string;
    [...]
  public
    [...]
  end;

Теперь допишем методы Auth и AfterRedirect. Всего две строки — по одной в каждом методе:

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
        [...]
        UserId:=Params.Values['user_id']; //сохраняем идентификатор пользователя
      finally
        Params.Free;
      end;
      WebForm.Close;
    end;
end;
 
procedure TForm1.Auth;
begin
 [...]  
  OAuth2Authenticator1.Scope:=cScope; //задаем права доступа для приложения
  WebForm.ShowWithURL(OAuth2Authenticator1.AuthorizationRequestURI);
end;

Всё. Теперь наше приложение будет запрашивать необходимые права и сохранять идентификатор пользователя. Можно приступать к реализации метода отправки сообщения на стену пользователя. Ознакомиться с документацией к методу можно здесь.

Бросим на форму кнопку TButton и определим её свойство Text как «Message». Должно получиться как-то так:

VK_1В обработчике OnClick кнопки напишем следующий код:

procedure TForm1.Button3Click(Sender: TObject);
var S: string;
begin
  S:=InputBox('Новое сообщение','Текст сообщения','Текст для проверки');
  RESTRequest1.Resource:='wall.post';
  RESTRequest1.Method:=TRESTRequestMethod.rmPOST;
  RESTRequest1.Params.Clear;
  with RESTRequest1.Params.AddItem do
    begin
      name:='v';
      Value:=cAPIVersion;
      Kind:=TRESTRequestParameterKind.pkGETorPOST;
      Options:=[poDoNotEncode];
    end;
  with RESTRequest1.Params.AddItem do
    begin
      name:='owner_id';
      Value:=UserId;
      Kind:=TRESTRequestParameterKind.pkGETorPOST;
      Options:=[poDoNotEncode];
    end;
  with RESTRequest1.Params.AddItem do
    begin
      name:='message';
      Value:=S;
      Kind:=TRESTRequestParameterKind.pkGETorPOST;
      Options:=[poDoNotEncode];
    end;
  RESTRequest1.Execute;
end;

Собственно, это и всё, что нам необходимо для того, чтобы отправить простой текст на сервер. На что здесь стоит обратить внимание?
1. Для отправки сообщения используем метод POST:

RESTRequest1.Method:=TRESTRequestMethod.rmPOST;

2. Все три параметра запроса мы вставляем в запрос как есть, т.е. без перекодирования:

Options:=[poDoNotEncode];

3. Строка S:string вставляется в запрос опять же как есть — ничего нигде не перекодируется и не преобразуется:

with RESTRequest1.Params.AddItem do
  begin
    [...]
    Value:=S;
    [...]
  end;
При этом, особо отмечу, что свойства компонента TRESTRequest вообще не менялись, т.е. остались в значении по умолчанию.

Проверим, как сработает наше приложение.

1. Авторизуемся в ВК:

Screenshot_2014-08-24-18-15-51

Приложение запросило необходимые права, что можно увидеть на скриншоте выше.

2. Пробуем отправить на стену сообщение.

Screenshot_2014-08-24-18-18-19

Для «чистоты эксперимента» текст специально задан на родном русском языке. Смотрим, что появилось на страничке в ВК:

VK_2

Как видите, всё в полном порядке. Текст пришел без всяких кракозябр. Что ещё раз доказывает, что REST Client Library прекрасно справляется с возложенными на неё функциями.

Не забудьте подставить свои значения AppKey и AppId в константы.

Книжная полка

Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес

 

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
16 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Владимир Тютимов

Я на форуме в обсуждении статьи, написал свою проблему. Дайте ответ, пожалуйста.

Сергей
Сергей
29/09/2014 22:01

У меня возник такой вопрос. Как получить доступ к фотографиям на странице пользователя и сохранить их в телефоне или отправить по email

Владимир Тютимов
Ответить на  Сергей

В ВК API есть метод «photos.getAlbums». С его помощью получаете список альбомов пользователя. С помощью метода «photos.get» получаете фото из определенного альбома. В ответ от сервера придет JSON с данными, строки с именем photo_XXX (xxx — размер) содержат ссылки на фото определенного размера. Остается скачать фото и сохранить.

Александр Проказюк

Я пробую переписать ваш пример под Windows VCL проекте, и соответственно возникла проблема:
Авторизацию прохожу, загружаю форму, и в тот момент когда даю доступ приложению происходит редайрект на страницу с надписью «Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов…» Но процедура AfterRedirect не вызывается.
У вас в примере есть процедуры
procedure Tfrm_OAuthWebForm.WebBrowserDidFinishLoad(ASender: TObject);
procedure Tfrm_OAuthWebForm.WebBrowserShouldStartLoadWithRequest(ASender: TObject; const URL: string);

которые связаны с
WebBrowser.OnDidFinishLoad = WebBrowserDidFinishLoad
WebBrowser.OnShouldStartLoadWithRequest = WebBrowserShouldStartLoadWithRequest

На сколько я понимаю, данные свойства есть у FMX.WebBrowser, но не у простого WebBrowser. Собственно, как заставить простой браузер (Не FMX) отловить редайрект и выполнить процедуру AfterRedirect?

Александр Проказюк
Ответить на  Vlad

То есть мне просто нужно привязать WebBrowserDidFinishLoad и WebBrowserShouldStartLoadWithRequest к навигейтам?

Сергей
Сергей
07/10/2014 22:52

Предлагаю общими усилиями написать нечто похожее на VK Musik. Будет неплохой материал для изучения, тем более, что тема актуальна

trackback

[…] разбираться с API ВКонтакте. За время, прошедшее с последней публикации на эту тему, пообщался с несколькими людьми по поводу […]

Дмитрий
Дмитрий
16/07/2015 04:33

Как вписывать текстовые значения параметров в RESTRequest1.Params.AddItem понятно, а как передать файл? в частности Jpeg изображение? Буду очень признателен за помощь! :)

Дмитрий
Дмитрий
16/07/2015 18:23
Ответить на  Дмитрий

Покопался немного в документации, похоже, что в библиотеке REST это пока не реализовать…

Сергий Борийчук

Здравствуйте! Нашел Ваш блог, и как глоток воздуха. Имею небольшие навыки написания на Дельфи, и вот сейчас пришлось осваивать АПИ ВК. Windows VCL. Задача достаточно простая, но я уперся в отсутствие личного опыта, а серфинг по сети не помогает. Если перенести Ваш пример напрмую в VCL, Делфи10, то в Мемо находится следующий текст: Test Мой первый автоматический пост. Мій перший автоматичний пост. ‘ЇїЁёЄєЭэ» Test. В ВК приходит Test ?4??4??1? ?4??4??4??4??5??1? ?4??4??4??4??4??4??4??4??4??4??4??4??4??1? ?4??4??4??1?. ̳?1? ?4??4??4??5??4??1? ?4??4??4??4??4??4??4??4??4??4??4??1? ?4??4??4??1?. ‘?2??2??2??2??2??2??4??5?» Test. Я просмотрел Ваш материал по перекодировке, но пока явно туплю. Возможно просто моск отказывается думать… Вот, собственно сам код procedure TForm1.Button2Click(Sender: TObject);… Подробнее »

Сергей Ремянников

А как разлогиниваться? Например, пользователю надо сначала авторизоваться под ВК, а потом он передумал и решил через Facebook…

Юра Нестерук
29/07/2016 15:24

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