You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Telethon监听Telegram公开频道新消息无响应问题排查

问题分析与修复

你的代码存在几个关键问题导致无法捕获频道新消息:

  1. 缩进错误:事件处理器my_event_handler的核心逻辑(获取发送者、判断频道、打印消息)被写在了函数外部,这部分代码永远不会被执行,甚至会引发语法错误。
  2. 冗余操作:当新消息事件触发时,event对象已经包含了当前的新消息内容,不需要再调用iter_messages去获取频道最后一条消息。
  3. 未过滤监听范围:当前事件监听所有新消息,最好直接指定目标频道,避免无意义的判断。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:33:27