基于Telethon的监听程序在AWS实例上无法响应Telegram新消息
问题原因
你遇到的问题主要有以下几个可能性,按优先级从高到低排序:
- 代码逻辑错误:首先你代码里有两处严重的语法/逻辑问题,本地能运行大概率是你本地测试版本和部署版本不一致:
- 变量名不匹配:你初始化的Telegram客户端实例名为
bot,但后续注册事件监听、启动客户端用的是未定义的client变量 - 错误使用上下文管理器:
with bot:块执行结束后会自动断开Telegram客户端连接,你打印完bot-start后客户端已经下线,自然收不到任何消息
- 变量名不匹配:你初始化的Telegram客户端实例名为
- 网络连通性问题:Telegram服务在很多AWS机房的默认IP段被封禁,你本地能正常访问不代表AWS Ubuntu实例可以和Telegram服务器建立稳定的长连接,即使启动阶段能打印日志,后续的事件推送长连接也可能被拦截
- 权限/参数解析问题:
- 你的Telegram Bot没有被加入目标频道,或没有被授予读取频道消息的管理员权限
- 你用的
ChannelURL参数无法被部署环境的客户端正常解析为频道ID,导致监听逻辑没有绑定到正确的目标
- 会话文件问题:Telethon生成的
bot.session会话文件和运行环境绑定,你直接复制本地的会话文件到AWS实例会失效,导致客户端看起来启动成功但实际未完成登录认证
排查解决步骤
- 先修正代码错误,调整后的可用代码参考:
import tweepy from telethon import TelegramClient, events # 请补全所有参数的实际值 api_id = 替换为你的API_ID api_hash = "替换为你的API_HASH" bot_token = "替换为你的BOT_TOKEN" ChannelID = 替换为目标频道的数字ID(推荐用ID而非链接,避免解析失败) twitter_api_key = "替换为你的Twitter API Key" twitter_api_secret = "替换为你的Twitter API Secret" twitter_access_token = "替换为你的Twitter Access Token" twitter_access_secret = "替换为你的Twitter Access Secret" # 初始化Twitter客户端 auth = tweepy.OAuthHandler(twitter_api_key, twitter_api_secret) auth.set_access_token(twitter_access_token, twitter_access_secret) twitter_api = tweepy.API(auth) print("start") # 初始化Telegram客户端,统一变量名 client = TelegramClient("bot", api_id, api_hash) # 注册消息监听事件 @client.on(events.NewMessage(chats=ChannelID)) async def newmessagelistener(event): print("action detected") # 此处补充你生成推文、发布的逻辑 # 启动客户端并保持运行 client.start(bot_token=bot_token) print("bot-start") client.run_until_disconnected()
- 测试AWS实例网络连通性,在实例命令行执行
curl -v https://api.telegram.org,如果返回连接超时/被拒,说明IP被封禁,需要给实例配置出口代理,或更换AWS其他区域的实例 - 确认Telegram Bot权限:将Bot添加为目标频道的管理员,开启「读取消息历史」权限,同时用数字ID替代链接格式的频道参数,频道数字ID可通过Telegram公开的ID查询Bot获取
- 删除部署目录下的
bot.session文件,重新运行代码,确认是否有认证相关的报错,按提示完成Bot的登录认证 - 如仍未解决,在代码开头添加debug日志输出,查看具体的错误信息:
import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者CincoMariposas
相关产品推荐
相关产品推荐

