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

改写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:04:51