/VK_API

VK API Wrapper

Primary LanguagePascalGNU General Public License v3.0GPL-3.0

VKAPI

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

Покрытие методов - 83%
Группа %
Account 100
Ads 0
AppWidgets 0
Apps 20
Asr 100
Audio 79
Auth 100
Board 100
Database 100
Docs 100
DownloadedGames 100
Fave 100
Friends 100
Gifts 100
Groups 100
LeadForms 0
Leads 0
Likes 100
Market 100
Messages 100
Newsfeed 100
Notes 100
Notifications 100
Orders 25
Pages 100
Photos 100
Podcasts 100
Polls 100
PrettyCards 0
Search 100
Secure 100
Stats 100
Status 100
Storage 100
Stories 100
Streaming 100
Users 100
Utils 100
Video 100
Wall 100
Widgets 0

Заметки

Для некоторых старых версий среды требуется указать директиву 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);"