![Oracle Drags Its Feet in the JavaScript Trademark Dispute](https://cdn.sanity.io/images/cgdhsj6q/production/919c3b22c24f93884c548d60cbb338e819ff2435-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
node-vkcoinapi
Advanced tools
Модуль для работы с API VK Coin
Для начала использования, вам нужно создать в своей папке исполняемый файл, пусть это будет index.js
Теперь его нужно открыть и импортировать библиотеку:
const VKCOINAPI = require('node-vkcoinapi');
const vkcoin = new VKCOINAPI(options);
Опция | Тип | Описание |
---|---|---|
options | Object | Опции конструктора |
options.key | String | Ключ для взаимодействия с API |
options.userId | Number | Ваш айди ВК |
options.token | String | Ваш токен |
Откройте свою аватарку и в адресной строке вы увидите подобное: https://vk.com/fakeman.cat_fmc?z=photo236908027_456259706%2Falbum236908027_0%2Frev
Вашим айди будет являться число после слова photo. В этом случае 236908027
Откройте эту ссылку и нажмите разрешить
После этого в адресной строке будет подобное: https://api.vk.com/blank.html#access_token=xxxxxxxxxxxx&expires_in=0&user_id=user_id&email=email
Токеном будет являться строка от access_token до &expires. В этом случае xxxxxxxxxxxx
Токен нужен для получения событий через WebSocket (Моментальное получение платежей)
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);
}
Параметр | Тип | Описание |
---|---|---|
method | String | Исполняемый метод |
params | Object | Параметры метода |
При вызове методов с помощью call указывать merchatId и key в параметрах не нужно
getTransactionList - Получает список ваших транзакций
async function run() {
const result = await vkcoin.api.getTransactionList(tx);
console.log(result);
}
run().catch(console.error);
Параметр | Тип | Описание |
---|---|---|
tx | Number[] | Массив айди переводов для получения ИЛИ [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);
Параметр | Тип | Описание |
---|---|---|
toId | Number | Айди получателя |
amount | Number | Сумма перевода |
fromShop | Boolean | Если true, то платеж отправится от имени магазина |
getLink - Получает ссылку для перевода
function run() {
const link = vkcoin.api.getLink(amount, fixation);
console.log(link);
}
run().catch(console.error);
Параметр | Тип | Описание |
---|---|---|
amount | Number | Сумма перевода |
fixation | Boolean | Фиксированная сумма или нет |
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);
Параметр | Тип | Описание |
---|---|---|
coins | Number | Входящее значение коинов |
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:
Параметр | Тип | Описание |
---|---|---|
userIds | Number|Number[] | Массив айди пользователей |
setShopName - Меняет название магазина
async function run() {
const result = await vkcoin.api.setShopName(name);
console.log(result);
}
run().catch(console.error);
Параметр | Тип | Описание |
---|---|---|
name | String | Новое имя для магазина |
setCallback - Изменяет адрес для получения событий
async function run() {
const result = await vkcoin.api.setCallback(callback);
console.log(result);
}
run().catch(console.error);
Параметр | Тип | Описание |
---|---|---|
callback | String | Новый адрес с указанием пути |
removeCallback - Удаляет адрес для получения событий
async function run() {
const result = await vkcoin.api.removeCallback();
console.log(result);
}
run().catch(console.error);
Параметров не принимает
updates - Позволяет "прослушивать" события в VK Coin. Пока что я реализовал перехват входящего платежа, но вскоре придумаю что-нибудь ещё. И да, впервые работаю с сокетами :)
Для запуска прослушивания есть 3 способа. Longpoll, webhook и отдельный middleware для Express
startPolling - Запускает обмен запросами между клиентом и сервером в режиме реального времени (WebSocket). Является лучшим и быстрым способом получения событий:
vkcoin.updates.startPolling(callback);
/* Тут ваши действия со слушателем */
Параметр | Тип | Описание |
---|---|---|
callback | Function | Функция обратного вызова, принимает в себя аргумент 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);
/* Тут ваши действия со слушателем */
Опция | Тип | Описание |
---|---|---|
options | Object | Опции вебхука |
options.url | String | Адрес вашего сервера для получения событий |
options.port | Number | Порт для запуска сервера (8181 - по умолчанию) |
options.path | String | Путь вашего хука (/ - по умолчанию) |
При использовании 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.amount | Number | Количество коинов, которые послупили на счёт |
event.fromId | Number | Айди плательщика |
event.id | Number | Айди платежа |
Стоит отметить, что 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, то в качестве бонуса вы можете узнать много полезного:
const { updates } = vkcoin;
updates.startPolling(console.log).then(async() => {
const { place, online, digits, userTop, groupTop } = updates;
console.log({ place, online, digits, userTop, groupTop });
});
Теперь пройдусь по каждому параметру:
Параметр | Тип | Описание |
---|---|---|
place | Number | Ваше место в топе |
online | Number | Онлайн пользователей в данный момент |
digits | Object[] | Информация о рынке и сумме переводов |
digits.description | String | Описание дигита |
digits.value | Number | Значение дигита |
digits.trend | Number | На сколько изменилось значение переводов за 5 минут |
userTop | Object[] | Топ пользователей |
userTop.id | Number | ID Пользователя |
userTop.score | Number | Баланс |
userTop.first_name | String | Имя |
userTop.last_name | String | Фамилия |
userTop.is_closed | Boolean | Закрыт ли аккаунт |
userTop.can_access_closed | Boolean | Может ли текущий пользователь видеть профиль при is_closed = true |
userTop.photo_200 | String | Ссылка на аватарку |
userTop.link | String | Ссылка на профиль |
groupTop | Object[] | Топ сообществ. Подробнее: см. ниже |
groupTop.id | Number | ID сообщества |
groupTop.score | Number | Баланс |
groupTop.name | String | Имя сообщества |
groupTop.screen_name | String | Короткий адрес |
groupTop.is_closed | Number | Закрыта ли группа |
groupTop.type | String | Тип сообщества (паблик, страница, группа) |
groupTop.photo_200 | String | Аватарка сообщества |
groupTop.link | String | Ссылка на сообщество |
Так же скорее всего, все значения будут равны 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 секунду и тогда всё успевает получиться.
FAQs
Работа с API VK Coin
The npm package node-vkcoinapi receives a total of 0 weekly downloads. As such, node-vkcoinapi popularity was classified as not popular.
We found that node-vkcoinapi demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.