Pyrogram多客户端在群组中不显示在线的问题求助
问题分析
你当前的代码存在几个关键问题,导致群成员列表里只有少数账号显示在线:
- 启动时仅获取一次用户状态,后续循环用的是旧值,根本触发不了
UpdateStatus请求 - 单纯调用一次
UpdateStatus无法维持群内在线状态,Telegram需要客户端保持活跃连接才能同步状态 - 所有客户端用完全相同的
app_version、device_model等标识,容易被判定为批量自动化账号,限制状态展示
解决方案
实时获取用户状态
把get_me()放到循环内部,每次检查都拉取最新状态,替换掉启动时的一次性获取:import random import asyncio from pyrogram import Client from pyrogram.raw.functions.account import UpdateStatus from pyrogram.enums import UserStatus async def openUser(session_string): app = Client( "sessions/session", session_string=session_string, api_id=API_ID, api_hash=API_HASH, in_memory=True, # 给每个客户端加唯一标识,避免批量特征 app_version=f"1.2.3_{random.randint(1000,9999)}", device_model=f"PC_{random.randint(1,10)}", system_version=f"Linux_{random.randint(1,5)}" ) await app.start() me = await app.get_me() print(f'success login user: {me.first_name}') while True: # 每次循环拉取最新状态 current_me = await app.get_me() if current_me.status == UserStatus.OFFLINE: await app.invoke(UpdateStatus(offline=False)) # 加合理延迟,避免频繁请求触发限制 await asyncio.sleep(300)维持活跃连接
Telegram的群内在线状态依赖客户端和服务器的持续心跳,单纯设置在线不够。可以在循环里加一个轻量动作模拟真实用户活跃:# 在循环内添加,比如拉取最近一个对话维持连接 await app.get_dialogs(limit=1)分散并发请求
30个客户端不要同时启动和执行操作,给每个任务加随机延迟,避免请求峰值:tasks = [] for obj in db: task = asyncio.create_task(openUser(obj["session"])) tasks.append(task) # 每个任务启动间隔1-3秒 await asyncio.sleep(random.uniform(1, 3)) await asyncio.gather(*tasks)提前养号消除限制
如果是新注册或低活跃度账号,先手动完成一些真实操作(比如发消息、加群、浏览内容),再用脚本运行,避免Telegram限制状态展示
内容的提问来源于stack exchange,提问作者Nour Eldin
相关产品推荐
相关产品推荐

