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,提问作者Михаил Морозов
相关产品推荐
相关产品推荐

