远程机器人不会停止和启动

telebot won't stop and start

我试图每 10 秒重新启动我的机器人(为了测试,我想每 10 分钟左右重新启动一次),但我似乎无法做到。 我试过:

const TeleBot = require('telebot');
const bot = new TeleBot({
  token:'mytoken',
  polling:true
});

setInterval(function(){ bot.start()},9000);
setInterval(function(){ bot.stop()},10000); 

它说机器人启动和停止,但是当它第二次启动时它说:

[bot.error.update] { ok: false, error_code: 409, description: 'Conflict: terminated by other getUpdates request; make sure that only one bot instance is running' }

但是如果 bot 停止,则应该只有没有 bot 的实例 运行。 有没有办法完全停止机器人?

非常有趣的问题,我猜这个问题是由 setIntervalinaccuracy 引起的,这会导致那些 setInterval 不同步。 (因此,例如,您将尝试启动机器人,而它已经处于活动状态)

我们可以使用 Telebot documentation shows us there are some TeleBot Events 来确保我们只在需要时调用 start() / stop()

const TeleBot = require('telebot');
const bot = new TeleBot({
  token:'********:AAEibBwftjTEKuYd9d2X0ACeyyzTk4DLe60',
  polling:true
});

// Create event listener for bot-stop
bot.on('stop', (data) => {

    // After 5 seconds, START the bot
    setTimeout(function(){
        bot.start()
    }, 5 * 1000);
});

// Create event listener for bot-start
bot.on('start', (data) => {

    // After 10 seconds, STOP the bot
    setTimeout(function(){
        bot.stop('Interval stop()')
    }, 10 * 1000);
});

// Start for first time
bot.start()

使用这种方法,我的机器人已经关闭和打开大约 25 60 分钟,没有任何问题:

MBP ➜  telebot node startEnStop.js
[bot.plugin] loaded 'regExpMessage' plugin
[bot.plugin] loaded 'shortReply' plugin
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
[bot.info] bot stopped : Interval stop()
[bot.info] bot started
...

确保机器人已经停止并且没有任何残留。

您可以将它放在自己的节点脚本中,然后 运行 使用:

const { fork } = require('child_process');
const controller = new AbortController();
const child = fork("your_script.js", { controller });


setTimeout(function()
{
    controller.abort(); // Stops the child process
}, 10000);

来自您的主控或“cron 作业”脚本”。 请记住,这将终止该进程,因此它不会有任何机会进行任何清理,所以如果您想先温和地终止该进程。首先通过管道将消息传递给子进程,以便它可以尝试自行终止。

感谢所有试图提供帮助的人。

但我想出了一个 hacky 解决方案。

我将我的文件从 heroku 移动到 vps,然后我安装了 pm2 并将其设置为 运行 节点 index.js(我的主要 js 文件),然后我安装了 cron 和通过键入 crontab -e 将其设置为每 10 分钟重新启动 pm2 并键入以下内容:

*/10 * * * * pm restart 0

现在我的机器人每 10 分钟重启一次。