Telegram Bot移除群组已注销账号方案求助
解决Telegram Bot获取群成员并移除已注销账号的问题
Telegram Bot API确实移除了旧的无参数get_chat_members方法,现在需要通过分页请求来获取所有群成员。以下是针对你代码的修改方案:
核心修改点
- 用分页循环调用
context.bot.get_chat_members,每次获取固定数量的成员(最大限制为200) - 合并重复定义的
remove函数,同时实现计数和踢人逻辑 - 增强已注销账号的判断逻辑,避免遗漏
修改后的完整代码
from telegram import Update from telegram.ext import Updater, CommandHandler, CallbackContext from telegram.ext.jobqueue import Days # 初始化Bot updater = Updater(token="bot_token", use_context=True) dispatcher = updater.dispatcher # /start命令处理器 def start(update: Update, context: CallbackContext): context.bot.send_message( chat_id=update.effective_chat.id, text="Hello! I am RDA_bot, a bot that removes deleted accounts from a Telegram group." ) # /remove命令处理器(合并计数与踢人逻辑) def remove(update: Update, context: CallbackContext): chat_id = update.effective_chat.id if update else context.job.context.id deleted_accounts = 0 offset = 0 limit = 200 # Telegram API单次最大返回成员数 while True: try: # 分页获取群成员 members = context.bot.get_chat_members(chat_id=chat_id, offset=offset, limit=limit) if not members: break # 没有更多成员,退出循环 # 遍历成员并处理已注销账号 for member in members: user = member.user # 判断账号是否已注销:is_deleted标记 + 辅助判断 if user.is_deleted or (user.first_name == "Deleted Account" and not user.username): context.bot.kick_chat_member(chat_id=chat_id, user_id=user.id, until_date=0) deleted_accounts += 1 offset += limit # 更新偏移量,获取下一页 except Exception as e: print(f"获取成员时出错: {e}") break # 发送结果通知(仅在手动调用时发送) if update: context.bot.send_message( chat_id=chat_id, text=f"已移除 {deleted_accounts} 个已注销账号" ) # 定时任务:每天自动执行一次移除操作 job_queue = updater.job_queue job_queue.run_repeating( lambda context: remove(None, context), interval=Days(1), first=0, context={"chat_id": "你的群组ID"} # 替换为目标群组ID ) # 注册命令处理器 dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("remove", remove)) # 启动Bot updater.start_polling() updater.idle()
关键说明
- 分页获取成员:通过
offset和limit参数循环请求,直到返回的成员列表为空,确保获取到所有群成员。 - 注销账号判断:除了依赖
user.is_deleted,额外检查用户名是否为空且昵称是"Deleted Account",提升判断准确性。 - 定时任务适配:为定时任务补充群组ID参数,避免因缺少
update对象导致无法获取聊天ID。 - 异常处理:添加异常捕获,避免因API限制或网络问题导致程序崩溃。
内容的提问来源于stack exchange,提问作者Daisha
相关产品推荐
相关产品推荐

