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

如何修复Telethon中Lock.__init__()意外收到'loop'参数的TypeError?

问题:Telethon启动时触发Lock初始化错误

基于Python 3.10使用Telethon库开发Telegram用户在线状态追踪程序,启动时触发如下错误:

TypeError: Lock.__init__() got an unexpected keyword argument 'loop'

已更新所有pip依赖,但问题仍未解决。程序代码及报错堆栈如下:

程序代码

from telethon import TelegramClient
from telethon.tl.types import UserStatusOnline
from datetime import datetime
from time import sleep

API_ID = 12345678 
API_HASH = '123456789'

USERNAMES = [
    'your_username'
]

PAIRS = [
]

TRACK_FREQUENCY = 5

client = TelegramClient('bot', API_ID, API_HASH)


async def main():
    while True:
        online = []
        offline = []

        for i in USERNAMES:
            entity = await client.get_entity(i)
            name = entity.first_name + ' ' + entity.last_name
            if isinstance(entity.status, UserStatusOnline):
                # print if user tracked is online
                print('[' + datetime.now().isoformat() + ']: ' + name + ' в онлайне!')
                online.append(entity.username)
            else:
                offline.append(entity.username)

        for u in PAIRS:
            # check if both users in the given pair are online right now
            if u[0] in online and u[1] in online:
                print('[' + datetime.now().isoformat() + ']: ' + u[0] + ' и ' + u[1] + ' оба сейчас находятся в онлайне!')
            elif u[0] in offline and u[1] in offline:
                print('[' + datetime.now().isoformat() + ']: ' + u[0] + ' и ' + u[1] + ' оба сейчас находятся в офлайне!')

        sleep(TRACK_FREQUENCY)

if __name__ == "__main__":
    print("Трекер начал работу...")
    client.start()
    print("Трекер успешно подключился к Telegram'у!")
    with client:
        client.loop.run_until_complete(main())

报错堆栈

Traceback (most recent call last):
  File "/workspaces/TG_Online_Tracker1/main.py", line 29, in <module>
    client = TelegramClient('bot', API_ID, API_HASH)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.local/lib/python3.12/site-packages/telethon/client/telegrambaseclient.py", line 302, in __init__
    self._sender = MTProtoSender(
                   ^^^^^^^^^^^^^^
  File "/home/codespace/.local/lib/python3.12/site-packages/telethon/network/mtprotosender.py", line 58, in __init__
    self._connect_lock = asyncio.Lock(loop=loop)
                         ^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Lock.__init__() got an unexpected keyword argument 'loop'

原因分析

错误源于Telethon版本与Python运行环境不兼容:

  • 报错路径显示依赖安装在Python3.12的site-packages目录下,说明实际运行环境是Python3.12,而非预期的3.10。
  • 新版Python(3.12+)的asyncio库中,Lock类的构造函数已移除loop参数,但当前安装的Telethon版本仍在使用asyncio.Lock(loop=loop)的旧写法。

解决方案

方案1:安装适配Python3.12的Telethon开发版

执行以下命令安装Telethon的最新开发分支,该分支已修复此兼容性问题:

pip install git+https://github.com/LonamiWebs/Telethon.git

方案2:降级Python版本到3.11及以下

若不想使用开发版,可将Python版本降级至3.11或更低,这些版本的asyncio仍支持Lock(loop=loop)的写法,与旧版Telethon兼容。

额外优化:替换同步sleep为异步sleep

原代码中main函数是异步函数,但使用time.sleep()会阻塞事件循环,建议替换为asyncio的异步sleep:

  1. 添加asyncio导入:
import asyncio
  1. 替换sleep(TRACK_FREQUENCY)为:
await asyncio.sleep(TRACK_FREQUENCY)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:52:28