1

我想创建一个基于 Telegraf 的 Telegram 机器人。我希望机器人通过启动命令来安排并向用户发送消息。

例如,我希望它作为一门课程工作:一旦你选择了一门课程,你每天都会得到课程。

我尝试使用 node-cron(参见下面的示例),但它通过启动机器人开始发送消息。

const cron = require('node-cron');

const schedule = cron.schedule('*/5 * * * * *', async () => {
  bot.telegram.sendMessage(chatId, 'Hello World');
});

bot.command('/launch', ctx => {
  schedule.launch();
});

bot.command('/stop', ctx => {
  schedule.stop();
});

请提出实现这样的机器人的方法。如果您知道现有的带有源代码的 Telegraf 机器人,请告诉我。

4

2 回答 2

1

有两个选项可以做到这一点。

  1. 使用 setInterval() 函数并检查函数体中的日期。我检查秒,但你可以检查小时或天。
let timer = null;

bot.onText(/\/start/, message => {
    timer = setInterval(() => {
        if(new Date().getSeconds() === 1) {
            bot.sendMessage(message.chat.id, "responce");    
        }
    }, 1000)    
});

bot.onText(/\/stop/, message => {
    clearInterval(timer);
})
  1. 使用外部 npm 包 node-schedule 或类似的东西。
import schedule from "node-schedule";
let job;

bot.onText(/\/start/, message => {
    job = schedule.scheduleJob('1 * * * * *', () => {
        bot.sendMessage(message.chat.id, "responce");
    });
});

bot.onText(/\/stop/, message => {
    if (job) {
        job.cancel()
    }
});

我更喜欢第二种选择,因为它更灵活。

于 2021-01-20T19:33:11.260 回答
1

如果这是我的项目,我会编写一个独立的程序(用 nodejs 或其他语言)来运行操作系统的cron 子系统而不是 nodejs 经常调用的程序。该程序不会作为 Web 服务器运行,而只是独立运行。

独立程序将连接到您的用户数据库,检索它需要发送的消息列表,然后使用电报发送它们。

完成发送后它会退出,因为知道操作系统的 cron 将在时间到来时再次启动它。

于 2020-04-20T20:40:00.303 回答