Telethon如何正确监听用户发送的位置消息?现有实现是否有更优方案
Telethon 监听位置消息的实现方案
你当前通过isinstance(e.media, MessageMediaGeo)过滤位置消息的实现是完全正确的,这也是Telethon生态中处理位置类消息的标准实现方案。如果你需要更简洁的写法,或扩展支持更多位置类消息,可以参考以下优化方案:
简化实现方案
- 直接使用
Message对象内置的geo属性判断,无需额外导入MessageMediaGeo类,代码更简洁:
@bot.on(events.NewMessage(func=lambda e: e.geo is not None)) async def process_location(event: events.NewMessage.Event): # event.geo 直接返回位置对象,等价于原写法的 event.media geo_data = event.geo lat = geo_data.lat lon = geo_data.long ...
- 若需要同时监听普通静态位置和实时共享位置,调整过滤器即可匹配两类消息:
from telethon.tl.types import MessageMediaGeo, MessageMediaGeoLive @bot.on(events.NewMessage(func=lambda e: isinstance(e.media, (MessageMediaGeo, MessageMediaGeoLive)))) async def process_all_geo_messages(event: events.NewMessage.Event): # 可通过type判断消息类型做不同处理 if isinstance(event.media, MessageMediaGeoLive): # 处理实时位置逻辑 ... else: # 处理静态位置逻辑 ...
额外优化建议
- 如果仅需要处理用户通过你发送的位置请求按钮提交的位置,可额外添加会话状态判断,避免误处理用户在其他聊天场景下发送的位置消息。
- 经纬度数据可直接从
event.geo.lat、event.geo.long属性取值,无需额外解析媒体对象。
内容的提问来源于stack exchange,提问作者Yevhen Kuzmovych
相关产品推荐
相关产品推荐

