如何在Pyrogram中通过MessageEntityType枚举提取手机号?
问题:Pyrogram无法提取群组消息中的手机号
我出于学习Pyrogram工作原理的目的,尝试从Telegram群组消息中提取手机号。此前用类似方法提取URL成功,代码如下:
def main(): with app: messages = app.get_chat_history(group_url) for message in messages: if message.entities: for entity in message.entities: if entity.url: print(entity.url) main()
但提取手机号时无法成功,尝试的代码如下:
def main(): with app: messages = app.get_chat_history(group_url, limit=100) for message in messages: if message.entities: for entity in message.entities: if entity.type=='MessageEntityType.PHONE_NUMBER': print(message.text) main()
期望输出类似74659000976的手机号,但无报错却始终无法进入if分支。已知entity.type的类型是<enum 'MessageEntityType'>,对应消息片段的结构为:
"text": "73455300000", "entities": [ { "_": "MessageEntity", "type": "MessageEntityType.PHONE_NUMBER", "offset": 0, "length": 11 } ]
解决方案
问题核心在于两点:
- 未导入枚举类:
MessageEntityType是Pyrogram中的枚举类型,必须先导入才能正确调用; - 错误的比较方式:
entity.type是枚举实例,不能直接和字符串'MessageEntityType.PHONE_NUMBER'做相等判断,需要用枚举类的属性匹配。
修正后的完整代码:
from pyrogram.enums import MessageEntityType def main(): with app: messages = app.get_chat_history(group_url, limit=100) for message in messages: if message.entities: for entity in message.entities: if entity.type == MessageEntityType.PHONE_NUMBER: # 通过offset和length精准截取手机号 phone_number = message.text[entity.offset : entity.offset + entity.length] print(phone_number) main()
补充说明:直接输出message.text可能会包含消息中的其他无关内容,利用实体的offset(起始位置)和length(长度)截取,能精准提取出目标手机号。
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

