
本文详解如何使用 Pyrogram 的 MessageEntityType.PHONE_NUMBER 枚举值精准匹配并提取 Telegram 消息中的电话号码文本,避免字符串误判,并给出完整可运行示例。
本文详解如何使用 pyrogram 的 `messageentitytype.phone_number` 枚举值精准匹配并提取 telegram 消息中的电话号码文本,避免字符串误判,并给出完整可运行示例。
在 Pyrogram 中,message.entities 是一个包含 MessageEntity 对象的列表,每个对象描述了消息中某段文本的语义类型(如 URL、@用户名、电话号码等)。值得注意的是:entity.type 是一个枚举成员(enum member),而非字符串。因此,直接用 entity.type == 'MessageEntityType.PHONE_NUMBER' 这类字符串比较永远为 False——这正是初学者常踩的坑。
正确做法是:导入并使用 pyrogram.enums.MessageEntityType 枚举类进行类型判断。同时,电话号码本身并不直接存储在 entity 中,而是位于原始消息文本 message.text 的指定偏移位置上,需结合 entity.offset 和 entity.length 切片提取:
from pyrogram import Client
from pyrogram.enums import MessageEntityType # ✅ 关键:正确导入枚举
app = Client("my_account")
def main():
group_url = "your_group_username_or_id" # 替换为实际群组标识
with app:
messages = app.get_chat_history(group_url, limit=100)
for message in messages:
if message.text and message.entities: # ✅ 确保 text 存在且有 entities
for entity in message.entities:
if entity.type == MessageEntityType.PHONE_NUMBER: # ✅ 枚举值对比,非字符串
# 提取电话号码子串
phone = message.text[entity.offset : entity.offset + entity.length]
print(f"Found phone number: {phone}")
if __name__ == "__main__":
main()
? 关键注意事项:
- 必须显式导入
from pyrogram.enums import MessageEntityType,不能依赖字符串硬编码; -
entity.type是MessageEntityType枚举实例(如MessageEntityType.PHONE_NUMBER),其==比较基于枚举身份,安全可靠; - 电话号码内容需从
message.text中按offset和length截取,而非读取entity.url或其他不存在的属性; - 建议增加
if message.text判断,防止空消息或仅含媒体的消息引发IndexError; - 其他常用实体类型同理可用:
MessageEntityType.URL、MessageEntityType.MENTION、MessageEntityType.BOLD等。
掌握这一模式后,你即可系统性地解析 Telegram 消息中的各类结构化文本,为信息抽取、敏感内容监控或自动化交互打下坚实基础。










