使用Telethon监听Telegram公开频道新消息无响应问题排查
问题分析与修复
你的代码存在几个关键问题导致无法捕获频道新消息:
- 缩进错误:事件处理器
my_event_handler的核心逻辑(获取发送者、判断频道、打印消息)被写在了函数外部,这部分代码永远不会被执行,甚至会引发语法错误。 - 冗余操作:当新消息事件触发时,
event对象已经包含了当前的新消息内容,不需要再调用iter_messages去获取频道最后一条消息。 - 未过滤监听范围:当前事件监听所有新消息,最好直接指定目标频道,避免无意义的判断。
修正后的代码
import configparser import asyncio from telethon import TelegramClient, events # 读取配置 config = configparser.ConfigParser() config.read("config.ini") # 设置配置参数 api_id = int(config['Telegram']['api_id']) api_hash = str(config['Telegram']['api_hash']) phone = config['Telegram']['phone'] # 目标公开频道列表(注意是不带@的用户名) channels_list = ["channel1", "channel2"] async def main(): client = TelegramClient('session_name', api_id, api_hash) await client.start(phone) # 直接监听目标频道的新消息 @client.on(events.NewMessage(chats=channels_list)) async def my_event_handler(event): # 直接打印新消息文本 print(f"来自频道@{event.chat.username}的新消息:") print(event.text) print("Listening...") await client.run_until_disconnected() if __name__ == '__main__': asyncio.run(main())
关键修改说明
- 缩进修复:把所有事件处理逻辑放到
my_event_handler函数内部,确保事件触发时能执行。 - 指定监听频道:在
events.NewMessage()中传入chats=channels_list,只监听目标频道的新消息,无需额外判断发送者。 - 直接使用事件消息:通过
event.text直接获取新消息内容,省去不必要的iter_messages调用。 - 简化异步运行:用
asyncio.run()替代手动获取事件循环,更符合Python 3.7+的异步规范。
内容的提问来源于stack exchange,提问作者JayJona
相关产品推荐
相关产品推荐

