Telegraf.js中bot.reaction()监听Telegram Bot消息反应失效问题
解决Telegraf.js监听消息反应失效的问题
核心原因
Telegraf默认不会请求message_reaction类型的更新,Telegram服务器不会主动推送这类事件给Bot,这是最常见的失效原因。此外还需检查Bot权限与对话环境。
解决方案步骤
1. 显式指定允许接收的更新类型
在bot.launch()中添加allowedUpdates配置,包含消息反应相关的更新类型:
bot.launch({ allowedUpdates: ['message', 'message_reaction', 'message_reaction_count'] });
说明:Telegraf默认的
allowedUpdates仅包含基础消息类型,必须手动添加message_reaction和message_reaction_count,才能让Telegram服务器推送反应事件。
2. 验证Bot在对话中的权限
- 如果是群聊/超级群:确保Bot已被添加到对话中,且拥有「读取消息」的权限(群管理员可在Bot的权限设置中开启)。
- 如果是私聊:确保用户与Bot有过对话(发送过至少一条消息),否则无法接收反应事件。
3. 用通用监听排查事件是否可达
先放弃特定表情的监听,改用全局反应事件监听,验证是否能收到更新:
bot.on('message_reaction', (ctx) => { console.log('收到反应更新:', ctx.update.message_reaction); });
如果控制台能输出日志,说明事件已正常接收,再排查bot.reaction("👍")的匹配问题(比如表情编码是否一致,可尝试用Unicode编码"\u{1F44D}"替代 emoji 字符)。
4. 确认Bot API版本兼容性
消息反应功能要求Telegram Bot API版本≥6.0,Telegraf 4.16+已支持该版本。可通过以下代码验证当前连接的API版本:
bot.telegram.getWebhookInfo().then(info => { console.log('当前Bot API版本:', info.api_version); });
若版本低于6.0,需检查是否有代理或环境限制导致无法连接最新API服务器。
修正后的完整示例代码
const {Telegraf} = require('telegraf'); const dotenv = require('dotenv'); dotenv.config(); const BOT_TOKEN = process.env.BOT_TOKEN || ''; const bot = new Telegraf(BOT_TOKEN); // 全局监听所有反应事件 bot.on('message_reaction', (ctx) => { console.log('收到反应:', ctx.update.message_reaction); }); // 监听特定👍反应 bot.reaction("👍", (ctx) => { console.log("用户添加了👍反应"); }); // 显式指定允许的更新类型 bot.launch({ allowedUpdates: ['message', 'message_reaction', 'message_reaction_count'] }); console.log(`Bot已启动,Token: ${BOT_TOKEN}`);
内容的提问来源于stack exchange,提问作者ssgreco
相关产品推荐
相关产品推荐

