Лучшие библиотеки для работы с VK API на C++, Java, Python и других языках

Работать с API ВКонтакте доводилось многим из нас, и каждый может сказать: работать с ним напрямую неудобно. Разумеется, было написано множество библиотек, предоставляющих удобный интерфейс работы с ним. Их можно и даже нужно использовать для облегчения работы и ускорения разработки. Сегодня tproger представляет подборку библиотек, набравших на GitHub больше всего звездочек и форков, для почти всех самых популярных ныне языков.

Java

Недавно Вконтакте выпустили официальный SDK для работы с API средствами Java. Страница проекта на GitHub содержит множество примеров, вот один из них, для публикации фотографии на странице пользователя:

PhotoUpload serverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponse uploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
     .server(uploadResponse.getServer())
     .hash(uploadResponse.getHash())
     .execute();

Photo photo = photoList.get(0); 
String attachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponse getResponse = vk.wall().post(actor)
    .attachments(attachId)
    .execute();

C#

InTouch — кроссплатформенная библиотека для С#, которая весьма активно развивается. На момент публикации заявлена полная совместимость с версией 5.57 VK API. Вот пример работы с библиотекой:

var clientId = 12345; // API client Id
var clientSecret = "super_secret"; // API client secret
var client = new InTouch(clientId, clientSecret);

// Authorization works only in Windows (and WinPhone) Store Apps
// otherwise you'll need to set received "access_token" manually
// using SetSessionData method.
await client.Authorize();

// Gets a list of a user's friends.
var friends = await client.Friends.Get();

if (friends.IsError == false)
{
    ShowFriendsList(friends.Data.Items.Where(friend => friend.Online));
}

client.Dispose();

Или даже короче:

using (var client = new InTouch(12345, "super_secret"))
{
    await client.Authorize();

    var friends = await client.Friends.Get();
    // ...
}

Node.js

Node-vkapi — современная библиотека для JavaScript, основанная на промисах. Она доступна так же в npm:

npm install node-vkapi --only=prod --save

Вот пример кода, который публикует текст на стену пользователя с помощью node-vkapi:

const VKApi = require('node-vkapi');
const VK    = new VKApi({
  app: {
    id: 1234567890,
    secret: 'app-secret-key'
  }, 
  auth: {
    login: '+79871234567', 
    pass: 'password123'
  }
});

VK.auth.user({
  scope: ['audio', 'photos', 'friends', 'wall', 'offline']
}).then(token => {
  return VK.call('wall.post', {
    owner_id: token.user_id, 
    friends_only: 0, 
    message: 'Post to wall via node-vkapi'
  }).then(res => {
    // wall.post response
    return 'https://vk.com/wall' + token.user_id + '_' + res.post_id;
  });
}).then(link => {
  // returned data from previous .then
  console.log('Post was published: ' + link);
}).catch(error => {
  // catching errors
  console.log(error);
});

С++

VK API Lib — небольшая библиотека для работы API, написанная на чистом C++. Из зависимостей требуется только Curl. Библиотека предоставляет базовый класс VK::Client с методами авторизации и выполнения запросов к API.

На основе его вы можете создавать свои классы для работы с разделами. В примере приведен класс VK::Messages. Базовый пример использования:

#include "src/api.h"
...
VK::Client api;
if(api.auth(login, pass, access_token))
{
  cout << "Auth ok" << endl;
  cout << "Access token: " << api.access_token() << endl << endl;  
  cout << api.call("wall.post", "owner_id=12345&message=Test");
}
else{
  cout << "Auth fail" << endl;
}

Python

Python-библиотека, обеспечивающая очень простую работу с API ВКонтакте. Судите сами:

>>> import vk
>>> session = vk.Session()
>>> api = vk.API(session)
>>> api.users.get(user_ids=1)
[{'first_name': 'Pavel', 'last_name': 'Durov', 'id': 1}]

В настоящее время библиотека достаточно активно развивается, однако до этого в её разработке был перерыв примерно на год. Всегда хочется использовать актуальные инструменты, поэтому стоит упомянуть и другую библиотеку для Python. Вот как выглядит загрузка фотографии на сервер с её помощью (комментарии сохранены):

import vk_api


def main():
    """ Пример: загрузка фото """

    login, password = 'python@vk.com', 'mypassword'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.authorization()
    except vk_api.AuthorizationError as error_msg:
        print(error_msg)
        return

    """
        В VkUpload реализованы методы загрузки файлов в ВК.
        (Не все, если что-то понадобится - могу дописать)
    """
    upload = vk_api.VkUpload(vk_session)

    photo = upload.photo(  # Подставьте свои данные
        'D:/downloads/tube.jpg',
        album_id=200851098,
        group_id=74030368
    )

    vk_photo_url = 'https://vk.com/photo{}_{}'.format(
        photo[0]['owner_id'], photo[0]['id']
    )

    print(photo, '\nLink: ', vk_photo_url)

if __name__ == '__main__':
main()

PHP

Библиотека на PHP, использующая, по словам автора, «сахалинские технологии», чтобы облегчить труд разработчика. Написана в ООП-стиле. Одна из самых крутых ее фич — генерация на основе запроса на PHP готового кода для специального метода ВК execute.

Пример просмотра последних 200 сообщений:

//MESSAGES
$data = $vk->request('messages.get', ['count' => 200]);

$userMap = [];
$userCache = [];

$user = new \getjump\Vk\Wrapper\User($vk);

$fetchData = function($id) use($user, &$userMap, &$userCache)
{
   if(!isset($userMap[$id]))
   {
       $userMap[$id] = sizeof($userCache);
       $userCache[] = $user->get($id)->response->get();
   }

   return $userCache[$userMap[$id]];
};

//REQUEST WILL ISSUE JUST HERE! SINCE __get overrided
$data->each(function($key, $value) use($fetchData) {
   $user = $fetchData($value->user_id);
   printf("[%s] %s <br>", $user->getName(), $value->body);
   return;
});

Ruby

vkontakte_api — ruby-адаптер для ВКонтакте API. Он позволяет вызывать методы API, загружать файлы на сервера ВКонтакте, а также поддерживает все 3 доступных способа авторизации (при этом позволяя использовать стороннее решение).

Работать с ним можно, например, так:

# создаем клиент
@vk = VkontakteApi::Client.new
# и вызываем методы API
@vk.users.get(uid: 1)

# в ruby принято использовать snake_case в названиях методов,
# поэтому likes.getList становится likes.get_list
@vk.likes.get_list
# также названия методов, которые возвращают '1' или '0',
# заканчиваются на '?', а возвращаемые значения приводятся
# к true или false
@vk.is_app_user? # => false

# если ВКонтакте ожидает получить параметр в виде списка,
# разделенного запятыми, то его можно передать массивом
users = @vk.users.get(uids: [1, 2, 3])

# большинство методов возвращает структуры Hashie::Mash
# и массивы из них
users.first.uid        # => 1
users.first.first_name # => "Павел"
users.first.last_name  # => "Дуров"

# если метод, возвращающий массив, вызывается с блоком,
# то блок будет выполнен для каждого элемента,
# и метод вернет обработанный массив
fields = [:first_name, :last_name, :screen_name]
@vk.friends.get(uid: 2, fields: fields) do |friend|
 "#{friend.first_name} '#{friend.screen_name}' #{friend.last_name}"
end
# => ["Павел 'durov' Дуров"]

Perl

Простенькая, полностью асинхронная библиотека AnyEvent::VK, выполняющая все запросы по https. По сути является клиентом. Автор рекомендует использовать Async::Chain для комбинирования вложенных колбеков.

use AnyEvent;
use AnyEvent::VK;
use Data::Dumper;

my $vk = AnyEvent::VK->new(
    app_id    => 'Your APP ID',
    email     => 'Email/Mobile of user',
    password  => 'User Password',
    scope     => 'Application permissions',
);
# or
my $vk = AnyEvent::VK->new(
    app_id    => 'Your APP ID',
    email     => 'Email/Mobile of user',
    password  => 'User Password',
    scope     => 'Application permissions',

    token     => 'Your access_token',
    expires   => 'Token expires timestamp',
    user_id   => 'user_id',
);

my $cv = AE::cv; $cv->begin;
$vk->auth(sub {
    my $success = shift;
    if ($success) {
        my ($token, $expires_in, $user_id) = @_;

        $vk->request('users.get', {
            user_ids => '1',
            fields => 'bdate,sex,city,verified',
        }, sub {
            my $response = shift;
            if ($response) {
                my $meta = shift;
                say Dumper($response);
            } else {
                my $meta = shift;
                warn 'Request failed';
                say Dumper($meta);
            }
            $cv->end;
        });
    } else {
        my ($stage, $headers, $body, $cookie) = @_;
        warn 'Auth failed';
        say Dumper(@_);
    }
    $cv->end;
});

$cv->recv;

Для мобильной разработки

Android (Java)

Еще одна официальная библиотека, на этот раз — для Android. Написана на Java и позволяет сильно упростить работу с API ВКонтакте из этого языка.

Пример отправки запроса:

request.executeWithListener(new VKRequestListener() {
   @Override
   public void onComplete(VKResponse response) {
       //Do complete stuff
   }
   @Override
   public void onError(VKError error) {
       //Do error stuff
   }
   @Override
   public void onProgress(VKRequest.VKProgressType progressType,
                                    long bytesLoaded,
                                    long bytesTotal)
   {
       //I don't really believe in progress
   }
   @Override
   public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
       //More luck next time
   }
});

Windows Phone (C#)

Последняя в этом списке официальная разработка: написанная на C# базовая библиотека для разработки на WP, похожая по функциональности на свои аналоги под Android и iOS.

Отправка запроса на список друзей:

private void GetUserInfoButton_Click(object sender, RoutedEventArgs e)
{          
    VKRequest.Dispatch<List<VKUser>>(
        new VKRequestParameters(
            "users.get",
            "fields", "photo_200, city, country"),
            (res) =>
                {
                    if (res.ResultCode == VKResultCode.Succeeded)
                    {
                        VKExecute.ExecuteOnUIThread(() =>
                            {
                                var user = res.Data[0];

                                userImage.Source = new BitmapImage(new Uri(user.photo_200, UriKind.Absolute));

                                userInfo.Text = user.first_name + " " + user.last_name;
                            });
                    }
                });            
}

iOS (Objective C)

Официальная библиотека от ВКонтакте, предназначенная для написания приложений под iOS. Написана на Objective-C.

Пример кода с отправкой запроса:

[audioReq executeWithResultBlock:^(VKResponse *response) {
       NSLog(@"Json result: %@", response.json);
   } errorBlock:^(NSError * error) {
   if (error.code != VK_API_ERROR) {
       [error.vkError.request repeat];
   } else {
       NSLog(@"VK error: %@", error);
   }
}];

Для хипстеров

Rust

На Github есть библиотека и для этого языка — vkrs. Она не слишком активно развивается, но это уже хоть что-то. Вот так она выглядит в деле:

extern crate vkrs;

use std::{env, io};
use vkrs::*;

fn main() {
    let api = api::Client::new();
    let oauth = api.auth(
        env::var("VK_APP_ID").unwrap(),
        env::var("VK_APP_SECRET").unwrap());

    let auth_uri = oauth.auth_uri(auth::Permission::Audio).unwrap();
    // Or if you want to get permissions for specific request:
    // let auth_uri = oauth.auth_uri_for::&lt;audio::Search&gt;();
    println!("Go to {} and enter code below...", auth_uri);

    let inp = io::stdin();
    let code = {
        let mut buf = String::new();
        inp.read_line(&amp;mut buf).unwrap();
        buf
    };

    // You may want to save this token for future use to avoid asking user
    // to authorize the app on each run.
    let token = oauth.request_token(code.trim()).unwrap();

    // The access token is JSON serializable with serde, so you can do it this way:
    // File::create(TOKEN_FILE).ok().map(|mut f| serde_json::to_writer(&amp;mut f, &amp;token).ok()).unwrap();
    //
    // And then you can load it again:
    // let token: auth::AccessToken = File::open(TOKEN_FILE).ok().and_then(|mut f| serde_json::from_reader(&amp;mut f).ok()).unwrap();

    let songs = api.get(Some(&amp;token),
        audio::Search::new()
            .q("Poets Of The Fall")
            .performer_only(true)
            .count(200))
        .unwrap();

    for song in &amp;songs.items {
        println!("{:?}", song);
    }
}

Golang

Как ни странно, была написана обёртка для VK API и на языке Go. Так же, как и остальные, она доступна на Github. Hello World на ней выглядит так:

package main

import (
    "github.com/urShadow/go-vk-api"
    "log"
    "strconv"
)

func main() {
    api := vk.New("ru")
    // set http proxy
    //api.Proxy = "localhost:8080"

    err := api.Init("TOKEN")

    if err != nil {
        log.Fatalln(err)
    }

    api.OnNewMessage(func(msg *vk.LPMessage) {
        if msg.Flags&vk.FlagMessageOutBox == 0 {
            if msg.Text == "/hello" {
                api.Messages.Send(vk.RequestParams{
                    "peer_id":          strconv.FormatInt(msg.FromID, 10),
                    "message":          "Hello!",
                    "forward_messages": strconv.FormatInt(msg.ID, 10),
                })
            }
        }
    })

    api.RunLongPoll()
}

Если для какого-либо языка вы знаете более актуальную или функциональную библиотеку — пишите в комментарии, мы обязательно обновим статью.