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

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.")

修改说明

  1. 替换get_chat_members为iter_chat_members,这是python-telegram-bot v13+版本中批量获取群成员的正确方法,返回异步迭代器。
  2. 使用async for循环遍历成员,符合异步语法要求。
  3. 增加了权限异常捕获,如果Bot没有查看成员的权限,会返回提示信息。
  4. 优化了user_data的存储结构:一个用户可能加入多个群,所以将用户ID对应的群聊ID改为列表形式,更合理。

内容的提问来源于stack exchange,提问作者Dmitri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:06:10