如何用Node.js的Telegraf.js实现Telegram Bot按已存user_id发私信
基于Node.js + Telegraf实现向数据库已存user_id主动发私信的落地方案
核心可行性说明
Telegraf原生封装了Telegram Bot的全部官方接口能力,完全支持不依赖用户主动发消息触发、直接调用接口向指定user_id推送私信的能力,没有任何功能层面的阻碍。
必须满足的前置条件:所有接收主动推送的用户,必须此前主动给你的Bot发送过任意消息(也就是和Bot完成过首次交互),否则Telegram服务端会直接拒绝Bot的主动私信请求,返回403权限错误,这是Telegram平台的统一规则,不是框架的问题。
具体实现步骤
- 初始化基础运行环境
首先执行npm install telegraf完成框架安装,使用从BotFather获取的Bot Token完成实例初始化,基础启动代码如下:
const { Telegraf } = require('telegraf'); // 替换为你自己从BotFather获取的Bot身份凭证 const BOT_TOKEN = '你的BotToken'; const bot = new Telegraf(BOT_TOKEN); // 启动Bot长连接,保持服务在线 bot.launch();
- 封装核心能力方法
实现两个通用方法:一个对接你的数据库,拉取所有已存储的目标user_id列表;一个封装单用户的消息发送逻辑,独立捕获异常,避免单个用户的发送故障影响全量推送流程。
对应的参考实现代码:
// 对接数据库查询已存的目标user_id列表,替换为你实际的数据库查询逻辑 async function getTargetUserIdsFromDB() { // 示例返回的用户ID列表 return [12345678, 87654321, 11223344]; } // 单用户发送消息的封装,带独立异常捕获 async function sendToSingleUser(userId, messageContent) { try { await bot.telegram.sendMessage(userId, messageContent); console.log(`消息发送成功,用户ID:${userId}`); } catch (err) { // 捕获常见异常:用户未启动Bot、账号注销、用户屏蔽Bot、接口限流 console.error(`消息发送失败,用户ID:${userId},错误:${err.message}`); } } // 批量推送触发入口,可对接后台接口、定时任务调用 async function triggerBroadcast(messageContent) { const targetUserList = await getTargetUserIdsFromDB(); for (const userId of targetUserList) { await sendToSingleUser(userId, messageContent); // 简单节流:每次发送间隔300ms,避免触发平台限流 await new Promise(resolve => setTimeout(resolve, 300)); } }
常见踩坑提示
- 校验入库的user_id合法性:个人用户的user_id为纯正整数,群聊、频道的ID为负数开头,在存储用户ID的环节就需要做字段校验,避免把非个人账号ID加入推送列表
- 遵守平台私信规则:用户和Bot的最后一次交互间隔超过24小时的,Bot无法主动向该用户发送非服务类的营销/通知消息,否则会被平台判定为垃圾信息,严重的会封禁Bot
- 控制发送频率:批量推送时建议在两次发送之间保留200-500ms的间隔,单分钟发送量不要超过25条,避免触发平台限流,导致临时丧失发送权限
- 不要省略异常捕获:批量发送时如果没有在单用户逻辑上加独立的try/catch,只要遇到一个发送失败的场景(比如用户注销、屏蔽Bot),整个循环就会中断,导致后续所有用户都收不到消息
内容的提问来源于stack exchange,提问作者Shubham Mishra
相关产品推荐
相关产品推荐

