Python Telethon机器人aiter错误:TotalList无法用async for迭代
问题分析与解决
你的代码存在两个核心问题:
await bot.get_participants()返回的是同步可迭代的TotalList对象,不需要用async for,直接用普通for循环遍历即可,这是触发报错的直接原因。bot.iter_participants()返回的是异步迭代器,无法直接用user in admins判断成员是否为管理员——同步的in操作无法处理异步迭代器,且这种方式效率极低。
修正后的代码
# 获取所有群成员(已通过await拿到完整列表,直接用普通for遍历) all_participants = await bot.get_participants(group, aggressive=False) # 先把所有管理员的ID收集到集合中(集合查询效率远高于列表) admin_ids = set() async for admin in bot.iter_participants(group, filter=ChannelParticipantsAdmins): admin_ids.add(admin.id) print('[+] Banno gli utenti...') # 用普通for循环遍历所有成员 for user in all_participants: # 通过ID快速判断是否为管理员 if user.id not in admin_ids: # 在这里编写你的清理逻辑,比如踢除非管理员 # await bot.kick_participant(group, user) pass
关键改动说明
- 替换
async for为普通for:get_participants通过await已经获取了完整的成员列表,是同步可迭代对象,无需异步循环。 - 预存管理员ID到集合:异步遍历管理员迭代器,将管理员ID存入集合后,用
user.id not in admin_ids做快速判断——集合的in操作时间复杂度为O(1),既解决了异步迭代器无法直接判断的问题,又提升了查询效率。
内容的提问来源于stack exchange,提问作者ElToreador
相关产品推荐
相关产品推荐

