如何以编程方式获取 Steam 网络会话 cookie

问题描述 投票:0回答:3

我目前正在尝试制作一个 Steam Web API(这里有部分记录的非官方 API:https://github.com/Revadike/InternalSteamWebAPI/wiki)包装器。 与所有其他非官方 api 一样,您必须获得一个 sessionID 才能访问某些 api 调用(例如销售商品等)

实际实现登录系统时几乎没有文档(也因为 Steam 刚刚用新的移动应用程序更新了他们的登录系统)

我用类似burp suite的工具分析了http流量。该网站使用他们自己的(官方)api (api.steampowered.com) 但有点不使用官方方法?

(而不是在 url 中传递参数,它使用 protobuf) https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1

------WebKitFormBoundarylRY65INKyJTRgG1i
Content-Disposition: form-data; name="input_protobuf_encoded"

EgtBbGJlcnQ0MjE2OBrYAlFPNFhxbWo0dGw3OVZ4L1IvR1A4eDVITU1yaHBBQldxSFU1NkhIMm5XK0Zsa0NJdVNIRm54dVdMR3drVmI2cXpZcmcyZVk0Q3AwOWZtQzdJcXRGSkxaWHhJbzNwM0tsdnVkNG1NcllaSWRaeUtZWkI4YlpjRW92d2llNFZWNyt1cnlick01MEd2M3RSSDYwUFJmSVpiQ3FCVGROaEpOZ0g5L3RRMlk1Q3doV21QT1BlOXhSdDVMTzdDdTgrR0cxSGlBSFRZbHZOMjQ0NWlBWldzY3ordCsvTU9xajZoOWhicmlpdVVoY1R0U29KUVdmclprNkpSRlA2dlo2ZDRHQ2VpelMwazdKZnQvQWdBWG1mQlVBN2tXOVVic2xIajR3NWFkcjU2S1FFbWJSSFc0THRHRVhvMVhybnRHL3RWVHRKUWl1VythUzh3aC9wNTVkZzVya1Rkdz09IJC49+WBCSgBOAFCBVN0b3JlSnMKb01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMDYuMC4wLjAgU2FmYXJpLzUzNy4zNhAC
------WebKitFormBoundarylRY65INKyJTRgG1i--

如果您想根据文档提出相同的请求(此处:https://steamapi.xpaw.me/#IAuthenticationService/BeginAuthSessionViaCredentials

你必须做这样的事情

POST https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1?account_name=Albert68421&encrypted_password=...

我认为参数是一样的吗?所以,是的,正如您所看到的,一切都是一团糟。无论如何,我从来没有使用过 protobuf,所以我只是使用了记录的方法,而不是网站使用的方法(它们并没有真正记录在案,因为没有文档实际上告诉你在执行 BeginAuthSessionViaCredentials 之后如何继续)

出于某种原因,steam 让他们的用户通过 rsa 加密密码。他们还给了我十六进制和二进制字符串(“1010101”)的密钥,并想在 base64 中接收它?我真的找不到正确的方法,所以是的。

据我了解你必须做的 https://api.steampowered.com/IAuthenticationService/GetPasswordRSAPublicKey/v1/?username=Albert48421

然后你会得到这样的东西:

{"success":true,"publickey_mod":"a6009232c5e6651d9fe6daca66fd1e78f97fd15115b6db29e38f8865784b451d18d6378195f5cd6f5020fd775542759802e8c1940f2753d2d845e7e08c2b0cb7d28e21ce173c06abe182951242751bc2813d82077fa221a494288a3969e773b0a4d1ef6970d526075054bc8f5bba17fb67b6a729c3dcf232a0ae0440d32fc759ea999d5a4de87138d7c4e187998d92e6f93317f76d74e31f7359423f6bea17b2647305f731b507100e72ec09d0d9d3f5141fda87952fc42e28e3ec20c1f82aa4371cc9b4e0c96ca3bd548821c03c99ecd13e43af455f41ab678d02683a16b437080cf116cb74bdfd355e9ef2c2ecd3f81c54e6c541e6ecbea76a919dc4f9cb33","publickey_exp":"010001","timestamp":"309709350000","token_gid":"2a8a12860b39ef47"}

正如我所说,我认为 publickey_mod 是十六进制的(非常明显),而 publickey_exp 是二进制的,因为 010001 的二进制 -> 十进制是 17,它通常用于 rsa,因为它在二进制 repr 中几乎没有 1(这使得 rsa 更快) . 它实际上是十六进制的,即 65537.

我使用 python rsa 模块并像这样创建公钥以防这是我的问题:

public_key = rsa.PublicKey(int(rsa_request["publickey_mod"], 16), int(rsa_request["publickey_exp"], 2))

然后我 rsa 加密我的密码:

encrypted_pass = b64encode(rsa.encrypt(self.__login_data.password.encode("utf-8"), public_key)).decode("utf-8")

According to the steam docs you should then use that encrypted password with https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1/

我做了什么,我得到了这样的东西

{'client_id': '163REDACTED397', 'request_id': 'mREDACTEDWQ==', 'interval': 5}

这看起来不像请求失败,直到您使用错误的密码再次尝试并获得完全相同的结果。

这是我发现的有用的东西: https://github.com/DoctorMcKay/node-steam-session(我相信这是最新的,但我从未使用过 TypeScript,真的不理解代码。) 而且,如果您需要一个禁用 2fa 的测试帐户,请使用我刚刚制作的用于测试的帐户:

Username: SOLVED
Password: SOLVED

感谢阅读<3

python rsa steam
3个回答
0
投票

我怀疑指数实际上是十六进制的。 65537 是比 17 更常见的指数。


0
投票

有一个名为“steamwebapi”的 Python 库可以帮助您。

import steamwebapi

api = steamwebapi.WebAPI(api_key="your_api_key_here")

api.set_session_id("your_session_id_here")

api.get_inventory()

-1
投票

对不起,你做到了吗? 我不能。 =(

© www.soinside.com 2019 - 2024. All rights reserved.