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

如何让Telegram Python机器人通过@用户名获取用户头像或ID

解决Telegram Python机器人兼容所有用户提及的方案

你的问题核心是:mention类型(带@用户名的提及)无法直接拿到user对象,而text_mention类型(直接选择用户的提及)可以。要兼容所有用户,需要分别处理这两种提及类型:

两种提及类型的差异

  • text_mention:用户输入时直接选择通讯录中的用户,实体自带完整的user对象,无论对方有没有公开用户名都能直接获取ID和头像信息。
  • mention:用户手动输入@用户名,实体只包含用户名文本,需要通过Telegram API根据用户名查询用户信息。

修改后的完整代码

entities = message.parse_entities()

if not entities:
    return

for entity in entities:
    if entity.type not in {"mention", "text_mention"}:
        continue

    user = None
    # 处理直接选择用户的提及(text_mention)
    if entity.type == "text_mention":
        user = entity.user
    # 处理手动输入@用户名的提及(mention)
    elif entity.type == "mention":
        # 提取用户名,去掉开头的@符号
        username = message.text[entity.offset : entity.offset + entity.length][1:]
        try:
            # 通过用户名调用API获取用户信息
            user = bot.get_user(username=username)
        except Exception as e:
            print(f">>> 获取用户失败: {str(e)}")
            continue

    if not user:
        print(">>> user not found")
        continue

    # 输出用户ID和名称
    print(f">>> 用户ID: {user.id},名称: {user.first_name}")
    
    # 获取用户头像(可选)
    profile_photos = bot.get_user_profile_photos(user_id=user.id, limit=1)
    if profile_photos.total_count > 0:
        # 取分辨率最高的头像(photos数组最后一个元素)
        highest_res_photo = profile_photos.photos[0][-1]
        print(f">>> 用户头像File ID: {highest_res_photo.file_id}")

关键说明

  1. mention类型处理:通过message.text结合实体的offset和length提取用户名,去掉开头的@后调用get_user接口获取用户对象。
  2. 异常处理:调用API时增加异常捕获,避免因用户名不存在或API调用失败导致程序崩溃。
  3. 头像获取:使用get_user_profile_photos接口,返回的photos数组中每个子数组按分辨率从低到高排序,取最后一个元素即为最高清的头像。

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:12:38