如果我使用 node-telegram-bot-api 创建电报机器人对象,为什么 dialogflow bot 停止在电报中响应?
Why dialogflow bot stop responding in telegram if i create a telegram bot object with node-telegram-bot-api?
我已经构建了一个带有电报集成的 dialogflow 聊天机器人,我需要获取用户在电报聊天中发送的图像的路径。据我所知,dialogflow bot 不监听图像,所以我使用电报 bot 对象轮询消息以获取图像,但这样 dialogflow bot 停止响应,即使在电报 bot 的轮询停止后也是如此。这两个机器人之间存在一些冲突。 “复苏”dialogflow 机器人的唯一方法是手动重启 dialogflow UI 中的电报集成。
有一种方法可以解决两个机器人之间的冲突,以便 dialogflow 机器人在电报机器人获得图像后继续响应?
这是我写的代码:
const TG = require('node-telegram-bot-api');
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
function takeImagePath() {
agent.add(`send an image/photo`); // work
const token = 'my telegram bot token';
let telegramBot = new TG(token, {polling: true});
agent.add(`tg bot created`); // work
telegramBot.on('message', async function (msg) {
const chatId = msg.chat.id;
agent.add('bot dialogflow in the listener'); // don't work
if (msg.photo) {
let ImgID = msg.photo[msg.photo.length - 1].file_id;
let imgPath = "";
if (ImgID) {
telegramBot.getFile(ImgID).then((fileObject) => {
imgPath = fileObject.file_path;
}).then(() => telegramBot.sendMessage(chatId, 'image taken')) //work
.catch(error => console.log("error: " + error.message));
}
}
else { await telegramBot.sendMessage(chatId, "it's not an image, telegram bot shutting down"); //work
await telegramBot.stopPolling();
agent.add("bot dialogflow active"); // don't work
}
});
}
let intentMap = new Map();
intentMap.set('Image intent', takeImagePath);
agent.handleRequest(intentMap);
});
已解决。问题在于 webhook 和轮询是两种相互排斥的获取消息的方法。因此,虽然 dialogflow-telegram 机器人使用 webhook,但我创建的电报机器人对象使用轮询
let telegramBot = new TG(token, {polling: true});
它会自动删除 webhook。
要解决此问题,必须在停止轮询后重新设置 webhook:await bot.stopPolling(); bot.setWebHook("your webhook url").then(r => console.log("webhook response: "+r)).catch(err => console.log("webhook error: "+err.message));
您可以在这里找到您的 dialogflow-telegram 机器人正在使用的 webhook url:
https://api.telegram.org/botYourTelegramBotToken/getWebhookInfo
希望对大家有所帮助。
我已经构建了一个带有电报集成的 dialogflow 聊天机器人,我需要获取用户在电报聊天中发送的图像的路径。据我所知,dialogflow bot 不监听图像,所以我使用电报 bot 对象轮询消息以获取图像,但这样 dialogflow bot 停止响应,即使在电报 bot 的轮询停止后也是如此。这两个机器人之间存在一些冲突。 “复苏”dialogflow 机器人的唯一方法是手动重启 dialogflow UI 中的电报集成。 有一种方法可以解决两个机器人之间的冲突,以便 dialogflow 机器人在电报机器人获得图像后继续响应? 这是我写的代码:
const TG = require('node-telegram-bot-api');
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
function takeImagePath() {
agent.add(`send an image/photo`); // work
const token = 'my telegram bot token';
let telegramBot = new TG(token, {polling: true});
agent.add(`tg bot created`); // work
telegramBot.on('message', async function (msg) {
const chatId = msg.chat.id;
agent.add('bot dialogflow in the listener'); // don't work
if (msg.photo) {
let ImgID = msg.photo[msg.photo.length - 1].file_id;
let imgPath = "";
if (ImgID) {
telegramBot.getFile(ImgID).then((fileObject) => {
imgPath = fileObject.file_path;
}).then(() => telegramBot.sendMessage(chatId, 'image taken')) //work
.catch(error => console.log("error: " + error.message));
}
}
else { await telegramBot.sendMessage(chatId, "it's not an image, telegram bot shutting down"); //work
await telegramBot.stopPolling();
agent.add("bot dialogflow active"); // don't work
}
});
}
let intentMap = new Map();
intentMap.set('Image intent', takeImagePath);
agent.handleRequest(intentMap);
});
已解决。问题在于 webhook 和轮询是两种相互排斥的获取消息的方法。因此,虽然 dialogflow-telegram 机器人使用 webhook,但我创建的电报机器人对象使用轮询
let telegramBot = new TG(token, {polling: true});
它会自动删除 webhook。
要解决此问题,必须在停止轮询后重新设置 webhook:await bot.stopPolling(); bot.setWebHook("your webhook url").then(r => console.log("webhook response: "+r)).catch(err => console.log("webhook error: "+err.message));
您可以在这里找到您的 dialogflow-telegram 机器人正在使用的 webhook url:
https://api.telegram.org/botYourTelegramBotToken/getWebhookInfo
希望对大家有所帮助。