如何修改Telethon脚本实现读取指定频道内全部消息
解决Telethon只能读取自身/提及消息的问题
你的问题核心在于使用bot token登录Telethon——Telegram的官方bot账号在频道中默认只能接收@它的消息、命令消息,或是自己发送的内容,无法直接获取频道内所有普通消息。要实现读取频道全部消息,有两种可行方案:
方案一:使用用户账号会话登录(推荐)
这种方式只要你的个人账号是目标频道的成员(无需管理员权限),就能获取所有消息。步骤如下:
- 移除代码中的
bot_token,改用用户账号登录:
from telethon import TelegramClient, events api_id = 242... # 替换为你的api_id api_hash = '8a06ca620417c9964a058e0dc...' # 替换为你的api_hash channelId = -36744... # 目标频道ID # 初始化客户端,'user_session'是会话文件名称,首次运行会提示输入手机号和验证码 client = TelegramClient('user_session', api_id, api_hash) @client.on(events.NewMessage(chats=[channelId])) async def my_event_handler(event): # 现在可以获取所有频道消息了 print(f"消息内容: {event.text}") print(f"发送者: {await event.get_sender()}") # 可选:获取发送者信息 async def main(): await client.start() # 首次运行会引导你完成登录 await client.run_until_disconnected() if __name__ == '__main__': import asyncio asyncio.run(main())
- 首次运行脚本时,Telethon会提示你输入手机号和Telegram收到的验证码,完成后会生成一个
user_session.session文件,后续运行无需重复验证。
方案二:将Bot设置为频道管理员(限可管理的频道)
如果必须使用bot账号,需要把bot添加为目标频道的管理员,并开启**"读取消息"**权限:
- 打开频道设置 → 管理员 → 添加你的bot
- 给bot勾选"读取消息"(以及你需要的其他权限)
- 修改代码保持bot登录,但确保频道权限正确:
from telethon import TelegramClient, events api_id = 242... api_hash = '8a06ca620417c9964a058e0dc...' bot_token = '1474729480:AAEhUPmVX_m...' channelId = -36744... client = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token) @client.on(events.NewMessage(chats=[channelId])) async def my_event_handler(event): text = event.text print(text) client.run_until_disconnected()
注意:这种方式依赖频道管理员权限,部分公共频道可能不允许添加bot为管理员,因此方案一更通用。
额外提示
- 确保你的api_id和api_hash是从Telegram开发者平台正确获取的,不要泄露给他人。
- 如果需要读取历史消息(不是实时新消息),可以使用
client.get_messages(channelId, limit=100)方法批量获取历史内容。
内容的提问来源于stack exchange,提问作者fbathrrr




