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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:18:37