Авторизация на сайте с помощью python requests

введите сюда описание изображенияЕще один вопрос на эту тему. Есть тестовый сайт(он внутренний, посмотреть в живую не возможно) на котором надо авторизоваться, пикчи там нет, запрос выглядит так:

-----------------------------259453718138943564301838662474
Content-Disposition: form-data; name="XCSRFTokenF"

CfLJ8OV_ly7Ch80Iryc-kXeMXRJa0lVOfP5_Dg3h9HrqEV0JcjwepmXwideWUlciaEvmHcocZfxWjcBHWeCC7k_KVLzPqqnVmepViR8AKHin66FHGNn1MjjTTvrTuNznOavFyJzVBsSFUfDgWxO1oAYp0ag
-----------------------------259453718633943564301838662477
Content-Disposition: form-data; name="ReturnUrl"

/ClientDevice
-----------------------------259453718633943564301838662477
Content-Disposition: form-data; name="Email"

[email protected]
-----------------------------259453718633943564301838662477
Content-Disposition: form-data; name="PasswordUser"

1qaz@WSX
-----------------------------259453718633943564301838662477--

В теме не особо разбираюсь, посмотрел кучу видосов, у всех почемуто даже запрос внешне отличается в браузере в инструменте разработчика. Наивно попробовал следующий код:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/75.0.3770.142 Safari/537.36 '
}

data = {
    "Email":"[email protected]",
    "PasswordUser":"1qaz@WSX"
    "ReturnUrl":"/ClientDevice"
}

url = "http://lk.testsite.ru/Account/Login"

s = requests.Session()
s.post(url, data=data, header=headers)
r = s.get("http://lk.testsite.ru/systemparameter") 
#здесь пытаюсь забрать страницу, которуую нельзя увидеть без авторизации
print(r.text)
#здесь разочарованно смотрю на код страницы авторизации 

Подозреваю что часть проблемы в ""XCSRFTokenF". Что собственно надо сделать?(


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

Автор решения: gil9red

Токен XCSRFTokenF нужно на странице сайта вытаскивать из тега input. Это защита, которая заставляет сначала загрузить страницу сайты, после сделать с нее запрос.

На сайте данные отправляются в другом формате. При отправке через data= данные будут как Content-Type = application/x-www-form-urlencoded, а у сайта данные отправляются в Content-Type = multipart/form-data (параметр files= в post), такое можно посмотреть в инспекторе браузере в заголовках запроса.

Для отправки в multipart/form-data поменяйте атрибут на files:

r = s.post(url, files=data, header=headers)
print(r)
→ Ссылка