You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中使用Telegraf.js如何处理contactRequest响应?

处理Telegraf.js中Markup.button.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:57:35