Установите sBot с помощью NPM:
npm i sbot-vk --save
Работает на Node.js 8.x и выше
var Bot = require('sbot-vk')
var b = new Bot('access_token')
// или
var b = new Bot({
botname: 'Бот', // На что будет "отзываться" бот, необязательно
token: 'access_token' // Токен ВКонтакте, можно получить, например, на https://vkhost.github.io/
})
b.start() // Запуск бота
b.setDict({ // Установить "словарь" для автоответчика и процент совпадения строки
'привет': 'Здравствуй!'
}, 0.65)
Если процент <1, то срабатывать автоответчик будет при неполном совпадении строки
Например, бот будет отвечать на "пирвет" ровно также, как и на "привет", если установлен процент совпадения 0.65
b.use((text, message, next) => {
// Эта функция будет выполняться для каждого входящего сообщения
console.log(`[${message[0].from.first_name} ${message[0].from.last_name} (${message[0].from.id})] ${message[0].isOut ? '<=' : '=>'} ${text}`)
// [Евгений Малевич (193158046)] => привет
// [Малевий Евгенич (408783076)] <= Здравствуй!
next()
})
В этом примере middleware - простой логгер, который выводит информацию о входящих сообщениях в консоль.
b.use((text, message, next) => {
if(!message[0].isOut && /дурак/gi.test(text)) {
console.log(`${message[0].from.first_name} ${message[0].from.last_name} ругается!`)
// Евгений Малевич ругается!
message.answer('Сам дурак!')
} else {
next()
}
})
Здесь middleware используется как фильтр слова "дурак" во входящих сообщениях
b.use(callback)
-
callback - Функция для обработки каждого сообщения, передает аргументы:
-
text - Текст обрабатываемого сообщения в нижнем регистре (в виде, в котором он передается событию), string
-
message - Array, содержащий объект с обрабатываемым сообщением (message[0])
-
next - Функция, при выполнении которой обработка сообщения пойдет далее (будет вызвано событие с этим сообщением и сообщение будет протестировано словарем)
b.api(method, [parameters])
- method - Название метода, string
- parameters - Параметры метода, object Возвращает Promise с объектом, содержащим ответ от VKAPI
b.on('отправь фото', async (message) => {
var photo = await b.upload.photo(Buffer)
// Buffer - файл фотографии
// Получить из файла можно через fs.readFileSync()
message.answer('Пожалуйста:', photo)
})
В данном примере бот отправляет в ответ фотографию.
bot.upload.photo(buffer)
- buffer - Фотография, buffer
Возвращает Promise со строкой, содержащим готовое к отправке прикрепление (в формате
photo1234_5678
)
bot.upload.audio_message(buffer, [peer_id])
- buffer - Голосовое сообщение, buffer
- peer_id - ID, на который затем будет отправлено голосовое сообщение, number ТОЛЬКО ДЛЯ ГРУПП
Возвращает Promise со строкой, содержащим готовое к отправке прикрепление (в формате
doc1234_5678
)
bot.upload.graffiti(buffer)
- buffer - Граффити, buffer
НЕ РАБОТАЕТ В ГРУППАХ
Возвращает Promise со строкой, содержащим готовое к отправке прикрепление (в формате
doc8765_4321
)
sBot может работать в группе без дополнительных настроек:
var Bot = require('sbot-vk')
var b = new Bot('group_token') // Указываем токен группы
b.start().then(() => {
console.log(b.getMe())
// {id: 140670418, mode: 'group'}
})
При работе от пользователя, значение bot.getMe().mode будет 'user'
b.on('как тебя зовут', message => {
message.answer(`Меня зовут ${b.getMe().first_name} ${b.getMe().last_name}`)
})
b.on(/^sqrt (.+)$/, (message) => {
var number = message.text.match(/^sqrt (.+)$/)
// number = ['sqrt 144', '144']
if (isNaN(number)) {
message.answer(`Вы должны передать число в аргументе.`)
} else {
message.answer(`Квадратный корень из числа ${number[1]}: ${Math.sqrt(parseInt(number[1]))}`)
}
})
b.on(/^передай \[id(.+)\|(.+)] (.+)$/, message => {
var str = message.text.match(/^передай \[id(.+)\|(.+)] (.+)$/)
// str = ['передай [id1|Павел Дуров] что он дурак', '1', 'Павел Дуров', 'что он дурак']
b.sendMessage(str[1], `Кто-то передал вам: ${str[3]}`)
message.answer('Готово!')
})
b.on(message, callback)
- message - Текст сообщения, которое необходимо обработать, string или regexp
- callback - Функция для обработки сообщения
Если Вам нужен дополнительный функционал, Вы можете напрямую получать события LongPoll, отличающиеся от нового сообщения (событие 4):
b.namespace('longpoll').on(5, (update) => { // Событие, означающее редактирование сообщения (событие 5)
b.sendMessage(update[3], 'Кажется, кто-то только что отредактировал сообщение...')
})
(Полный список событий LongPoll доступен здесь)
Синтаксис:
b.on(updateNumber, callback)
- updateNumber - Номер события, которое необходимо обработать, string или regexp
- callback - Функция для обработки события (передаёт аргумент
update
, содержащий полный массив с информацией о событии)
В пространстве имён longpoll также доступен middleware:
b.namespace('longpoll').use((update, updatesArray, next) => {
console.log(`Получено событие #${update}: ${updatesArray}`)
// Получено событие #9: -353391492,1,1515861336
// Получено событие #8: -407371780,7,1515861744
})
- update - Номер типа обрабатываемого события (все события, кроме 4)
- updatesArray - Array, содержащий обрабатываемое событие (без номера события)
- next - Функция, при выполнении которой обработка события пойдет далее
{
messageId: 171,
peerId: 193158046,
longpollObject: {},
text: 'hello sBot',
from: { id: 193158046, first_name: 'Евгений', last_name: 'Малевич' },
isOut: false,
attaches: [ { type: 'photo', attach: '193158046_456281537' } ],
answer: [Function: answer],
sticker: [Function: sticker]
}
- messageId - ID сообщения, number
- peerId - ID отправителя (может быть ID пользователя, группы или беседы), number
- longpollObject - Дополнительный объект, отправляемый LongPoll, object
- text - Текст сообщения, string
- from - Информация об отправителе сообщения, object
- isOut - True, если сообщение было исходящим, boolean
- attaches - Прикрепления, array
- answer - Функция для ответа текстом и прикреплениями
- sticker - Функция для ответа стикером
Используется для ответа на сообщение
message.answer(text, [attach], [forward])
- text - Текст отправляемого сообщения, string
- attach - Массив или строка с прикреплениями (напр.
['photo1234_5678', 'photo8765_4321']
) - forward - Если true, то обрабатываемое сообщение будет переслано, boolean
Используется для ответа стикером
message.sticker(stickerId)
- stickerId - ID отправялемого стикера