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

如何在Telethon中检测账号撤销事件并获知离线状态?

这是个很实用的问题!在Telethon里处理账号被其他设备登录导致当前客户端下线的场景,主要有两种可靠的方式,我帮你梳理清楚:

1. 优先选择:监听内置的UserLoggedOut事件

Telethon 内置了专门的events.UserLoggedOut事件,当你的当前客户端会话被其他设备登录撤销时,Telegram服务器会主动推送这个事件给客户端,让你能实时获知自己已离线,完全不需要主动轮询。

直接上代码示例:

from telethon import TelegramClient, events

async def main():
    # 替换成你的api_id、api_hash和会话名称
    client = TelegramClient('my_session', 12345, 'abcdef1234567890')
    await client.start()

    @client.on(events.UserLoggedOut)
    async def on_logout(event):
        print("⚠️ 注意:你的账号已在其他设备登录,当前客户端已被强制下线!")
        # 这里可以添加自定义处理逻辑,比如清理本地会话文件、弹出提示等

    await client.run_until_disconnected()

if __name__ == '__main__':
    import asyncio
    asyncio.run(main())

这种方式的优势是实时性强、资源消耗低,是Telethon官方推荐的处理方式。

2. 兜底方案:周期性检查会话有效性

如果担心极端情况下事件推送丢失(比如客户端临时断网没收到服务器推送),可以用周期性检查的方式兜底。核心是调用client.get_me()方法——当会话已被撤销时,这个调用会抛出AuthKeyUnregisteredError异常,据此判断会话失效。

代码示例如下:

from telethon import TelegramClient, errors
import asyncio

async def session_health_check(client):
    while True:
        try:
            # 尝试获取当前用户信息,验证会话有效性
            await client.get_me()
            print("✅ 会话状态正常")
        except errors.AuthKeyUnregisteredError:
            print("⚠️ 会话已被撤销,当前客户端已离线!")
            # 这里可以添加后续处理,比如终止程序、触发重新登录流程等
            break
        # 每隔30秒检查一次,可根据需求调整间隔时长
        await asyncio.sleep(30)

async def main():
    client = TelegramClient('my_session', 12345, 'abcdef1234567890')
    await client.start()

    # 启动后台检查任务
    asyncio.create_task(session_health_check(client))

    await client.run_until_disconnected()

if __name__ == '__main__':
    asyncio.run(main())

这里的client.get_me()底层调用的是Telegram API的users.getMe端点,是最直接验证会话有效性的方式。

总结建议

  • 日常开发优先用事件监听的方式,实时高效;
  • 周期性检查适合作为稳定性兜底,比如在对在线状态要求极高的场景下配合使用。

内容的提问来源于stack exchange,提问作者Mayank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:27:35