使用Telethon登录Telegram时频繁被登出的技术求助
问题原因及解决方案
你的问题核心是普通Telegram账号的单设备Session冲突:Telethon默认使用的单设备MTProto Session,和手机端官方APP的登录是互斥的——当代码通过这个Session登录时,Telegram会判定为新设备登录,强制踢掉旧的手机端会话。
解决办法
1. 改用机器人账号(推荐)
通过BotFather创建的机器人账号支持多端同时在线,不会触发设备挤登。修改登录逻辑,用Bot Token替代用户Session:
from telethon import TelegramClient, types async def get_channel_messages(chat_id, msg_id): api_id = '12345678' api_hash = '1234' # 替换为你的Bot Token,格式为「12345:ABCDEF...」 bot_token = '你的BotToken' chat_id = int(chat_id) data = {} # 使用Bot Token初始化客户端 async with TelegramClient('bot_session', api_id, api_hash).start(bot_token=bot_token) as client: channel = await client.get_entity(types.PeerChannel(chat_id)) messages = await client.get_messages(channel, limit=100, offset_id=0) # 后续业务逻辑
2. 使用多设备Session(仅针对普通用户账号)
如果必须使用个人普通账号,需要生成Telegram的多设备Session(MTProto v2),这类Session允许和手机端官方APP同时在线:
- 先生成多设备Session:
from telethon import TelegramClient from telethon.sessions import StringSession api_id = '12345678' api_hash = '1234' # 生成多设备StringSession client = TelegramClient(StringSession(), api_id, api_hash, sequential_updates=True) async def generate_session(): await client.start() print("多设备Session字符串:", client.session.save()) import asyncio asyncio.run(generate_session())
- 将生成的新Session字符串,替换你代码中原有的
session_hash即可。
额外注意事项
- 禁止重复使用同一个单设备Session在多个客户端(代码+手机)登录,这是Telegram的安全机制,必然触发挤登。
- 确保API ID/Hash和对应账号(机器人/个人账号)绑定,不要混用不同账号的API信息。
内容的提问来源于stack exchange,提问作者alt4s
相关产品推荐
相关产品推荐

