1.8.0 • Published 4 years ago

node-vkcoinapi v1.8.0

Weekly downloads
29
License
ISC
Repository
github
Last release
4 years ago

node-vkcoinapi

Модуль для работы с API VK Coin

npm package

Особенности:

  • Реализованы все методы официального API
  • Удобная документация и хорошая тех. поддержка
  • Возможность получения платежей в режиме реального времени
  • Активные обновления
  • Не тянет за собой много библиотек
  • Есть своя беседа для обсуждения обновлений/багов

Планы:

  • Сделать WebHooks
  • Сделать гайды по установке и использованию на YouTube
  • Сделать папку с примерами

Установка

Windows:

  • Скачайте и установите последнюю версию Node.JS
  • Создайте в удобном месте папку, например vkcoin
  • Перейдите в командную строку: Win + R > cmd
  • Перейдите в папку: cd (путь до вашей папки)
  • Пропишите: npm i node-vkcoinapi

Ubuntu:

  • Установите Node.JS по этому гайду
  • Создайте в удобном месте папку, например vkcoin
  • Перейдите в папку: cd (путь до вашей папки)
  • Пропишите: npm i node-vkcoinapi

Начало работы

Для начала использования, вам нужно создать в своей папке исполняемый файл, пусть это будет index.js

Теперь его нужно открыть и импортировать библиотеку:

const VKCOINAPI = require('node-vkcoinapi');

const vkcoin = new VKCOINAPI(options);
ОпцияТипОписание
optionsObjectОпции конструктора
options.keyStringКлюч для взаимодействия с API
options.userIdNumberВаш айди ВК
options.tokenStringВаш токен

Где взять эти значения

Откройте свою аватарку и в адресной строке вы увидите подобное: https://vk.com/fakeman.cat_fmc?z=photo236908027_456259706%2Falbum236908027_0%2Frev

Вашим айди будет являться число после слова photo. В этом случае 236908027

  • Получение токена (token):

Откройте эту ссылку и нажмите разрешить

После этого в адресной строке будет подобное: https://api.vk.com/blank.html#access_token=xxxxxxxxxxxx&expires_in=0&user_id=user_id&email=email

Токеном будет являться строка от access_token до &expires. В этом случае xxxxxxxxxxxx

Токен нужен для получения событий через WebSocket (Моментальное получение платежей)

API

call - Вызывает апи-метод по его названию (Нужен, если я не успел обновить модуль)

Например. Вышел новый метод у vkcoin, пусть это будет send_from_admin.

Выглядеть в виде ссылки это будет так: https://coin-without-bugs.vkforms.ru/merchant/send_from_admin. Вызывать его нужно так:

async function run() {
    const result = await vkcoin.api.call('send_from_admin', { toId: 236908027 });

    console.log(result);
}   

run().catch(console.error);

Наглядно можно показать на уже существующем методе (send - делает перевод коинов):

async function run() {
    const result = await vkcoin.api.call('send', { toId: 1, amount: 1000, markAsMerchant: true });

    console.log(result);
}
ПараметрТипОписание
methodStringИсполняемый метод
paramsObjectПараметры метода

При вызове методов с помощью call указывать merchatId и key в параметрах не нужно

getTransactionList - Получает список ваших транзакций

async function run() {
    const result = await vkcoin.api.getTransactionList(tx);
    
    console.log(result);
}

run().catch(console.error);
ПараметрТипОписание
txNumber[]Массив айди переводов для получения ИЛИ 1 - последняя 1000 транзакций, 2 - 100

sendPayment - Делает перевод другому пользователю (в десятичных долях)

async function run() {
    const result = await vkcoin.api.sendPayment(toId, amount, fromShop); // 1 коин = 1000 ед.
    
    console.log(result);
}

run().catch(console.error);
ПараметрТипОписание
toIdNumberАйди получателя
amountNumberСумма перевода
fromShopBooleanЕсли true, то платеж отправится от имени магазина

getLink - Получает ссылку для перевода

function run() {
    const link = vkcoin.api.getLink(amount, fixation);
    
    console.log(link);
}

run().catch(console.error);
ПараметрТипОписание
amountNumberСумма перевода
fixationBooleanФиксированная сумма или нет

formatCoins - Делает получаемое из API значение коинов читабельным. Например, приходит значение 1234567890. Этот метод сделает значение таким: 1 234 567,890

Это можно использовать в паре с другим методом:

async function run() {
    const trans = await vkcoin.api.getTransactionList([2]);

    const fixTrans = trans.response.map((tran) => {
        tran.amount = vkcoin.api.formatCoins(tran.amount);

        return tran;
    });

    console.log(fixTrans);
}

run().catch(console.error);
ПараметрТипОписание
coinsNumberВходящее значение коинов

getBalance - Получает баланс по айди пользователей

getMyBalance - Получает баланс текущего пользователя

async function run() {
    const balances = await vkcoin.api.getBalance([1, 100, 236908027]);
    const myBalance = await vkcoin.api.getMyBalance();

    console.log({ balances, myBalance });
}

run().catch(console.error);

Среди этих методов аргумент принимает только getBalance:

ПараметрТипОписание
userIdsNumber|Number[]Массив айди пользователей

setShopName - Меняет название магазина

async function run() {
    const result = await vkcoin.api.setShopName(name);
    
    console.log(result);
}

run().catch(console.error);
ПараметрТипОписание
nameStringНовое имя для магазина

setCallback - Изменяет адрес для получения событий

async function run() {
    const result = await vkcoin.api.setCallback(callback);
    
    console.log(result);
}

run().catch(console.error);
ПараметрТипОписание
callbackStringНовый адрес с указанием пути

removeCallback - Удаляет адрес для получения событий

async function run() {
    const result = await vkcoin.api.removeCallback();
    
    console.log(result);
}

run().catch(console.error);

Параметров не принимает

Updates

updates - Позволяет "прослушивать" события в VK Coin. Пока что я реализовал перехват входящего платежа, но вскоре придумаю что-нибудь ещё. И да, впервые работаю с сокетами :)

Запуск

Для запуска прослушивания есть 3 способа. Longpoll, webhook и отдельный middleware для Express

startPolling - Запускает обмен запросами между клиентом и сервером в режиме реального времени (WebSocket). Является лучшим и быстрым способом получения событий:

vkcoin.updates.startPolling(callback);
    
/* Тут ваши действия со слушателем */
ПараметрТипОписание
callbackFunctionФункция обратного вызова, принимает в себя аргумент event

Советую в аргумент callback вставлять console.log или любой другой метод для отслеживания действий сокетов, например можно дебажить методом отправки сообщения ВК:

vkcoin.updates.startPolling(async(event) => {
    await vk.api.messages.send({ // Используется vk-io в качестве примера
        user_id: vkcoin.merchantId, // Тут ваш ID
        message: `Polling: ${event}`
    });

    console.log(event);
});

/* Тут ваши действия со слушателем */

Например: Вы запустили polling и потом зашли в VK Coin. Срабатывает автопереподключение к серверу:

> Подключено
> Вы зашли в VK Coin
> Соединение разорвано, переподключение совершится через 5 сек...
> Подключено

startWebHook - Запускает сервер на 8181 порте для получения событий. Может не работать на Windows и является неоптимальным способом получения событий. В этом случае можно обойтись без асинхронной функции:

vkcoin.updates.startWebHook(options);

/* Тут ваши действия со слушателем */
ОпцияТипОписание
optionsObjectОпции вебхука
options.urlStringАдрес вашего сервера для получения событий
options.portNumberПорт для запуска сервера (8181 - по умолчанию)
options.pathStringПуть вашего хука (/ - по умолчанию)

При использовании startWebHook, вы лишаетесь многого: получение топов, места, онлайна и информации об объёме рынка. Всё это можно получить при использовании startPolling

getExpressMiddleware - Получает функцию цепи middleware для Express.

Перед использованием этого способа, нужно указать VKCOIN'у адрес для получения событий с указанием пути:

vkcoin.api.setCallback('http://my-address.ru/vkcoin');

Дальше уже можно использовать

const express = require('express');

const app = express();

/**
 * Это действие нужно обязательно
 * Нужно для получения тела запроса
 */
app.use(express.json());

// Дальше есть два варианта развития событий

// 1: Добавление функции в цепь middleware
app.use(
    vkcoin.updates.getExpressMiddleware('/vkcoin')
);

// 2: Или определить функцию на свой роут
app.post(
    '/vkcoin',
    vkcoin.updates.getExpressMiddleware()
);

// Выбирайте на свой вкус :)

/* Тут ваши действия со слушателем */

События

updates.onTransfer - Перехватывает входящие платежи, принимает один аргумент

vkcoin.updates.startPolling();

vkcoin.updates.onTransfer((event) => {
    console.log(event);
});

Или

vkcoin.updates.startWebHook({
    url: '123.123.123.123', // Тут ваша ссылка или IP-адрес сервера
    path: '/webhook',
    port: 1337
});

vkcoin.updates.onTransfer((event) => {
    console.log(event);
});

Или

async function run() {
    await vkcoin.api.setCallback('http://my-address.ru/vkcoin');

    app.use(
        vkcoin.updates.getExpressMiddleware('/vkcoin')
    )

    vkcoin.updates.onTransfer((event) => {
        console.log(event);
    });
}

event - Объект, который хранит в себе информацию о платеже:

ПараметрТипОписание
event.amountNumberКоличество коинов, которые послупили на счёт
event.fromIdNumberАйди плательщика
event.idNumberАйди платежа

Стоит отметить, что startWebHook получает только платежи по ссылке.

Я опять же советую использовать startPolling

Методы и прочее

reconnectTimeout - Значение тайм-аута для переподключения

vkcoin.updates.reconnectTimeout = 10000; // Сменил на 10 скунд

По умолчанию это значение равно 5000 (5 секунд)

reconnect - Метод переподключения сервера для Longpoll. Использоуется в самой библиотеке для автопереподключения, но в своём коде его также можно использовать.

async function run() {
    await vkcoin.updates.startPolling(console.log);

    try {
        /* Тут код, который может выдать ошибку */
    } catch(error) {
        await vkcoin.updates.reconnect(); // Выполняю переподключение

        console.error(`Ошибка: ${error}`);
    }
}

run();

Стоит сказать, что при переподключении во время работы поллинга новое подключение будет перебивать первое и потом наоброт. Так будет идти бесконечно, пока вы не остановите код. Так что reconnect стоит использовать, если вы отключились от сервера, а лучше вообще не трогать :)

Полезная информация - Если вы подкючились через startLongpoll, то в качестве бонуса вы можете узнать много полезного:

  • Своё место в топе
  • Объём рынка
  • Сумма переводов за 5 минут
  • Онлайн в данный момент
  • Топ пользователей
  • Топ сообществ
const { updates } = vkcoin;

updates.startPolling(console.log).then(async() => {
    const { place, online, digits, userTop, groupTop } = updates;

    console.log({ place, online, digits, userTop, groupTop });
});

Теперь пройдусь по каждому параметру:

ПараметрТипОписание
placeNumberВаше место в топе
onlineNumberОнлайн пользователей в данный момент
digitsObject[]Информация о рынке и сумме переводов
digits.descriptionStringОписание дигита
digits.valueNumberЗначение дигита
digits.trendNumberНа сколько изменилось значение переводов за 5 минут
userTopObject[]Топ пользователей
userTop.idNumberID Пользователя
userTop.scoreNumberБаланс
userTop.first_nameStringИмя
userTop.last_nameStringФамилия
userTop.is_closedBooleanЗакрыт ли аккаунт
userTop.can_access_closedBooleanМожет ли текущий пользователь видеть профиль при is_closed = true
userTop.photo_200StringСсылка на аватарку
userTop.linkStringСсылка на профиль
groupTopObject[]Топ сообществ. Подробнее: см. ниже
groupTop.idNumberID сообщества
groupTop.scoreNumberБаланс
groupTop.nameStringИмя сообщества
groupTop.screen_nameStringКороткий адрес
groupTop.is_closedNumberЗакрыта ли группа
groupTop.typeStringТип сообщества (паблик, страница, группа)
groupTop.photo_200StringАватарка сообщества
groupTop.linkStringСсылка на сообщество

Так же скорее всего, все значения будут равны null, потому что клиент ws не успевает подключиться. Для решения этой проблемы могу посоветовать сделать delay функцию и интегрировать в метод:

const delay = (ms) => new Promise(res => setTimeout(res, ms));

const { updates } = vkcoin;

updates.startPolling(console.log).then(async() => {
    await delay(1000);

    const { place, online, digits, userTop, groupTop } = updates;
    console.log({ place, online, digits, userTop, groupTop });
});

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

Ссылки

1.8.0

4 years ago

1.7.1

5 years ago

1.7.0

5 years ago

1.6.1

5 years ago

1.6.0

5 years ago

1.5.4

5 years ago

1.5.3

5 years ago

1.5.2

5 years ago

1.5.1

5 years ago

1.5.0

5 years ago

1.4.1

5 years ago

1.4.0

5 years ago

1.3.3

5 years ago

1.3.0

5 years ago

1.2.2

5 years ago

1.2.1

5 years ago

1.1.4

5 years ago