Telethon实现未对话新私信自动回复遇代码错误,求解决方案
解决Telethon自动回复新私信的代码错误问题
第一次代码错误分析
第一次代码中,@client.on(events.NewMessage(incoming=True, blacklist_chats=True)) 装饰器被错误应用在setup()函数上,导致该函数被当作消息事件处理器。而Telethon的事件处理器必须接收event参数,因此触发TypeError: setup() takes 0 positional arguments but 1 was given。
同时,users集合是setup()内部变量,外部的handler()无法访问,即便装饰器位置正确,也会出现变量未定义问题。
第二次代码错误分析
第二次代码修正了装饰器位置,但setup()函数从未被调用,导致全局变量users从未初始化。当收到消息触发handler()时,自然会抛出NameError: name 'users' is not defined。
正确实现代码
要实现“自动回复此前未对话用户的新私信”,需要:
- 在客户端启动后立即执行
setup(),初始化已对话用户集合 - 确保
users集合能被事件处理器访问 - 回复新用户后,将其加入集合(避免重复回复)
完整代码如下:
from telethon import TelegramClient, events api_id = 123456 api_hash = 'enterownapihash' msg = 'Sorry, I am unavailable right now.' client = TelegramClient('automessage', api_id, api_hash, sequential_updates=True) users = set() # 全局初始化集合 async def setup(): global users async for dialog in client.iter_dialogs(): # 排除机器人,只记录真实用户 if dialog.is_user and not dialog.entity.bot: users.add(dialog.id) @client.on(events.NewMessage(incoming=True)) async def handler(event): global users # 仅处理私信,且发信人不在已对话列表中 if event.is_private and not event.sender.bot and event.sender_id not in users: await event.respond(msg) users.add(event.sender_id) # 回复后加入集合,避免重复回复 async def main(): await client.start() await setup() # 启动后执行初始化 await client.run_until_disconnected() if __name__ == "__main__": import asyncio asyncio.run(main())
关键修正点
- 全局初始化
users集合,避免未定义错误 - 使用
main()函数统一管理客户端启动和初始化流程,确保setup()在客户端连接后执行 - 回复新用户后,将其ID加入
users集合,防止重复发送自动回复 - 增加排除机器人的判断,避免回复机器人消息
内容的提问来源于stack exchange,提问作者Matt Klein
相关产品推荐
相关产品推荐

