如何程序化获取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接口才能拿到登录成功/失败的状态。以下是修正后的完整流程:
正确处理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要求转为十六进制字符串初始化会话后轮询状态
拿到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接口提交验证码)
适配Protobuf传参要求
文档中的URL参数方式已被Steam废弃,必须使用protobuf格式构造请求体:- 逆向Steam官方页面导出protobuf定义(或参考现有开源项目的结构)
- 使用Python的
protobuf库生成请求类,构造参数后序列化为二进制发送请求
测试账号验证注意事项
用提供的测试账号测试时,需确认:
- 加密后的密码格式为十六进制字符串(Steam不接受base64编码)
- 调用
BeginAuthSessionViaCredentials时,需传入username、persistence=1(持久化登录)、platform_type=1(Web平台)等必填参数 - 若账号开启2FA,需在轮询到
requires_confirmation状态时,额外处理验证码提交流程
内容的提问来源于stack exchange,提问作者Nichtdu

