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

Telegraf.js开发Telegram Bot:无用户名用户的联系标识问题

解决Telegram Bot中无用户名用户的联系标识问题

核心方案

Telegram没有为无用户名用户提供公开可直接跳转的外部链接,但你可以通过以下方式满足管理员联系用户的需求:

1. 用user_id作为唯一标识存储

用户的ctx.from.id是Telegram分配的永久唯一用户ID,比chat_id更精准(chat_id可能因对话类型变化,而user_id绑定用户本身),直接将其存入数据库即可作为用户的核心标识。

2. 让管理员通过Bot发起联系(替代外部链接)

不要依赖手动链接跳转,而是在Bot的管理功能中实现「根据user_id发起对话」的能力:

  • 在Telegraf中,使用bot.telegram.sendMessage(user_id, "消息内容")即可直接给用户发消息,前提是用户之前和Bot互动过(Telegram限制Bot主动发消息给未互动的用户)
  • 给管理员做简易操作入口:比如输入/admin send [user_id] [消息],Bot自动完成消息发送

3. 生成Telegram客户端可识别的内部跳转链接

虽然https://t.me/[user_id]无法直接跳转,但可以生成Telegram专属格式的链接,在客户端内点击可直接打开对应用户的聊天界面(前提是管理员和用户有共同群组/频道,或用户允许被查找):

tg://user?id=[user_id]

你可以在管理面板中自动生成该链接,让管理员复制或直接点击使用。

4. 引导用户设置用户名(可选优化)

如果业务场景允许,可在用户首次使用Bot时友好提示:

为了让管理员更便捷联系你,建议设置Telegram用户名:打开Telegram设置 → 编辑个人资料 → 设置用户名。

Telegraf.js代码示例

获取用户ID并存储

bot.command('start', (ctx) => {
  const userId = ctx.from.id;
  const userName = ctx.from.username || '无用户名';
  // 将用户ID及信息存入数据库
  saveToDatabase(userId, userName, ctx.from.first_name);
  ctx.reply(`你的用户ID是:${userId},我们会用这个标识记录你的信息`);
});

管理员通过ID发送消息

// 管理员命令格式:/admin send [用户ID] [消息内容]
bot.command('admin', (ctx) => {
  const args = ctx.message.text.split(' ');
  if (args[1] === 'send' && args[2] && args.slice(3).join(' ')) {
    const targetUserId = parseInt(args[2]);
    const message = args.slice(3).join(' ');
    ctx.telegram.sendMessage(targetUserId, message)
      .then(() => ctx.reply('消息已发送'))
      .catch(err => ctx.reply(`发送失败:${err.message},可能用户未和Bot互动过`));
  }
});

内容的提问来源于stack exchange,提问作者Михаил Морозов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:42:36