{"id":15133670,"url":"https://github.com/hemulgm/vk_api","last_synced_at":"2025-10-23T09:31:17.335Z","repository":{"id":110211844,"uuid":"227050414","full_name":"HemulGM/VK_API","owner":"HemulGM","description":"VK API Wrapper","archived":false,"fork":false,"pushed_at":"2024-05-20T09:37:28.000Z","size":10376,"stargazers_count":32,"open_issues_count":0,"forks_count":7,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-01-30T17:38:22.554Z","etag":null,"topics":["android","api","component","cross-platform","crossplatform","delphi","fmx","long-polling","oauth2","rest","vk-api","vk-bot","vk-sdk","vkontakte-api","wrapper-api"],"latest_commit_sha":null,"homepage":"","language":"Pascal","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HemulGM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-10T06:59:24.000Z","updated_at":"2024-12-20T14:08:52.000Z","dependencies_parsed_at":"2024-05-20T10:46:30.430Z","dependency_job_id":"b4c92a64-580b-4bdd-99d2-4bf68ebaf849","html_url":"https://github.com/HemulGM/VK_API","commit_stats":{"total_commits":307,"total_committers":3,"mean_commits":"102.33333333333333","dds":"0.39413680781758953","last_synced_commit":"503341ea915b3beac890df81b618fb119e4ab6d4"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HemulGM%2FVK_API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HemulGM%2FVK_API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HemulGM%2FVK_API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HemulGM%2FVK_API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HemulGM","download_url":"https://codeload.github.com/HemulGM/VK_API/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237807454,"owners_count":19369595,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","api","component","cross-platform","crossplatform","delphi","fmx","long-polling","oauth2","rest","vk-api","vk-bot","vk-sdk","vkontakte-api","wrapper-api"],"created_at":"2024-09-26T05:01:28.740Z","updated_at":"2025-10-23T09:31:16.811Z","avatar_url":"https://github.com/HemulGM.png","language":"Pascal","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# VKAPI\n\nAPI для Вконтакте\n\n\u003cdetails\u003e\n  \u003csummary\u003e Покрытие методов - 83% \u003c/summary\u003e\n  \nГруппа | %\n--- | ---\nAccount | 100\nAds | 0\nAppWidgets | 0\nApps | 20\nAsr | 100\nAudio | 79\nAuth | 100\nBoard | 100\nDatabase | 100\nDocs | 100\nDownloadedGames | 100\nFave | 100\nFriends | 100\nGifts | 100\nGroups | 100\nLeadForms | 0\nLeads | 0\nLikes | 100\nMarket | 100\nMessages | 100\nNewsfeed | 100\nNotes | 100\nNotifications | 100\nOrders | 25\nPages | 100\nPhotos | 100\nPodcasts | 100\nPolls | 100\nPrettyCards | 0\nSearch | 100\nSecure | 100\nStats | 100\nStatus | 100\nStorage | 100\nStories | 100\nStreaming | 100\nUsers | 100\nUtils | 100\nVideo | 100\nWall | 100\nWidgets | 0\n\n\u003c/details\u003e\n\n**Заметки**\n\nДля некоторых старых версий среды требуется указать директиву *OLD_VERSION*.\n\n**Note**\n\nFor old IDE versions, include *OLD_VERSION* directive\n\n# Способы авторизации\n\n1 . Авторизация через OAuth2 форму\n\n```\nДля FMX - VK.FMX.OAuth2 - TFormFMXOAuth2\nДля VCL - VK.VCL.OAuth2 - TFormOAuth2\n```\n\n```Pascal\n...\nvar \n  FToken: string;\n  FChangePasswordHash: string;\n  FTokenExpiry: Int64;\n...\n\nprocedure TFormMain.VKAuth(Sender: TObject; Url: string; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);\nbegin\n  if FToken.IsEmpty then\n  begin\n    TFormFMXOAuth2.Execute(Url,\n      procedure(Form: TFormFMXOAuth2)\n      begin\n        FToken := Form.Token;\n        FTokenExpiry := Form.TokenExpiry;\n        FChangePasswordHash := Form.ChangePasswordHash;\n        if not FToken.IsEmpty then\n          VK.Login;\n      end);\n  end\n  else\n  begin\n    Token := FToken;\n    TokenExpiry := FTokenExpiry;\n  end;\nend;\n\nVK.Login(\u003cродитель для окна для VCL, необяз.\u003e);\n\n```\n\n2 . Авторизация напрямую, используя токен (пользовательский или бота)\n    \n```Pascal\nprocedure TFormMain.VKAuth(Sender: TObject; Url: string; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);\nbegin\n  Token := '\u003cздесь токен\u003e';\nend;   \n```\n\n3 . Авторизация с помощью сервисных ключей (указывается в designtime компоненте) \n\n4 . Прямая авторизация (бета)\n\n```Pascal\nVKAPI.Application := TVkApplicationData.Android;  \u003c-- Данные оф. клиента для Android\nVKAPI.Login('+7**********', '*****************',\n  function(var Code: string): Boolean\n  begin\n    Code := InputBox('', '', ''); \u003c-- Код двухэтапной авторизации\n    Result := not Code.IsEmpty;\n  end);\n```\n\n# Пример бота\n```Pascal\nprogram VKBotTemplate;\n\nuses\n  VK.Bot,\n  VK.Types,\n  VK.Bot.Utils,\n  VK.Messages,\n  VK.GroupEvents,\n  VK.Entity.Message,\n  VK.Entity.ClientInfo;\n\nvar\n  VKBot: TVkBotChat;\n\nbegin\n  VKBot := TVkBotChat.GetInstance(12345678, '\u003ctoken\u003e');\n  with VKBot do\n  try\n    OnMessage :=\n      procedure(Bot: TVkBot; GroupId: Integer; Message: TVkMessage; ClientInfo: TVkClientInfo)\n      begin\n        if PeerIdIsUser(Message.PeerId) then\n        begin\n          if Assigned(Message.Action) then\n            case Message.Action.\u0026Type of\n              TVkMessageActionType.ChatInviteUser:\n                Bot.API.Messages.SendToPeer(Message.PeerId, 'Welcome');\n            end\n          else\n            Bot.API.Messages.SendToPeer(Message.PeerId, 'Your message: ' + Message.Text);\n        end;\n      end;\n\n    if Init and Run then\n    begin\n      Console.Run(\n        procedure(const Command: string; var Quit: Boolean)\n        begin\n          Quit := Command = 'exit';\n        end);\n    end\n    else\n      Readln;\n  finally\n    Free;\n  end;\nend.\n```\n\n# Примеры\n**Получение пользователей**\n    \n```Pascal\nvar\n  Users: TVkProfiles;\n  i: Integer;\nbegin\n  if VK.Users.Get(Users, [286400863, 415730216], TVkProfileFields.All) then\n  begin\n    for i := Low(Users.Items) to High(Users.Items) do\n    begin\n      Memo1.Lines.Add('About: ' + Users.Items[i].About);\n      Memo1.Lines.Add('BirthDate: ' + Users.Items[i].BirthDate);\n      Memo1.Lines.Add('Domain: ' + Users.Items[i].Domain);\n      Memo1.Lines.Add('FirstName: ' + Users.Items[i].FirstName);\n      Memo1.Lines.Add('Movies: ' + Users.Items[i].Movies);\n      Memo1.Lines.Add('------------');\n    end;\n    Users.Free;\n  end;\nend;\n```\n    \n**Установка статуса онлайн**\n\n```Pascal\nif VK.Account.SetOnline then\n  Memo1.Lines.Add('online')\nelse\n  Memo1.Lines.Add('Error online');\n```\n    \n**Создание поста в группе**\n\n```Pascal\nvar\n  Params: TVkWallParams;\nbegin\n  Params.Message('Test Text');\n  Params.OwnerId(-145962568);\n  Params.FromGroup(True);\n  Params.Signed(True);\n  Params.Attachments([Attachment.Doc(58553419, 533494309, '657138cd5d7842ae0a')]);\n  VK.Wall.Post(Params);\nend;  \n```\n\n**Отправка сообщения**\n\n```Pascal\nVk.Messages.Send.PeerId(Message.PeerId).Message(FAnswer).Send.Free;\n```\n\n**или, с созданием клавиатуры**\n\n```Pascal\nvar\n  Keys: TVkKeyboardConstructor;\nbegin\n  Keys.SetOneTime(True);\n  Keys.AddButtonText(0, 'Погода', 'weather', bcPositive);\n  Keys.AddButtonText(0, 'Отмена', 'cancel', bcNegative);\n  Keys.AddButtonText(1, 'Информация', 'info', bcPrimary);\n  Keys.AddButtonText(1, 'Команды', 'commands', bcSecondary);\n  Vk.Messages.New.\n    PeerId(PeerId).\n    Keyboard(Keys).\n    Message('Выбери вариант').\n    Send;\nend;\n```\n\n**или простое**\n\n```Pascal\nVK.Messages.Send(PeerId, 'Текст сообщения', [\u003cвложения\u003e]);\n```    \n**Отправка фото**\n\n```Pascal\nVK.Messages.New.UserId(58553419).AddPhotos(['D:\\Downloads\\6q8q9f.gif']).Send;\n```\n\n**Получение аудиозаписей плейлиста (альбома)**\n\n```Pascal\nvar\n  List: TVkAudios;\n  Params: TVkParamsAudio;\nbegin\n  Params.OwnerId(415730216);\n  Params.AlbumId(86751037);\n  if VK.Audio.Get(List, Params) then\n  try\n    for var i := Low(List.Items) to High(List.Items) do\n      Memo1.Lines.Add(List.Items[i].Artist + '-' + List.Items[i].Title);\n  finally\n    List.Free;\n  end;\nend;    \n```\n\n**Использование метода Walk, для выполнения методов с параметрами Count и Offset**\n\nЭто простой цикл, который вызывает наш метод регулируя Offset. Cancel позволяет закончить цикл, до завершения всего обхода\n\nМетод позволяет получить все элементы определённого метода с Count и Offset\nДостаточно написать стандартную конструкцию получения данных с помощью искомого метода внутри \nпередаваемой анонимной функции в Walk и указать шаг получения кол-ва элементов.\n\n```Pascal\nVKAPI.Walk(\n   function(Offset: Integer; var Cancel: Boolean): Integer\n   var\n     Audio: TVkAudio;\n     Audios: TVkAudios;\n     Params: TVkParamsAudio;\n   begin\n     Result := 0;  //Метод должн вернуть кол-во фактически полученных элементов\n     Params.Count(100);\n     Params.Offset(Offset);\n     if VKAPI.Audio.Get(Audios, Params) then\n     begin\n       Result := Length(Audios.Items);  //Возвращение кол-во полученных элементов\n       for Audio in Audios.Items do\n       begin\n         //Do somethings with Audio\n       end;\n       Audios.Free;\n     end\n     else\n       Cancel := True;\n   end, 100);  // 100 - параметр шага запроса, должен соответстовать параметру метода \"Params.Count(100);\"\n```\n  \n\u003c!--stackedit_data:\neyJoaXN0b3J5IjpbLTY2MDExNDI1Miw5MzcyNjYxMzQsMzQ1Mj\nkyMzUsLTE0NDUxODA3NDFdfQ==\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhemulgm%2Fvk_api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhemulgm%2Fvk_api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhemulgm%2Fvk_api/lists"}