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

如何程序化获取Steam Web会话Cookie?登录API实现求助

问题描述

我正在开发Steam非官方Web API的封装工具,需要获取sessionID来调用出售物品这类接口。但Steam更新登录系统后,登录实现几乎没有文档支持。

通过流量分析发现,Steam官网使用api.steampowered.com的IAuthenticationService/BeginAuthSessionViaCredentials接口,但采用protobuf传参,而非现有文档里的URL参数方式。我尝试按文档方式实现:

  • 调用GetPasswordRSAPublicKey获取RSA公钥,其中publickey_mod是十六进制,publickey_exp实际是十六进制的65537
  • 用Python的rsa模块创建公钥时,曾错误将publickey_exp按二进制解析,修正后加密密码
  • 调用BeginAuthSessionViaCredentials,但无论密码正确与否,返回结果均为:
    {'client_id': '163REDACTED397', 'request_id': 'mREDACTEDWQ==', 'interval': 5}
    
    无法判断登录状态。

我找到一个TypeScript的实现项目,但因为不熟悉TypeScript没法参考,现在提供测试账号(Username: SOLVED,Password: SOLVED)寻求帮助。


解决方案

核心问题:接口返回仅代表会话初始化,需轮询获取最终状态

BeginAuthSessionViaCredentials的设计逻辑是先初始化认证会话,不直接反馈登录结果,后续必须轮询PollAuthSessionStatus接口才能拿到登录成功/失败的状态。以下是修正后的完整流程:

  1. 正确处理RSA加密逻辑
    确保将十六进制的公钥参数转为整数后创建公钥,且使用Steam要求的PKCS#1 v1.5 padding加密:

    import rsa
    
    # 从GetPasswordRSAPublicKey接口获取的参数
    publickey_mod_hex = "..."  # 接口返回的十六进制mod值
    publickey_exp_hex = "10001"  # 65537的十六进制表示
    
    # 转换为整数类型
    n = int(publickey_mod_hex, 16)
    e = int(publickey_exp_hex, 16)
    
    # 创建公钥并加密密码
    pub_key = rsa.PublicKey(n, e)
    encrypted_password = rsa.encrypt("你的密码".encode("utf-8"), pub_key)
    encrypted_password_hex = encrypted_password.hex()  # Steam要求转为十六进制字符串
    
  2. 初始化会话后轮询状态
    拿到client_id和request_id后,以返回的interval(5秒)为间隔,调用IAuthenticationService/PollAuthSessionStatus接口,传入这两个参数。该接口返回的关键状态值:

    • auth_session_response = k_EAuthSessionResponseOK:登录成功,会附带refresh_token等凭证
    • auth_session_response = k_EAuthSessionResponseInvalidPassword:密码错误
    • auth_session_response = k_EAuthSessionResponsePending:需等待验证(如2FA,此时会返回requires_confirmation字段,需调用UpdateAuthSessionWithSteamGuardCode接口提交验证码)
  3. 适配Protobuf传参要求
    文档中的URL参数方式已被Steam废弃,必须使用protobuf格式构造请求体:

    • 逆向Steam官方页面导出protobuf定义(或参考现有开源项目的结构)
    • 使用Python的protobuf库生成请求类,构造参数后序列化为二进制发送请求

测试账号验证注意事项

用提供的测试账号测试时,需确认:

  • 加密后的密码格式为十六进制字符串(Steam不接受base64编码)
  • 调用BeginAuthSessionViaCredentials时,需传入username、persistence=1(持久化登录)、platform_type=1(Web平台)等必填参数
  • 若账号开启2FA,需在轮询到requires_confirmation状态时,额外处理验证码提交流程

内容的提问来源于stack exchange,提问作者Nichtdu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:30:55