Home

Awesome

VKAPI

API для Вконтакте

<details> <summary> Покрытие методов - 83% </summary>
Группа%
Account100
Ads0
AppWidgets0
Apps20
Asr100
Audio79
Auth100
Board100
Database100
Docs100
DownloadedGames100
Fave100
Friends100
Gifts100
Groups100
LeadForms0
Leads0
Likes100
Market100
Messages100
Newsfeed100
Notes100
Notifications100
Orders25
Pages100
Photos100
Podcasts100
Polls100
PrettyCards0
Search100
Secure100
Stats100
Status100
Storage100
Stories100
Streaming100
Users100
Utils100
Video100
Wall100
Widgets0
</details>

Заметки

Для некоторых старых версий среды требуется указать директиву OLD_VERSION.

Note

For old IDE versions, include OLD_VERSION directive

Способы авторизации

1 . Авторизация через OAuth2 форму

Для FMX - VK.FMX.OAuth2 - TFormFMXOAuth2
Для VCL - VK.VCL.OAuth2 - TFormOAuth2
...
var 
  FToken: string;
  FChangePasswordHash: string;
  FTokenExpiry: Int64;
...

procedure TFormMain.VKAuth(Sender: TObject; Url: string; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
begin
  if FToken.IsEmpty then
  begin
    TFormFMXOAuth2.Execute(Url,
      procedure(Form: TFormFMXOAuth2)
      begin
        FToken := Form.Token;
        FTokenExpiry := Form.TokenExpiry;
        FChangePasswordHash := Form.ChangePasswordHash;
        if not FToken.IsEmpty then
          VK.Login;
      end);
  end
  else
  begin
    Token := FToken;
    TokenExpiry := FTokenExpiry;
  end;
end;

VK.Login(<родитель для окна для VCL, необяз.>);

2 . Авторизация напрямую, используя токен (пользовательский или бота)

procedure TFormMain.VKAuth(Sender: TObject; Url: string; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
begin
  Token := '<здесь токен>';
end;   

3 . Авторизация с помощью сервисных ключей (указывается в designtime компоненте)

4 . Прямая авторизация (бета)

VKAPI.Application := TVkApplicationData.Android;  <-- Данные оф. клиента для Android
VKAPI.Login('+7**********', '*****************',
  function(var Code: string): Boolean
  begin
    Code := InputBox('', '', ''); <-- Код двухэтапной авторизации
    Result := not Code.IsEmpty;
  end);

Пример бота

program VKBotTemplate;

uses
  VK.Bot,
  VK.Types,
  VK.Bot.Utils,
  VK.Messages,
  VK.GroupEvents,
  VK.Entity.Message,
  VK.Entity.ClientInfo;

var
  VKBot: TVkBotChat;

begin
  VKBot := TVkBotChat.GetInstance(12345678, '<token>');
  with VKBot do
  try
    OnMessage :=
      procedure(Bot: TVkBot; GroupId: Integer; Message: TVkMessage; ClientInfo: TVkClientInfo)
      begin
        if PeerIdIsUser(Message.PeerId) then
        begin
          if Assigned(Message.Action) then
            case Message.Action.&Type of
              TVkMessageActionType.ChatInviteUser:
                Bot.API.Messages.SendToPeer(Message.PeerId, 'Welcome');
            end
          else
            Bot.API.Messages.SendToPeer(Message.PeerId, 'Your message: ' + Message.Text);
        end;
      end;

    if Init and Run then
    begin
      Console.Run(
        procedure(const Command: string; var Quit: Boolean)
        begin
          Quit := Command = 'exit';
        end);
    end
    else
      Readln;
  finally
    Free;
  end;
end.

Примеры

Получение пользователей

var
  Users: TVkProfiles;
  i: Integer;
begin
  if VK.Users.Get(Users, [286400863, 415730216], TVkProfileFields.All) then
  begin
    for i := Low(Users.Items) to High(Users.Items) do
    begin
      Memo1.Lines.Add('About: ' + Users.Items[i].About);
      Memo1.Lines.Add('BirthDate: ' + Users.Items[i].BirthDate);
      Memo1.Lines.Add('Domain: ' + Users.Items[i].Domain);
      Memo1.Lines.Add('FirstName: ' + Users.Items[i].FirstName);
      Memo1.Lines.Add('Movies: ' + Users.Items[i].Movies);
      Memo1.Lines.Add('------------');
    end;
    Users.Free;
  end;
end;

Установка статуса онлайн

if VK.Account.SetOnline then
  Memo1.Lines.Add('online')
else
  Memo1.Lines.Add('Error online');

Создание поста в группе

var
  Params: TVkWallParams;
begin
  Params.Message('Test Text');
  Params.OwnerId(-145962568);
  Params.FromGroup(True);
  Params.Signed(True);
  Params.Attachments([Attachment.Doc(58553419, 533494309, '657138cd5d7842ae0a')]);
  VK.Wall.Post(Params);
end;  

Отправка сообщения

Vk.Messages.Send.PeerId(Message.PeerId).Message(FAnswer).Send.Free;

или, с созданием клавиатуры

var
  Keys: TVkKeyboardConstructor;
begin
  Keys.SetOneTime(True);
  Keys.AddButtonText(0, 'Погода', 'weather', bcPositive);
  Keys.AddButtonText(0, 'Отмена', 'cancel', bcNegative);
  Keys.AddButtonText(1, 'Информация', 'info', bcPrimary);
  Keys.AddButtonText(1, 'Команды', 'commands', bcSecondary);
  Vk.Messages.New.
    PeerId(PeerId).
    Keyboard(Keys).
    Message('Выбери вариант').
    Send;
end;

или простое

VK.Messages.Send(PeerId, 'Текст сообщения', [<вложения>]);

Отправка фото

VK.Messages.New.UserId(58553419).AddPhotos(['D:\Downloads\6q8q9f.gif']).Send;

Получение аудиозаписей плейлиста (альбома)

var
  List: TVkAudios;
  Params: TVkParamsAudio;
begin
  Params.OwnerId(415730216);
  Params.AlbumId(86751037);
  if VK.Audio.Get(List, Params) then
  try
    for var i := Low(List.Items) to High(List.Items) do
      Memo1.Lines.Add(List.Items[i].Artist + '-' + List.Items[i].Title);
  finally
    List.Free;
  end;
end;    

Использование метода Walk, для выполнения методов с параметрами Count и Offset

Это простой цикл, который вызывает наш метод регулируя Offset. Cancel позволяет закончить цикл, до завершения всего обхода

Метод позволяет получить все элементы определённого метода с Count и Offset Достаточно написать стандартную конструкцию получения данных с помощью искомого метода внутри передаваемой анонимной функции в Walk и указать шаг получения кол-ва элементов.

VKAPI.Walk(
   function(Offset: Integer; var Cancel: Boolean): Integer
   var
     Audio: TVkAudio;
     Audios: TVkAudios;
     Params: TVkParamsAudio;
   begin
     Result := 0;  //Метод должн вернуть кол-во фактически полученных элементов
     Params.Count(100);
     Params.Offset(Offset);
     if VKAPI.Audio.Get(Audios, Params) then
     begin
       Result := Length(Audios.Items);  //Возвращение кол-во полученных элементов
       for Audio in Audios.Items do
       begin
         //Do somethings with Audio
       end;
       Audios.Free;
     end
     else
       Cancel := True;
   end, 100);  // 100 - параметр шага запроса, должен соответстовать параметру метода "Params.Count(100);"
<!--stackedit_data: eyJoaXN0b3J5IjpbLTY2MDExNDI1Miw5MzcyNjYxMzQsMzQ1Mj kyMzUsLTE0NDUxODA3NDFdfQ== -->