如何基于Node.js与Telegram Bot API实现定时发送消息?
实现Telegram Bot定时发送消息的两种方案
嘿,我来帮你搞定这个定时发消息的需求!结合你现有的代码,我给你两种靠谱的实现方式,你可以根据需求选:
方案一:用Node.js原生setInterval(简单直接)
这个方案不用额外装包,用Node自带的定时器就能实现,适合固定间隔的定时任务。
完整修改后的代码
var express = require('express'); var app = express(); var bodyParser = require('body-parser'); const axios = require('axios') app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // 👇 先配置你的机器人信息 const TELEGRAM_BOT_TOKEN = '你的机器人Token'; // 从@BotFather那里拿到的 const CHAT_ID = '目标聊天ID'; // 要发给谁的聊天ID,获取方法下面说 // 封装发送"hello"的函数 async function sendHelloMessage() { try { // 调用Telegram的sendMessage API await axios.post(`https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage`, { chat_id: CHAT_ID, text: 'hello' }); console.log('定时消息发送成功'); } catch (error) { // 捕获错误方便排查 console.error('发送消息失败:', error.response?.data || error.message); } } // ⏰ 每5分钟(300000毫秒)执行一次发送 const intervalId = setInterval(sendHelloMessage, 5 * 60 * 1000); // 可选:如果后续需要停止定时任务,调用 clearInterval(intervalId) 就行 // 你的原有webhook逻辑(如果需要处理用户消息的话) app.post('/webhook', (req, res) => { // 这里处理Telegram的webhook请求,比如回复用户消息 res.sendStatus(200); }); app.listen(3000, () => { console.log('服务器运行在端口3000'); });
关键步骤说明
获取
CHAT_ID:
先让目标用户给你的机器人发一条任意消息,然后在浏览器里访问:https://api.telegram.org/bot你的机器人Token/getUpdates从返回的JSON数据里找到
message.chat.id,把这个值填到代码里的CHAT_ID即可。定时器说明:
5 * 60 * 1000就是5分钟的毫秒数,你可以根据需求修改这个数值,比如改成1 * 60 * 1000就是每分钟发一次。
方案二:用node-schedule(灵活精准)
如果你的定时需求更复杂(比如每天固定时间发、每周几发),或者担心setInterval在服务器阻塞时出现时间偏移,推荐用node-schedule包,它支持Cron表达式,定时更精准。
步骤
先安装依赖:
npm install node-schedule修改代码中的定时部分:
// 先引入包 const schedule = require('node-schedule'); // 用Cron表达式设置每5分钟执行一次 const job = schedule.scheduleJob('*/5 * * * *', sendHelloMessage); // 可选:后续要停止任务的话,调用 job.cancel()
Cron表达式说明
*/5 * * * * 的意思是每小时的每5分钟执行一次,你可以根据需求调整:
- 每天上午10点发:
0 10 * * * - 每周一上午9点发:
0 9 * * 1 - 每月1号凌晨2点发:
0 2 1 * *
注意事项
- 确保你的服务器一直运行:如果是部署在云服务器上,建议用
pm2之类的进程管理器守护Node进程,避免服务器重启或者进程崩溃后定时任务停止。 - 注意Telegram API限制:每5分钟发一次完全在Telegram的请求频率限制内,不用担心被限流。
- 定时任务不依赖Webhook:即使你用了Webhook处理用户消息,定时发消息的逻辑只要服务器运行就会执行,不需要用户触发。
内容的提问来源于stack exchange,提问作者Deivbid




