Pyrogram切换账号:遇UserBannedInChannel错误如何更换Client参数
解决Pyrogram触发UserBannedInChannel后切换账号的问题
直接修改现有Client实例的api_id、api_hash和会话名后调用reload()是行不通的——Pyrogram在初始化Client时,就已经基于这些参数建立了底层的认证连接和会话上下文,修改实例属性不会同步到内部核心逻辑,reload()仅能重新加载配置文件,无法替换已绑定的认证信息。
正确的做法是创建新的Client实例来切换账号,具体步骤如下:
- 捕获到
UserBannedInChannel错误时,先关闭当前Client实例,释放占用的资源 - 使用新的api_id、api_hash和会话名创建全新的Client对象
- 启动新的Client实例,继续执行后续业务逻辑
示例代码(同步模式)
from pyrogram import Client, errors # 初始客户端配置 SESSION_NAME = "original_session" API_ID = 123456 API_HASH = "your_api_hash" NEW_API_ID = 654321 NEW_API_HASH = "your_new_api_hash" NEW_SESSION_NAME = "new_session" def run_bot(client): try: with client: # 这里写你的机器人核心逻辑,比如发送消息、处理更新 client.send_message("target_channel", "测试消息") except errors.UserBannedInChannel: print("当前账号被封禁,切换至备用账号...") # 关闭当前客户端 client.stop() # 创建并启动新客户端 new_client = Client(name=NEW_SESSION_NAME, api_id=NEW_API_ID, api_hash=NEW_API_HASH) run_bot(new_client) # 启动初始机器人 run_bot(Client(name=SESSION_NAME, api_id=API_ID, api_hash=API_HASH))
示例代码(异步模式)
如果你的机器人是基于异步逻辑运行的,可以这样调整:
from pyrogram import Client, errors # 初始配置 SESSION_NAME = "original_session" API_ID = 123456 API_HASH = "your_api_hash" NEW_API_ID = 654321 NEW_API_HASH = "your_new_api_hash" NEW_SESSION_NAME = "new_session" async def main(client): try: await client.start() # 异步逻辑示例:处理消息更新 @client.on_message() async def handler(_, message): await message.reply("收到消息") await client.run_until_disconnected() except errors.UserBannedInChannel: await client.stop() print("切换至备用账号...") new_client = Client(name=NEW_SESSION_NAME, api_id=NEW_API_ID, api_hash=NEW_API_HASH) await main(new_client) # 启动初始机器人 import asyncio asyncio.run(main(Client(name=SESSION_NAME, api_id=API_ID, api_hash=API_HASH)))
注意:每个Client实例对应独立的会话文件,务必保证新的name参数与原会话名不同,避免会话数据冲突。
内容的提问来源于stack exchange,提问作者HollowPillow
相关产品推荐
相关产品推荐

