Vk-io – npm

Основная информация

официальной
документации.

Шаг третий. что дальше?

Дальше следует направить пользователя по сформированной ссылке. После того, как он проделает все необходимые для авторизации манипуляции, он будет перенаправлен на страницу, имеющую адрес

Описания объекта прикриплений

СвойствоТипОписание
photoarrayПрикрепленные изображения
docarrayПрикрепленные документы
videoarrayПрикрепленные видео
audioarrayПрикрепленные аудио
wallarrayПрикрепленные записи со стены
linkarrayПрикрепленные ссылки
stickerobjectСтикер
giftobjectПодарок
moneyobjectДеньги
geoobjectКарта

photo, doc, video, audio, wall – Основная структура

  • id – Идентификатор прикрипления
  • owner – Идентификатор пользователя

doc – Может содержать дополнительное поле type

link – Ссылка

  • url – Url ссылки
  • title – Заголовок ссылки
  • description – Описание ссылки
  • photo – Идентификатор изображения ссылки

sticker – Стикер

  • id – Идентификатор стикера
  • product – Идентификатор набора стикера

gift – Подарок

  • id – Идентификатор подарка

money – Перевод денег

  • amount – Сумма
  • currency – Валюта

geo – Карта

  • id – Идентификатор карты
  • provider – Идентификатор картографического сервиса

[примеры] авторизация (получение access и refresh token) oauth 2.0 яндекс и работа с api на php | codd

session_start();

$clientId     =‘ad71d04727ef4f4abd33afb7cfa810058332’;// ID приложения

$clientSecret=’15a3fc22e0c04b89b9fd383dc3aa39fe007e’;// Пароль приложения

$redirectUri  =‘http://localhost/_blog/tests/yandex-api/oauth.php’;// Адрес, на который будет переадресован пользователь после прохождения авторизации

// Формируем ссылку для авторизации

$params=array(

‘client_id’     =>$clientId,

‘redirect_uri’  =>$redirectUri,

‘response_type’=>‘code’,

// Список необходимых приложению в данный момент прав доступа, разделенных пробелом.

// Права должны запрашиваться из перечня, определенного при регистрации приложения.

// Узнать допустимые права можно по ссылке https://oauth.yandex.ru/client/<client_id>/info, указав вместо <client_id> идентификатор приложения.

// Если параметр scope не передан, то токен будет выдан с правами, указанными при регистрации приложения.

// Параметр позволяет получить токен только с теми правами, которые нужны приложению в данный момент.

‘scope’         =>‘webmaster:verify webmaster:hostinfo metrika:read’,

);

echo‘<a href=”https://oauth.yandex.ru/authorize?’.http_build_query($params).‘”>Авторизация через Яндекс</a>’;

if(isset($_GET[‘code’])){

// Формирование параметров (тела) POST-запроса с указанием кода подтверждения

$query=array(

‘grant_type’    =>‘authorization_code’,

‘code’          =>$_GET[‘code’],

‘client_id’     =>$clientId,

‘client_secret’=>$clientSecret

);

$query=http_build_query($query);

// Формирование заголовков POST-запроса

$header=“Content-type: application/x-www-form-urlencoded”;

// Выполнение POST-запроса

$opts    =array(

‘http’=>

array(

‘method’  =>‘POST’,

‘header’  =>$header,

‘content’=>$query

)

);

$context=stream_context_create($opts);

if(!$content=@file_get_contents(‘https://oauth.yandex.ru/token’,false,$context)){

$error=error_get_last();

thrownewException(‘HTTP request failed. Error: ‘.$error[‘message’]);

}

$response=json_decode($content);

// Если при получении токена произошла ошибка

if(isset($response->error)){

thrownewException(‘При получении токена произошла ошибка. Error: ‘.$response->error.‘. Error description: ‘.$response->error_description);

}

$accessToken=$response->access_token;// OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения.

$expiresIn   =$response->expires_in;// Время жизни токена в секундах.

// Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена.

// https://tech.yandex.ru/oauth/doc/dg/reference/refresh-client-docpage/#refresh-client

$refreshToken=$response->refresh_token;

// Сохраняем токен в сессии

$_SESSION[‘yaToken’]=array(‘access_token’=>$accessToken,‘refresh_token’=>$refreshToken);

}elseif(isset($_GET[‘error’])){// Если при авторизации произошла ошибка

thrownewException(‘При авторизации произошла ошибка. Error: ‘.$_GET[‘error’]

                     .‘. Error description: ‘.$_GET[‘error_description’]);

}

Action.invite

Позволяет пригласить пользователя обратно

Можно указать другой идентификатор пользователя

ПараметрТипОписание
idnumberДругой идентификатор пользователя

Action.kick

Исключает пользователя если есть права

Можно указать другой идентификатор пользователя

ПараметрТипОписание
idnumberДругой идентификатор пользователя

Action.remove

Удаляет обложку беседы

Action.rename

Переименовывает беседу

ПараметрТипОписание
titlestringНовое название беседы

Api.execute

Вызывает метод API execute

ПараметрТипОписание
paramsobjectПараметры метода

Возвращает объект описанный ниже

ПараметрТипОписание
responsemixedРезультат работы метода
errorsarrayСписок ошибок (ExecuteError)

Api.ismethod

Позволяет проверить метод на наличие

ПараметрТипОписание
methodstringМетод API

Api_version

Возвращает текущую версию API

Cakephp auth flash message params

Auth Flash params are not working for me.

AppController:
class AppController extends Controller {

public $helpers = array(
    'Session', 
    'Facebook.Facebook', 
    'Html' => array('className' => 'BoostCake.BoostCakeHtml'), 
    'Form' => array('className' => 'BoostCake.BoostCakeForm'),
    'Paginator' => array('className' => 'BoostCake.BoostCakePaginator'), 
    'AssetCompress.AssetCompress',
    'PhpThumb.PhpThumb' 
);
public $components = array(
    'Session',
    'RequestHandler',
    'Auth' => array(
        'authenticate' => array('Custom'),
        'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'index'),
        'flash' => array(
            'element' => 'alert',
            'key' => 'auth',
            'params' => array(
                'plugin' => 'BoostCake',
                'class' => 'alert-danger'
            )
        )
    ),
);

Default layout:
Session->flash();
echo $this->Session->flash(‘auth’);

echo $this->fetch('content');
?>

I’ve debugged the params to make sure they’re outputting correctly, but when the alert pops up this is what I see:

<div id="authMessage" class="message">Username or password is incorrect</div>

Thanks in advance

Chain

Позволяет вызывать сразу разные методы со своей обработкой данных

Chat.action

Произошли изменения в беседе

СвойствоТипОписание
chatnumberИдентификатор беседы
selfbooleanИзменения произведены пользователем

Chat.create

Создана беседа

Chat.invite

Добавлен пользователь в беседу

СвойствоТипОписание
invitenumberИдентификатор пользователя

Chat.kick

Пользователя исключили из беседы

СвойствоТипОписание
kicknumberИдентификатор пользователя

Chat.photo.remove

Удалена обложка беседы

Chat.photo.update

Обновлена обложка беседы

СвойствоТипОписание
photoobjectОбложка беседы

id – Идентификатор фотографии

owner – Идентификатор пользователя

Chat.rename

Беседа переименована

Execute

Запускает выполнение цепочки методов

Если цепочка методов пуста в результат вернётся пустой массив

Возвращает все результаты из добавленных методов

Не обязательно вызывать .execute() для получения Promise, достаточно повесить обработчики на сам объект

Простой пример применения цепочки

Executes

Вызывает один и тот же метод с массивом параметров

В случае ошибки в массиве на месте метода будет false

ПараметрТипОписание
methodstringМетод API
queuearrayОчередь из параметров

Например получить первую запись пользователей

vk.executes('wall.get',[

    {owner_id: 1, count: 1},

    {owner_id: 2, count: 1},

    {owner_id: 3, count: 1},

    {owner_id: 4, count: 1},

    {owner_id: 5, count: 1},

    <...many>

]);

Getattachment

Позволяет получить прикрепления с объектов

ПараметрТипОписание
typestringТип прикрипления
attachmentarray / objectОбъект прикрипления

Пример получения прикрепления документа после загрузки

Getlargephoto

Возвращает фотографии разрешения 2560 или 1280

ПараметрТипОписание
photoobjectОбъект фотографии

Getmediumphoto

Возвращает фотографии разрешения 807 или 604

ПараметрТипОписание
photoobjectОбъект фотографии

Getsmallphoto

Возвращает фотографии разрешения 130 или 75

ПараметрТипОписание
photoobjectОбъект фотографии

Gettoken

Возвращает токен

Group.flag.remove

Сброс флагов диалога сообщества

СвойствоТипОписание
peernumberИдентификатор назначения
flagsarrayСписок флагов

Group.flag.replace

Замена флагов диалога сообщества

СвойствоТипОписание
peernumberИдентификатор назначения
flagsarrayСписок флагов

Group.flag.set

Установка флагов диалога сообщества

СвойствоТипОписание
peernumberИдентификатор назначения
flagsarrayСписок флагов

Logger.setcustomoutput

Установить свой вывод ошибок вместо console.log

ПараметрТипОписание
handlerfunctionСвой обработчик вывода
ПараметрТипОписание
typestringУровень вывода
namestringКомпонент модуля
argsarrayАргументы вывода

Logger.setlevels

Устанавливает уровни вывода ошибок

По умолчанию все включены

ПараметрТипОписание
levelsobjectУровни вывода ошибок

Список уровней вывода

  • log – Стандартный лог

  • info – Информация

  • warn – Предупреждения

  • error – Ошибки

  • debug – Информация для отладки

Например отключить уровень debug и info

Longpoll.isstarted

Возвращает состояние цикла

Longpoll.restart

Перезапускает цикл получения обновлений с обновлённым сервером

Longpoll.start

Запускает цикл получения обновлений

Longpoll.stop

Останавливает цикл получения данных с Long Poll

Longpoll.usepts

Если установить true будет генерировать событие pts с идентификатором который нужен для метода messages.getLongPollHistory

ПараметрТипОписание
needbooleanНужен ли pts

Message

Появилось новое сообщение

Message.flag.remove

Сброс флагов сообщения

СвойствоТипОписание
idnumberИдентификатор сообщения
peernumberИдентификатор назначения
flagsarrayСписок флагов

Message.flag.replace

Замена флагов сообщения

СвойствоТипОписание
idnumberИдентификатор сообщения
peernumberИдентификатор назначения
flagsarrayСписок флагов

Message.flag.set

Установка флагов сообщения

СвойствоТипОписание
idnumberИдентификатор сообщения
peernumberИдентификатор назначения
flagsarrayСписок флагов

Message.getfwd

Разбирает пересылаемые сообщения

Сообщения при разборе будут иметь примерно такую структуру

id – Идентификатор сообщения

owner – Идентификатор пользователя

fwd – Вложенные пересылаемые сообщения

Message.hasattachment

Проверяет наличие прикрипления

ПараметрТипОписание
namestringНазвание прикрипления

Message.hasattachments

Проверяет наличие прикриплений

Message.hasflag

Проверяет наличие флага

ПараметрТипОписание
namestringНазвание флага

Message.hasfwd

Проверяет наличие пересылаемых сообщений

Message.ischat

Сообщение из беседы

Message.isdialog

Сообщение из диалога

Message.isgroup

Сообщение из сообщества

Message.read.inbox

Прочтение всех входящих сообщений

СвойствоТипОписание
idnumberИдентификатор сообщения
peernumberИдентификатор назначения

Message.read.outbox

Прочтение всех исходящих сообщений

СвойствоТипОписание
idnumberИдентификатор сообщения
peernumberИдентификатор назначения

Parselink

Разбирает ссылку ВКонтакте

ПараметрТипОписание
linkstring / numberСсылка

Возвращает объект

СвойствоТипОписание
idnumberИдентификатор
typestringТип ссылки
peernumberИдентификатор назначения

Возможные значения type

Свойство peer присутствует только с photo, video, doc, album, topic, wall, page

Scope

Для того чтобы установить полный список разрешений передайте в scope строку all

Setoptions

Устанавливает опции модулю

Settoken

Устанавливает токен

ПараметрТипОписание
tokenstringТокен

Typing.chat

Пользователь начал набирать текст в беседе

Unread.count

Счётчик количества непрочитанных сообщений

СвойствоТипОписание
countnumberКоличество непрочитанных сообщений

Upload.album

Загрузка фотографий в альбом

В source можно передать массив в котором будет не более 5 файлов

После загрузки вернётся массив с загруженными фотографиями

Пример загрузки с передачей массива

Upload.audio

Загрузка аудиозаписей

Upload.chat

Загрузка главной фотографии для беседы

Upload.cover

Загрузка обложки сообщества

Модуль предоставляет удобную обёртку для работы с Long Poll сервером

Upload.doc

Загрузка документов

Upload.graffiti

Загрузка граффити

Поддерживаемые расширения png, svg

Upload.message

Загрузка изображения в личное сообщение

Upload.owner

Загрузка главной фотографии пользователя или сообщества

Upload.product

Загрузка фотографии для товара

Upload.selection

Загрузка фотографии для подборки товаров

Upload.video

Загрузка видеозаписей

Upload.voice

Загрузка аудиосообщения

Поддерживаемые расширения mp3, ogg

Upload.wall

Загрузка фотографий на стену

Автономное приложение (standalone)

Для авторизации необходимы опции app, key, scope, login или phone

По умолчанию scope содержит все разрешения

Для получения сервисного ключа доступа необходимы опции app, key

Авторизация

Есть несколько типов авторизации

Авторизация не заменяет токен в настройках модуля, учтите это

Авторизация через вконтакте api.

vk-io - npm

Авторизация через госуслуги

Везде идет речь о сертификате (1 файл), о закрытом ключе (1 файл) и пароле к закрытому ключу (строка)

Для обмена с ЕСИА потребуется шифрование, поэтому у вас должен быть свой RSA-ключ для подписи. Закрытый ключ находится у вас, публичный сертификат выгружается в кабинет ЕСИА.

Некие сертификаты, общедоступные по ссылке http://esia.gosuslugi.ru/public/esia.zip

Поскольку ЕСИА тоже будет присылать вам шифрованную информацию, то вам потребуется публичный сертификат ЕСИА, чтобы расшифровать эту информацию.

Файлы от заказчика содержат один файл с расширением cer

Скорей всего – это публичный сертификат. Можете попробовать его открыть. В windows должно открыться стандартное окно с информацией о сертификате.

и папку с несколькими файлами с расширением key (header.key, masks.key, primary.key и тд)

А вот тут сказать сложно. Похоже, что клиент сгенерировал ключ на флешке средствами крипто-про или наподобие, а потом просто скопировал каталог. Вот тут он не прав. Надо выяснять конкретные требования заказчика по интеграции

Для авторизации через госуслуги можно использовать, например, самоподписанные сертификаты:

Сначала создать закрытый ключ и запрос на сертификат

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr -sha256

в процессе генерации будет запрос на воод пароля к закрытому ключу.

Потом выпустить публичный сертификат для него

openssl x509 -signkey domain.key -in domain.csr -req -days 1825 -out domain.crt -sha256

у вас будет два файла domain.key (закрытый ключ) и domain.crt (сертификат). Сертификат потом надо будет выгрузить в кабинет ЕСИА.

Как мне эти данные использовать?

Очень помог в интеграции с ЕСИА пакет https://vhod-v-lichnyj-kabinet.ru/ekapusta/oauth2-esia
Описание работы с ним https://vhod-v-lichnyj-kabinet.ru/ru/post/358834/

Кстати, если посмотрите тесты на гитхабе, то найдете там мнемонику для тестовой организации и готовые ключи для нее. Можно будет протестировать.

Авторизация через официальные приложения (direct)

Для авторизации необходимы опции scope, pass, login или phone

Альтернативный вызов методов

Если метод отсутствует в списке или необходимо вызвать строкой

ПараметрТипОписание
methodstringМетод API
paramsobjectПараметры метода

Аутентификация пользователей на сервере

Параметры запуска имеют важную и полезную особенность — их можно использовать как аутентификационные данные на разработанном вами backend-сервисе. Это позволяет сократить время разработки и не утруждать себя написанием собственной системы аутентификации.

Вместе с параметрами запуска, как мы уже писали, передаётся sign — подпись, гарантирующая серверу корректность и правдивость параметров.

Безопасность подписи обеспечивается алгоритмом хеширования SHA-256, использующим секретный ключ вашего мини-приложения. Таким образом, не зная ключа, злоумышленник не сможет подделать параметры запуска.

Буржуазный, через веб-компоненты

Если вы решили пойти по этому пути, то вам потребуется использовать какую-либо стороннюю GUI-библиотеку (или по крайней мере JavaFX), у которой в арсенале есть свой компонент браузера. Над таким бразуером ваша программа будет иметь полную власть, и вы сможете извлечь адрес, на который вас перенаправил ВК, программными средствами. На JavaFX это можно реализовать следующим образом:

Вызов методов вконтакте api

Необходимо скопировать название из списка методов и вставить его после vk.api.<method>

На примере получение записей со стены через wall.get

ПараметрТипОписание
paramsobjectПараметры метода

Вызов хранимой процедуры приложения

ПараметрТипОписание
namestringНазвание процедуры
paramsobjectПараметры процедуры

Загрузка файлов

Для упрощение работы в каждый метод загрузки передевайте параметры которые нужны как для получения сервера, так и для сохранения загруженного файла

Для каждого метода загрузки существует несколько общих параметров

source – Поддерживаемые источники файлов

Если необходимо вручную указать MIME-type и названия файла воспользуйтесь такой конструкцией, особенно касается источников с типом Buffer

Необязательные параметры

ПараметрТипОписаниеПо умолчанию
timeoutnumberВремя ожидания для сброса соединения15000
uploadUrlstringСервер для загрузки файлаnull

Главный аргумент в методах

ПараметрТипОписание
paramsobjectПараметры загрузки

Инициализация

Получение класса

Как быть?

Токен, полученный на клиентом, мы не можем использовать на сервере, и соответственно не можем запросить информацию о пользователе со стороны сервера, но мы можем проверить токен на валидность и узнать ид пользователя которому принадлежит данный токен.

С документации мы можем узнать что Параметр sig равен md5 от конкатенации следующих строк:

Давайте получим информацию о пользователе через open api, передадим её на сервер, проверим токен, и если все ок запишем в базу:

Как параметры запуска попадают в приложение

Каждый раз, когда мини-приложение запускается, ВКонтакте берёт указанный в настройках URL (или URL для разработки, если вы являетесь администратором приложения) и добавляет в конец строку поиска вместе с query-параметрами запуска. Таким образом, URL, доступный изнутри вашего приложения, будет иметь примерно такой вид:

Как происходит авторизация?

Авторизация ВКонтакте ничем не отличается от любой другой авторизации через сторонний сервер. Этот процесс отлично описал пользователь StackOverflow qnub:

  1. На сервисе (в данном случае ВК) необходимо зарегистрировать приложение и получить ключ API.
  2. После этого приложение (сайт) могут делать запрос личных данных пользователя у стороннего сервиса через этот самый API, для чего:
  3. По завершении действий пользователь будет перенаправлен сторонним сервисом посредством всё того же 302 Redirect на URL переданный в параметрах специально сформированной ссылки.

Конструктор

Инициализация новой инстанции модуля

Логгер

В модуле присутсвует свой простой логгер

Обработка apierror

Возникает когда API вернуло вместо результата работы метода, ошибку

Обработать её можно следующим образом

Полный список свойств которые можно получить из ошибки

Обработка autherror

Возникает при ошибках авторизации

Обработать её можно следующим образом

Полный список свойств которые можно получить из ошибки

СвойствоТипОписание
messagestringОписание ошибки

Обработка executeerror

Возникает при работе с методом API execute

Обработать её можно следующим образом

Полный список свойств которые можно получить из ошибки

СвойствоТипОписание
messagestringОписание ошибки
codenumberКод ошибки
methodstringМетод API

Обработка requesterror

Возникает при проблемах в соединении или ответа сервера с ошибкой (не путать с ApiError)

Обработать её можно следующим образом

Полный список свойств которые можно получить из ошибки

Обработка uploaderror

Возникает когда при загрузке файла произошла ошибка

Обработать её можно следующим образом

Полный список свойств которые можно получить из ошибки

СвойствоТипОписание
messagestringОписание ошибки

Обработка исключений

Во всех примерах выше использовался данный способ обработки ошибок

Но в приложениях не один модуль и по этому необходимо обрабатывать исключения для каждого модуля свои, да и ошибки могут быть разные

Опции vk

ПараметрТипОписаниеПо умолчанию
idnumberИдентификатор пользователяnull
loginstringEmail/телефон от аккаунтаnull
phonenumberНомер телефонаnull
passstringПароль пользователяnull
tokenstringТокенnull
appnumberID приложенияnull
keystringСекретный ключ прилрженияnull
scopestringСписок разрешенийmax scope
limitnumberМаксимальное кол-во запросов в секунду3
timeoutnumberВремя сброса соединения на API6000
proxystringУстановка прокси сервераnull
restartErrorbooleanПерезапускать ли при ошибках запросtrue
restartCountnumberКоличество попыток перезапуска3
restartWaitnumberВремя ожидания перезапуска3000

Немного дополнительной информации

Отлов любой ошибки модуля

Все ошибки модуля наследуют класс VKError, с ним вы сможете поймать любое исключение модуля vk-io

Если обработчик captcha не установлен, то в .catch будет возвращаться ошибка ApiError с кодом №14

Если в вашем приложение нужно организовать обработку captcha не повторяя запросы вручную, можно установить универсальный обработчик

ПараметрТипОписание
handlerfunctionОбработчик captcha
ПараметрТипОписание
srcstringUrl изображения капчи
sidnumberИдентификатор captcha
retryfunctionПовторить запрос с текстом captcha

Передача параметров запуска на сервер

Для того чтобы получить список параметров запуска в строковом виде, достаточно
обратиться к window.location.search:

Если необходимо конвертировать параметры из строкового вида в объект, воспользуемся встроенной в node библиотекой querystring:

Получение ссылок фотографий с объекта photo

Есть 3 метода для получение ссылки с объекта photo

Если метод не находит ссылку на фотографию он будет искать более меньшего размера пока не найдёт существующие разрешение

Пример работы с методами

На примере получения фотографии Павла Дурова

Проблема 1

Полученный токен(sig) привязывается к ip-адресу, и при попытке использовать его на сервере вам выдаст ошибку:

Проблема 2

При таком способе авторизации нет возможности получить email пользователя, даже если вы запросите нужные права и пользователь даст согласие — вы не получите email в ответе.

Проверка авторизации


Давайте создадим модель, которая будет содержать информацию о пользователе:

Работа с коллекциями

Позволяет получить произвольное количество данных с методов в которых присутствуют параметры offset и count

Список необязательных параметров

ПараметрТипОписаниеПо умолчанию
offsetnumberРучное смещение0
countnumberСколько нужно получить данныхВсе
maxCallsnumberКоличество вызовов методов за раз25

В случаях если вы получаете ошибку 13 с комментарием response size is too big укажите меньше количество запросов параметром maxCalls

Первый режим работы коллекций основанный на потоках, на примере получение записей со стены пользователя

Так же можно получить все данные единоразово через интерфейс Promise

Учтите, если вы используете потоковый режим, не используйте Promise для того что бы узнать когда завешится процес получения данных, так как он будет сохранять данные для передачи в Promise

Работа с цепочкой методов

Цепочки методов работают на API execute

Можно передать неограниченное количество методов в цепочку

Тем самым позволяя вызывать не один метод за раз, а сразу по 25

События беседы

События которые произошли в беседе, общие свойства

Тесты

Для запуска теста нужно написать в консоль

Установка

Требуется Node.js 6.0.0 или новее

Шаг второй. формирование специальной ссылки

Далее вам нужно направить пользователя по специально сформированному адресу (её упоминания выделены жирным цветом в первом разделе статьи), где он подтвердит, что хочет разрешить вашему приложению выполнять какие-то действия со своим аккаунтом. Как же формируется эта ссылка?

Этот процесс подробно описан в документации. Однако, если вы обратились к этой статье, я предполагаю, что вам не хватило информации в документации, и поэтому перескажу всё своими словами. Ссылка имеет следующий вид: хост?параметры. Параметры имеют вид нескольких пар вида ключ=значение разделённых символами &.

Append

Добавляет метод в очередь

Учтите, если был вызван .execute() и вызвать .append() выбросится синхронное исключение

ПараметрТипОписание
methodstringМетод API
paramsobjectПараметры метода

Заключение

Таким образом, мы научились получать access token ВКонтакте, с помощью которого можно вызывать методы API. Если эта статья вызовет у сообщества интерес, в следующей статье я опишу, как вызывать те или иные API-методы с помощью токена, как проверять токен на валидность (метод secure.checkToken(), конечно), и напишу какое-нибудь демонстрационное приложение, например, для сохранения всей музыки из плейлиста на компьютер.

Похожее:  Добавление виджета Платформы обратной связи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *