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

Попытался написать авторизацию на сайте с помощью py requests. Вручную авторизуюсь на сайте и все норм. Через программу не хочет авторизовываться и на сайте выскакивает ошибка 1020 “Access Denied”.

url = "https://informatics.msk.ru/login/index.php"
session = requests.Session()
r = session.get(url, headers=user_agent_val)
post_request = session.post(url, {
    'username': LOGIN,
    'password': PASSWORD,
})

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

Автор решения: Стас

Проблема в том, что при авторизации необходимо передавать значение logintoken. Его можно найти в коде страницы https://informatics.msk.ru/login/index.php внутри формы авторизации:

<form class="mt-3" action="https://informatics.msk.ru/login/index.php" method="post" id="login">
...
<input type="hidden" name="logintoken" value="lwUiTJJAm0rj9qlOwChK5zBH5sadhbT2">
...

Вот примерный код, который может это сделать:

import requests
from lxml import html # pip install lxml

session = requests.Session()
session.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"}
loginPageResp = session.get("https://informatics.msk.ru/login/index.php", stream=True)

loginPageResp.raise_for_status()
loginPageResp.raw.decode_content = True

parser = html.parse(loginPageResp.raw)

loginToken = parser.xpath("//form[@class='mt-3' and @id='login']/input[@name='logintoken']/@value")

if not loginToken: raise ValueError("Field 'logintoken' was not found")

loginTokenVal = loginToken[0] #select first of search results

loginResp = session.post(
    "https://informatics.msk.ru/login/index.php",
    json = {
        "logintoken" : loginTokenVal,
        "username" : "LOGIN",
        "password" : "PASSWORD"
    }
)
→ Ссылка