如果我使用 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

希望对大家有所帮助。