如何在Telegram机器人消息中生成跨设备全类型兼容的用户提及链接?
Telegram机器人全平台兼容用户提及方案
要解决iOS上的跳转失效、链接不渲染问题,同时兼容有用户名和无用户名的用户,核心逻辑是优先用用户名的HTTPS链接,无用户名时回退到tg://协议,同时确保消息格式合规:
两类用户的适配方案
- 拥有@用户名的用户:使用
https://t.me/用户名格式的链接,这个协议在所有Telegram客户端(包括iOS)上都能稳定识别并跳转至用户主页,是最可靠的方案。
代码示例:mention = f'<a href="https://t.me/{user.username}">{user.full_name}</a>' - 仅含显示名无用户名的用户:只能用
tg://user?id={user.id}协议,但需注意iOS限制:接收消息的管理员必须与被提及用户有过至少一次互动(比如同群聊过、搜索过该用户ID),否则链接可能无法跳转——这是Telegram客户端的限制,无法通过机器人代码绕过。
代码示例:mention = f'<a href="tg://user?id={user.id}">{user.full_name}</a>'
完整兼容代码
可以写一个自动适配的函数,同时处理HTML特殊字符转义,避免格式错乱:
import html def generate_user_mention(user): # 转义用户全名中的HTML特殊字符,防止破坏消息格式 escaped_name = html.escape(user.full_name) if user.username: return f'<a href="https://t.me/{user.username}">{escaped_name}</a>' else: # 可额外标注用户ID,方便管理员手动搜索(应对iOS跳转限制) return f'<a href="tg://user?id={user.id}">{escaped_name}</a> (ID: {user.id})'
关键注意事项
- 发送消息时必须指定
parse_mode='HTML',否则Telegram不会将文本渲染为可点击链接。 - 必须对用户全名做HTML转义(用
html.escape),防止名称中的<、>、&等字符破坏消息结构,导致链接不渲染。
内容的提问来源于stack exchange,提问作者Abdurahim Joramurodov




