[Примеры] Авторизация (получение access token) с помощью OAuth 2.0 Вконтакте (VK) и работа с API Вконтакте на PHP и JS


Начнем

Для работы нам понадобится токен с разрешениями wall и offline. Для получения токена создайте свое Standalone-приложение Vk. И сохраните его ID. Далее перейдите по ссылке: oauth.vk.com/authorize?client_id=IDAPP&scope=wall,offline&redirect_uri=https://api.vk.com/blank.html&response_type=token И вместо IDAPP подставьте ID своего приложения. Или воспользуйтесь ссылкой, которую я подготовил специально для Вас.
Если все сделано правильно Вас перекинет на другой сайт, а в URL странице в GET параметре access_token будет токен, который нам и нужен, сохраняем его.

Работа XML

Для хранения настроек созданим файл формата .xml со следующем контентом: token Text post 120 attachment copyright 5.122 short name group Замените:

  • «token» на токен, который мы получили выше
  • «Text post» на сообщение, которое должно быть в записи
  • «attachment» на объект, который будет прикреплен к записи
  • «copyright» на ссылку источника
  • «short name group» на короткое имя(без vk.com) страницу сообщества/ пользователя, где будет проходить публикация(стена должна быть открытой для публикации)

Начнем писать код

Импортируем все нужные библиотеки, создадим экземпляр нашего модуля и авторизуемся во вконтакте от лица пользователя через токен. import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) Далее получим все короткие адреса, где будут публиковаться записи. import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) groupsId = [] groupsShortName = «» for child in XML.parsingFile(«groups», False): groupsShortName += child.text + «,» for group in VK.method(«groups.getById», {«group_ids»: groupsShortName}): groupsId.append(group[«id»] * -1) del groupsShortName Теперь получим сообщение, которое будет в записи, интервал, с которым будут публиковаться записи и источник записи. import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) groupsId = [] groupsShortName = «» for child in XML.parsingFile(«groups», False): groupsShortName += child.text + «,» for group in VK.method(«groups.getById», {«group_ids»: groupsShortName}): groupsId.append(group[«id»] * -1) del groupsShortName textPost = XML.parsingFile(«textPost») intervalPost = int(XML.parsingFile(«interval»)) Теперь получим все объекты, которые будут прикреплены к записи. import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) groupsId = [] groupsShortName = «» for child in XML.parsingFile(«groups», False): groupsShortName += child.text + «,» for group in VK.method(«groups.getById», {«group_ids»: groupsShortName}): groupsId.append(group[«id»] * -1) del groupsShortName textPost = XML.parsingFile(«textPost») intervalPost = int(XML.parsingFile(«interval»)) attachments = [attachment.text for attachment in XML.parsingFile(«attachments», False)] copyright = XML.parsingFile(«copyright») v = XML.parsingFile(«v») У нас уже есть все данные, которые нам понадобятся для публикации. Осталось только сделать функцию для публикации и цикл, который будет вызывать функцию публикации.
Сначала сделаем цикл, а функцию оставим пустой. Так же код будет работать, только если будет запущен из консоли.

import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) groupsId = [] groupsShortName = «» for child in XML.parsingFile(«groups», False): groupsShortName += child.text + «,» for group in VK.method(«groups.getById», {«group_ids»: groupsShortName}): groupsId.append(group[«id»] * -1) del groupsShortName textPost = XML.parsingFile(«textPost») intervalPost = int(XML.parsingFile(«interval»)) attachments = [attachment.text for attachment in XML.parsingFile(«attachments», False)] copyright = XML.parsingFile(«copyright») v = XML.parsingFile(«v») done = False def publicPosts(): pass if __name__ == «__main__»: done = True while done: publicPosts() time.sleep(intervalPost) Чтобы публиковать запись будем вызвать метод API «wall.post» и передавать параметры получение раньше. Если все сработает правильно будет выводится соответствующее сообщение в консоль. import vk_api import time from modules import XML as moduleXml XML = moduleXml.XML(«settings») VK = vk_api.VkApi(token=XML.parsingFile(«token»)) groupsId = [] groupsShortName = «» for child in XML.parsingFile(«groups», False): groupsShortName += child.text + «,» for group in VK.method(«groups.getById», {«group_ids»: groupsShortName}): groupsId.append(group[«id»] * -1) del groupsShortName textPost = XML.parsingFile(«textPost») intervalPost = int(XML.parsingFile(«interval»)) attachments = [attachment.text for attachment in XML.parsingFile(«attachments», False)] copyright = XML.parsingFile(«copyright») v = XML.parsingFile(«v») done = False def publicPosts(): for groupId in groupsId: for i in range(1, 5): result = VK.method(«wall.post», { «owner_id»: groupId, «message»: textPost, «attachments»: attachments, «copyright»: copyright, «v»: v }) if result[«post_id»]: print(«Good post, id post — » + str(result[«post_id»])) else: print(«Error posting») if __name__ == «__main__»: done = True while done: publicPosts() time.sleep(intervalPost)

Лучшие библиотеки для работы с 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 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 = ‘[email protected]’, ‘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 «, $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>( 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.

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

; } 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::<audio::Search>(); println!(«Go to {} and enter code below…», auth_uri); let inp = io::stdin(); let code = { let mut buf = String::new(); inp.read_line(&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(&mut f, &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(&mut f).ok()).unwrap(); let songs = api.get(Some(&token), audio::Search::new() .q(«Poets Of The Fall») .performer_only(true) .count(200)) .unwrap(); for song in &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() }

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

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании. Перейти к регистрации

C#C++JavaNode.jsOpen SourcePerlPHPPythonRubyИнструменты

Поделиться

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]