Какой Post-запрос отправлять при авторизации https://store.steampowered.com/login/

Я пытаюсь отправить Post-запрос с помощью библиотеки requests на сайт: https://store.steampowered.com/login/ Однако я не могу понять какой словарь сформировать, так же steam, как я понимаю использует много javascript, так что это затрудняет процесс, может кто-нибудь знает какой запрос отправить или возможно нужно использовать другие библиотеки, в моем проекте желательно не использовать selenium, так как мне нужна скорость


Ответы (1 шт):

Автор решения: Alex Krass

У вас будет достаточно много сложностей, чтобы провернуть это дело через python и выполнить роль браузера. Я бы сразу рекомендовал искать готовые библиотеки, которые могут авторизовать по логину и паролю. Хотя не факт, что найдете актуальные версии. По запросам, которые проходят, там не простая форма авторизации в плане отправить post запрос на адрес.

Поэтому получится весьма обширный и познавательный, но боюсь крайне бесполезный ответ из-за сложности провернуть это дело на практике. Готовые библиотеки (надо пробовать и проверять) или альтернативные варианты в виде чистого steam api конечно более в приоритете.

Первый момент, там используется Protocol Buffers — протокол сериализации структурированных данных. То есть данные передаются не в чистом виде, а в сериализованном по правилам этого протокола. Второй момент, там несколько запросов к API на авторизацию, она многошаговая.

Открываете devtools браузера на вкладке network, включаете preserve log чтобы они не очищались при редиректах, вводите данные и видите следующую цепочку запросов.

введите сюда описание изображения

Альтернативно можно их аналог посмотреть тут, возможно они и без protobuf сработают, можно попробовать. Все отправляемые данные там на вкладках указаны:

https://www.postman.com/digital-descent/development-resources/request/e1981mf/getpasswordrsapublickey

Нажав на каждый, увидим их заголовки и данные.

  1. Запрос на получения ключа для шифрования пароля.

https://api.steampowered.com/IAuthenticationService/GetPasswordRSAPublicKey/v1?origin=https://store.steampowered.com&input_protobuf_encoded=CgUxMTExMQ==

Вот эта последняя строка CgUxMTExMQ==, это сериализованное имя аккаунта введенное как 11111. Как работать с protobuf, это отдельно надо смотреть и изучать, слишком обширная тема для ответа. Он требует предварительного описания запроса/ответа и последующей генерации кода. Но сами исходные файлы .proto можно найти: https://github.com/SteamDatabase/Protobufs/blob/master/webui/service_authentication.proto

Но условно для этого запроса нас интересуют данные вида:

message CAuthentication_GetPasswordRSAPublicKey_Request {
    optional string account_name = 1;
}

message CAuthentication_GetPasswordRSAPublicKey_Response {
    optional string publickey_mod = 1;
    optional string publickey_exp = 2;
    optional uint64 timestamp = 3;
}

В качестве ключа запроса имя аккаунта, в качестве ответа время, время жизни ключа и ключ для шифрования.

  1. Следующий запрос на начало авторизации, опять же список сериализованных данных

https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials

Данных много, в качестве уходящих данных будет длинная строка вида input_protobuf_encoded: DSdfjnbkUIREWO834kSDJFNKBKJDSLFJHBKDSFB.......KSJDFNGNnnndksjfD==

Дальше я уже опущу подробности, но выполняется еще несколько запросов.

  1. Проверка, откуда входите, так же там может быть проверка на вход при двухфакторной авторизации. Возможно их можно опустить, но не факт.

https://login.steampowered.com/jwt/checkdevice/32443543984

  1. Обновления статуса сессии после ввода двухфакторного кода

https://api.steampowered.com/IAuthenticationService/PollAuthSessionStatus

  1. Получения токенов сессии

https://login.steampowered.com/jwt/finalizelogin

  1. И наконец будет цепочка запросов на установку токенов на адресах вида

https://store.steampowered.com/login/settoken

→ Ссылка