【问题标题】:telebot won't stop and start远程机器人不会停止和启动
【发布时间】:2021-03-28 22:41:38
【问题描述】:

我正在尝试每 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] { 好的:假的, 错误代码:409, 描述:'冲突:由其他 getUpdates 请求终止;确保只有一个机器人实例正在运行' }

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

【问题讨论】:

    标签: javascript node.js telegram


    【解决方案1】:

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

    Telebot documentation 向我们展示了一些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
    ...
    

    【讨论】:

    • 您确定您使用的机器人令牌没有在其他任何地方运行吗?尝试从@botFather 获取一个新的机器人(令牌)来检查这一点。由于您的代码确实向我显示了错误,但我的代码没有我不确定问题可能存在于哪里。
    • 我创建了一个名为 test888888bot 的新机器人来测试它
    • 是否有任何代码块未包含在 OP 中?想不出为什么这不起作用。
    • 这里是错误图片的链接:ibb.co/G9437MX
    【解决方案2】:

    以确保机器人已停止并且没有任何东西挥之不去。

    你可以把它放在自己的节点脚本中,然后运行它:

    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 作业”脚本”。 请记住,这将终止该进程,因此它没有任何机会进行任何清理,因此如果您想先温和地终止该进程。首先通过管道将消息传递给子进程,以便它可以尝试自行终止。

    【讨论】:

    • 它说 ReferenceError: AbortController is not defined
    • 好的,我安装了 node -v 15 现在我没有收到任何错误,但它仍然无法正常工作。不过谢谢。
    【解决方案3】:

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

    但我想出了一个老套的解决方案。

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

    */10 * * * * 下午重启 0

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多