Telegram Bot无法扫描全部聊天成员问题排查与解决请求
问题:Telegram Bot执行/activate命令时无法扫描群成员
我想给Telegram Bot添加功能:触发/activate命令后立即扫描当前聊天的所有成员,并将成员信息保存到user_data中,但运行代码时出现错误,无法完成激活。
原代码
user_data = {} with open('languages.json', 'r', encoding='utf-8') as file: translations = json.load(file)["translations"] async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.message.from_user.id if user_id not in user_data: user_data[user_id] = { 'selected_artists': [], 'language': 'ru' } await update.message.reply_text(get_translation(user_id, 'start')) async def activate(update: Update, context: CallbackContext): chat_id = update.message.chat_id # 检查用户是否为管理员 user_status = await context.bot.get_chat_member(chat_id, update.message.from_user.id) if user_status.status not in ['administrator', 'creator']: await update.message.reply_text("Only administrators can use this command.") return # 尝试获取所有群成员(出错的地方) chat_members = await context.bot.get_chat_members(chat_id) # 保存成员到user_data if 'chat_users' not in user_data: user_data['chat_users'] = {} for member in chat_members: user_data['chat_users'][member.user.id] = chat_id await update.message.reply_text("Bot has been activated for all users in this chat.")
错误信息
No error handlers are registered, logging exception. Traceback (most recent call last): File "C\Users\Dmitri\AppData\Local\Programs\Python\Python312\Lib\site-packages\telegram\ext\_application.py", line 1325, in process_update await coroutine File "C\Users\Dmitri\AppData\Local\Programs\Python\Python312\Lib\site-packages\telegram\ext\_handlers\basehandler.py", line 157, in handle_update return await self.callback(update, context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Dmitri\Desktop\telegrambot\ChartMakerTop.py", line 44, in activate chat_members = await context.bot.get_chat_members(chat_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'ExtBot' object has no attribute 'get_chat_members'. Did you mean: 'get_chat_member'?
解决方案
错误原因是python-telegram-bot库中不存在get_chat_members方法,批量获取群成员需要使用异步迭代器iter_chat_members,同时遍历成员时要使用async for语法。另外需要确保Bot在群聊中拥有「查看成员」的权限。
修改后的activate函数代码:
async def activate(update: Update, context: CallbackContext): chat_id = update.message.chat_id # 检查用户是否为管理员 user_status = await context.bot.get_chat_member(chat_id, update.message.from_user.id) if user_status.status not in ['administrator', 'creator']: await update.message.reply_text("Only administrators can use this command.") return # 使用异步迭代器遍历所有群成员 if 'chat_users' not in user_data: user_data['chat_users'] = {} try: async for member in context.bot.iter_chat_members(chat_id): # 调整存储结构:按用户ID关联所在群聊ID(支持用户在多个群) if member.user.id not in user_data['chat_users']: user_data['chat_users'][member.user.id] = [] user_data['chat_users'][member.user.id].append(chat_id) await update.message.reply_text("Bot has been activated for all users in this chat.") except telegram.error.Forbidden: await update.message.reply_text("Bot does not have permission to view chat members.")
修改说明
- 替换
get_chat_members为iter_chat_members,这是python-telegram-bot v13+版本中批量获取群成员的正确方法,返回异步迭代器。 - 使用
async for循环遍历成员,符合异步语法要求。 - 增加了权限异常捕获,如果Bot没有查看成员的权限,会返回提示信息。
- 优化了user_data的存储结构:一个用户可能加入多个群,所以将用户ID对应的群聊ID改为列表形式,更合理。
内容的提问来源于stack exchange,提问作者Dmitri
相关产品推荐
相关产品推荐

