无法将Bot加入Telegram私有群组时如何通过Python获取群消息更新?
可行方案:使用Telegram用户客户端API(而非Bot API)
常规的Bot API确实要求Bot加入对应群组才能获取消息推送,你可以改用MTProto用户API实现需求,该方案通过你已加入群组的个人Telegram账号授权调用接口,无需将Bot加入目标群组即可监听、拉取群内消息,可完全用Python实现。
推荐依赖库
- 你可以选择
Pyrogram或Telethon两个成熟的Python库,二者都封装了Telegram原生MTProto协议,无需自己处理底层通信逻辑。
实现步骤(以Telethon为例)
- 申请API凭据:前往Telegram官方API申请页面,用你自己的Telegram账号登录,创建一个个人应用即可获取专属的
api_id和api_hash,这两个是调用接口的必要凭证。 - 安装依赖:执行命令
pip install telethon完成库安装。 - 实时消息监听示例代码:
from telethon import TelegramClient, events # 替换为你自己的api_id、api_hash、绑定账号的手机号(带国际区号,中国区号码前缀为+86) api_id = 123456 api_hash = "替换为你的api_hash字符串" phone = "+8613xxxxxxxxx" # 替换为目标私有群组的ID,可通过下方的群列表查询代码获取 TARGET_GROUP_ID = -100xxxxxxxxx client = TelegramClient("my_session", api_id, api_hash) @client.on(events.NewMessage()) async def handle_new_message(event): # 校验消息是否来自目标群组 chat = await event.get_chat() if chat.id != TARGET_GROUP_ID: return # 以下为自定义业务逻辑,可修改为存储、转发等操作 print(f"收到新消息:{event.text}") # 可按需获取发送者信息、媒体附件等内容 sender = await event.get_sender() print(f"发送者昵称:{sender.first_name},发送者ID:{sender.id}") if __name__ == "__main__": client.start(phone) print("消息监听已启动") client.run_until_disconnected()
辅助工具代码
你可以运行以下代码打印你账号加入的所有群组的名称和ID,快速获取目标私有群组的ID:
from telethon import TelegramClient api_id = 123456 api_hash = "替换为你的api_hash字符串" phone = "+8613xxxxxxxxx" client = TelegramClient("my_session", api_id, api_hash) async def get_all_groups(): async for dialog in client.iter_dialogs(): if dialog.is_group: print(f"群名称:{dialog.name},群ID:{dialog.id}") if __name__ == "__main__": with client: client.loop.run_until_complete(get_all_groups())
注意事项
- 首次运行代码需要输入手机号收到的短信验证码,若账号开启了两步验证还需要输入账号密码,登录成功后会在本地生成session缓存文件,后续运行无需重复验证。
- 该方案模拟你个人账号的正常使用行为,只要遵守Telegram的用户协议,不短时间高频调用接口、不发送违规内容,不会出现账号封禁问题。
- 你可以按需扩展逻辑,比如将消息同步到数据库、转发到其他渠道、触发指定业务动作等。
内容的提问来源于stack exchange,提问作者durdenk
相关产品推荐
相关产品推荐

