Node.js中使用Telegraf.js如何处理contactRequest响应?
你之前用bot.hears("Send Contact")无效的原因是:点击contactRequest按钮后,用户发送的不是文本消息,而是联系人类型的消息,所以不能监听文本关键词,得监听contact事件。
正确的处理方式
直接通过bot.on('contact')来监听用户发送的联系人信息,示例代码如下:
// 监听联系人消息 bot.on('contact', (ctx) => { // 从消息中提取手机号 const phoneNumber = ctx.message.contact.phone_number; // 可选:验证是否是用户本人的手机号 const isOwnContact = ctx.message.contact.user_id === ctx.from.id; if (isOwnContact) { console.log(`收到用户手机号:${phoneNumber}`); ctx.reply(`已成功获取你的手机号:${phoneNumber}`); // 可选:收起键盘 ctx.reply('操作完成', Markup.removeKeyboard()); } else { ctx.reply('请发送你本人的手机号哦'); } });
完整示例代码
把请求手机号和处理逻辑结合起来:
const { Telegraf, Markup } = require('telegraf'); const bot = new Telegraf('你的机器人Token'); // 触发手机号请求的命令(示例) bot.command('getphone', (ctx) => { ctx.reply( "Phone number is required", { ...Markup.keyboard([ Markup.button.contactRequest("Send Contact"), ]).resize(), } ); }); // 处理联系人响应 bot.on('contact', (ctx) => { const contact = ctx.message.contact; if (contact.user_id && contact.user_id === ctx.from.id) { console.log(`收到手机号:${contact.phone_number}`); ctx.reply(`已获取你的手机号:${contact.phone_number}`); ctx.reply('感谢配合', Markup.removeKeyboard()); } else { ctx.reply('请发送你自己的手机号,不要发送他人的联系人信息'); } }); bot.launch();
关键说明
ctx.message.contact包含用户发送的联系人数据,主要字段有:phone_number:手机号user_id:联系人对应的Telegram用户ID(仅当是用户本人时存在)first_name/last_name:联系人姓名
- 验证
user_id === ctx.from.id可以确保用户发送的是自己的手机号,避免接收他人的联系人信息。
内容的提问来源于stack exchange,提问作者boom pow
相关产品推荐
相关产品推荐

