如何让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}")
关键说明
- mention类型处理:通过
message.text结合实体的offset和length提取用户名,去掉开头的@后调用get_user接口获取用户对象。 - 异常处理:调用API时增加异常捕获,避免因用户名不存在或API调用失败导致程序崩溃。
- 头像获取:使用
get_user_profile_photos接口,返回的photos数组中每个子数组按分辨率从低到高排序,取最后一个元素即为最高清的头像。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

