Telegram Bot Node JS polling error
Простой бот вопросник-ответчик на node.js, бот получает сообщение, сравнивает его с базой данных файла .json, если присутствует погрешность в формировании вопроса - поправляет (с помощью fuzzy) и отвечает:
const TelegramBot = require('node-telegram-bot-api');
const fuzzy = require('fuzzy');
const data = require('./questions_and_answers.json'); // JSON файл
const token = 'xxxxxxxxxxxx';
const bot = new TelegramBot(token, {polling: true});
bot.on('message', (msg) => {
const userQuestion = msg.text.toLowerCase();
let bestMatch, bestRatio = 0;
// Поиск наиболее похожего вопроса
for (const question of data) {
const ratio = fuzzy.ratio(userQuestion, question.question.toLowerCase());
if (ratio > bestRatio) {
bestMatch = question;
bestRatio = ratio;
}
}
// Отправка ответа с учетом погрешности
if (bestRatio > 80) { // Порог соответствия
const answer = Array.isArray(bestMatch.answer) ? bestMatch.answer.join(", ") : bestMatch.answer;
bot.sendMessage(msg.chat.id, `Вы имели в виду: ${bestMatch.question}? \n\n Ответ: ${answer}`);
} else {
bot.sendMessage(msg.chat.id, "Извините, я не знаю ответа на этот вопрос.");
}
});
Структура json файла максимально простая:
[
{
"question": "ВОПРОС1",
"answer": "ОТВЕТ1 "
},
{
"question": "ВОПРОС2",
"answer": "ОТВЕТ2"
}.....
..........
]
При отправки любого сообщения боту, консоль выдает: error: [polling_error] {}
Пробовал менять API в botFather, проверил атрибуты доступа, пытался запустить бота как с помощью обычной Командной строки, так и с помощью строки администратора
Ответы (1 шт):
Я добавил в код вывод сообщений об ошибках:
bot.on('polling_error', console.log);
bot.on('webhook_error', console.error);
И более точно узнал причину по которой не работала моя программа:
TypeError: fuzzy.ratio is not a function
Теперь бот работает, возможно стандартная библиотека fuzzy слишком устаревшая для более нового Node.js. (вероятнее всего не правильно вызывал функционал fuzzy.ratio)
Я использовал fuzzball (https://www.npmjs.com/package/fuzzball#installation), незначительно изменив код, все работает как и задумывалось.