Telethon库向多用户名发消息报错求助:协程未等待及空用户
Telethon批量发消息问题解决
核心问题
- 协程未等待:Telethon的
send_message、get_dialogs都是异步方法,必须用await调用,且方法要定义为async - 客户端未启动:原代码中
send_message创建了客户端但没调用start(),也未在异步上下文执行 - 无效用户处理:用户列表包含
None值,导致无效发送请求 - 重复创建客户端:
login和send_message分别初始化客户端,造成资源浪费
修复后代码
from telethon import TelegramClient from login import API_ID, API_HASH import asyncio class Telegram: def __init__(self, message, username1, username2=None, username3=None) -> None: self.message = message # 过滤空用户名,只保留有效目标 self.target_users = [user for user in [username1, username2, username3] if user] # 统一初始化客户端 self.client = TelegramClient('userBot', API_ID, API_HASH) async def send_messages(self): await self.client.start() try: for user in self.target_users: await self.client.send_message(user, self.message) print(f'消息已发送给 {user}') finally: # 确保客户端断开连接 await self.client.disconnect() # 执行异步任务 if __name__ == "__main__": bot = Telegram('aled', 'Wo') asyncio.run(bot.send_messages())
关键修改说明
- 把发送方法改成异步(加
async关键字),所有Telethon异步操作前添加await - 初始化时过滤掉空用户名,避免向无效目标发送消息
- 客户端在
__init__中仅创建一次,复用实例减少资源消耗 - 用
asyncio.run()执行异步方法,替代原有的run_until_disconnected()(更适合单次发送场景) - 用
try...finally保证发送完成后断开客户端,释放资源
注意事项
- 确保
login.py里的API_ID和API_HASH是从Telegram官方平台申请的有效值 - 首次运行会要求输入手机号和验证码登录,登录状态会保存在
userBot.session文件中,后续运行无需重复验证
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

