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)
Данный код в принципе работает, но с валидными логином и паролем сайт отвечает "Неправильный логин или пароль". Проблема похоже в том, что 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)
