Python, requests и авторизация на сайте. Как передать логин и пароль (application/x-protobuf)

Есть некий сайт, авторизация на котором идет в несколько этапов: сначала необходимо получить csrf-токен, далее необходимо передать логин и пароль, а также csrf-токен в headers и в куках.

Пример кода:

import requests

PAYLOAD = {'Логин', 'Пароль'}
twofauth_page = "/twofactor-auth"

headers["x-csrftoken"] = csrf
headers["content-type"] = "application/x-protobuf"
headers["accept"] = "*/*"
cookie['csrftoken'] = csrf

client = requests.session()
req = requests.Request('POST', base_url + twofauth_page, data=PAYLOAD)
req.headers = headers
req.cookies = cookie
response = client.send(req)

Post-data запроса

Данный код в принципе работает, но с валидными логином и паролем сайт отвечает "Неправильный логин или пароль". Проблема похоже в том, что PAYLOAD передается в запросе как "Логин=Пароль", а из браузера он отправляется как "Логин\0х12\0х0ВПароль", т.е. без знака "=". Как это побороть?

UPD: Это оказался Google protobuf. Решил ))))

Сделал файл msg.proto

syntax = 'proto2';
message payload {
 required string login = 1;
 required string password = 2;
}

далее командой protoc --python_out=. ./msg.proto получил msg_pb2.py Работающий код в итоге:

import requests
import msg_pb2

payload = msg_pb2.payload()
payload.login = 'LOGIN'
payload.password = 'PASSWORD'
PAYLOAD = payload.SerializeToString(payload)

twofauth_page = "/twofactor-auth"

headers["x-csrftoken"] = csrf
headers["content-type"] = "application/x-protobuf"
headers["accept"] = "*/*"
cookie['csrftoken'] = csrf

client = requests.session()
req = requests.Request('POST', base_url + twofauth_page, data=PAYLOAD)
req.headers = headers
req.cookies = cookie
response = client.send(req)

Жаль, что это только часть процесса авторизации...

UPD2: Можно проще, SerializeToString выдает: b'\n\x05login\x12\x0bsecret_pass' где \x05 - длина логина (hex) \x12 - разделитель \x0b - длина пароля (hex)


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