Telethon中client.on(events.NewMessage())与events.register(events.NewMessage())的区别
Telethon中
client.on()与events.register()的事件注册差异 1. 绑定对象与作用范围
client.on()是实例绑定型:处理函数直接关联到特定的TelegramClient实例,只有该实例接收到符合条件的消息时,才会触发对应的处理逻辑。多Client实例场景下,彼此的client.on()事件完全独立,互不干扰。events.register()是全局通用型:处理函数默认全局注册,所有后续启动的Client实例(开启事件循环后)都会触发该函数。也可通过client.add_event_handler()手动将其绑定到指定Client,灵活控制作用范围。
2. 使用语法与灵活性
client.on()的典型用法
仅能通过装饰器或直接调用的方式,绑定到已创建的Client实例:
from telethon import TelegramClient, events client = TelegramClient('my_session', API_ID, API_HASH) # 装饰器写法 @client.on(events.NewMessage(chats='my_private_chat')) async def private_chat_handler(event): await event.reply("Received via client.on!") # 直接调用写法 def another_handler(event): print("Another handler triggered") client.on(events.NewMessage())(another_handler)
events.register()的典型用法
支持先定义全局处理函数,再灵活绑定到不同Client:
from telethon import TelegramClient, events # 定义全局处理函数 @events.register(events.NewMessage(chats='group_chat')) async def group_handler(event): await event.reply(f"Received from session: {event.client.session.filename}!") # 方式1:让所有Client实例触发 client1 = TelegramClient('session1', API_ID, API_HASH) client2 = TelegramClient('session2', API_ID, API_HASH) # 方式2:仅绑定到指定Client client3 = TelegramClient('session3', API_ID, API_HASH) client3.add_event_handler(group_handler, events.NewMessage(chats='group_chat'))
3. 复用性与管理成本
client.on()的处理函数复用性低:若要让同一逻辑作用于多个Client,需重复对每个Client实例执行client.on()装饰或绑定操作。events.register()的处理函数复用性高:只需定义一次,就能轻松关联到任意数量的Client实例,也可通过client.remove_event_handler()动态从指定Client上移除。
4. 事件区分逻辑
- 使用
client.on()时,无需在处理函数中区分Client实例,因为逻辑本身就属于特定Client。 - 使用全局注册的
events.register()时,若多个Client共用同一处理函数,需通过event.client属性区分消息来自哪个Client,避免逻辑混乱。
内容的提问来源于stack exchange,提问作者mudit jain
相关产品推荐
相关产品推荐

