Telegram机器人群成员解析报错修复:协程未等待问题解决
修复Telegram群成员@机器人代码及成员解析方法
错误原因
你使用的pyTelegramBotAPI(telebot库)默认message_handler装饰器不支持直接运行异步函数,即便你在函数内用了await,框架也不会主动等待协程执行,因此抛出了协程未被await的警告。
修复后的代码
import asyncio from telethon.sync import TelegramClient from telebot.async_telebot import AsyncTeleBot # 替换为你的机器人Token bot = AsyncTeleBot('YOUR_BOT_TOKEN') # 替换为你的Telegram API信息 api_id = YOUR_API_ID # 此处为数字,无需加引号 api_hash = 'YOUR_API_HASH' phone = 'YOUR_PHONE_NUMBER' # 初始化Telethon客户端 client = TelegramClient(phone, api_id, api_hash) @bot.message_handler(commands=['all']) async def mention_all(message): # 获取当前聊天ID(用ID而非标题,避免群名重复问题) chat_id = message.chat.id # 获取群内所有成员,limit=None表示获取全部 participants = await client.get_participants(chat_id, limit=None) # 拼接可@的成员内容 mention_list = [] for user in participants: # 优先使用用户名生成可点击的@格式,无用户名则用昵称 if user.username: mention_list.append(f"@{user.username}") elif user.first_name: mention_list.append(user.first_name) # 发送@成员消息 await bot.send_message(chat_id, ' '.join(mention_list)) async def main(): await client.start() await bot.polling(none_stop=True) if __name__ == '__main__': asyncio.run(main())
成员解析说明
- 获取成员列表:
client.get_participants(chat_id, limit=None)会返回群内所有成员的User对象列表,limit=None参数确保获取全部成员(默认仅返回前100个)。 - 提取成员信息:每个
User对象包含以下常用字段:username:用户的Telegram用户名(可直接生成@格式)first_name:用户的昵称last_name:用户的姓氏id:用户的唯一标识ID
- 生成可@内容:优先使用
username生成@用户名格式(支持点击跳转),若用户未设置用户名,则用first_name替代。
注意事项:
- 确保机器人已加入目标群聊,且拥有读取成员列表的权限
- 替换代码中所有大写占位符为你的实际信息
- 批量@成员可能触发Telegram限制,建议控制发送频率或分批次发送
内容的提问来源于stack exchange,提问作者user23346576
相关产品推荐
相关产品推荐

