改写asyncsteampy库时,pickle保存Steam会话遇_SimpleQueue序列化错误
解决Steam会话pickle序列化的SimpleQueue错误
直接序列化SteamClient实例必然会遇到这类问题——异步HTTP会话(比如aiohttp的ClientSession)内部包含大量无法被pickle序列化的对象:weakref、Context、SimpleQueue都是异步框架维持运行的内部状态载体,这些对象设计时就没考虑序列化。
正确的做法是只提取维持会话的核心业务数据,不序列化整个客户端实例:
步骤1:定义可序列化的会话数据类
创建一个只保存登录后必要凭证的简单类,避免包含任何异步框架的内部对象:
class SteamSessionData: def __init__(self, cookies, steamid, sessionid, api_key): self.cookies = cookies self.steamid = steamid self.sessionid = sessionid self.api_key = api_key
步骤2:修改会话保存逻辑
不要直接dumpsteam_client,而是提取核心数据后序列化自定义类:
async def authorization(username, password, steam_guard, pkl_name, api_key): steam_client = await create_steam_session(username, password, steam_guard, pkl_name, api_key) # 提取会话核心数据(字段需根据asyncsteampy的实际属性调整) # 若使用aiohttp的CookieJar,需转成可序列化的字典格式 cookies = steam_client._session.cookie_jar.export_cookies() session_data = SteamSessionData( cookies=cookies, steamid=steam_client.steamid, sessionid=steam_client.sessionid, api_key=api_key ) # 序列化自定义数据对象 with open(f'async_pkl/{pkl_name}', 'wb') as f: pickle.dump(session_data, f) # 关闭原会话释放资源 await steam_client._session.close()
步骤3:恢复会话逻辑
从pickle加载数据后,重新初始化SteamClient并注入保存的凭证:
async def restore_steam_session(pkl_name, steam_guard_path): with open(f'async_pkl/{pkl_name}', 'rb') as f: session_data = pickle.load(f) # 初始化客户端(无需调用login) steam_client = SteamClient( username=None, # 若需要可补充 password=None, steam_guard_path=steam_guard_path, api_key=session_data.api_key ) # 恢复cookie与会话标识 steam_client._session.cookie_jar.update_cookies(session_data.cookies) steam_client.steamid = session_data.steamid steam_client.sessionid = session_data.sessionid # 可选:发送测试请求验证会话有效性 # await steam_client.test_authenticated_request() return steam_client
关键提示
- 具体字段需参考
SteamClient的源码,确认哪些属性是维持登录状态必须的(比如部分库会有access_token、refresh_token等) - 绝对不要尝试序列化异步会话的内部组件(比如
connector、_session的完整实例),这些对象依赖运行时的异步上下文,无法被持久化
内容的提问来源于stack exchange,提问作者freezy
相关产品推荐
相关产品推荐

