Аутентификация с модулем requests в Python.

Необходимо парсить данные с сайта гос. услуг. python

Задача спарсить страницу url_get, но для этого необходима авторизация на mos.ru. POST запрос на авторизацию выглядит так:

Host: login.mos.ru
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20220101 Firefox/74.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 177
Origin: https://login.mos.ru
Connection: keep-alive
Referer: https://login.mos.ru/sps/login/methods/password
Cookie: fm=eyJtZXRob2RzIjpbInBhc3N3b3JkIiwieDUwOSIsImV4dGVybmFsSWRwcyJdLCJwYXJhbXMiOnsiY2hhbGxlbmdlIjoibW1HdkRYa1hvL1VXZ2lCWFdBVGMiLCJmZWRQb2ludHMiOiJ5YW5kZXg6eWFuZGV4XzF8c2JyZjpzYnJmXzF8Z29vZ2xlOmdvb2dsZV8xfHZrOnZrXzF8ZmFjZWJvb2s6ZmFjZWJvb2tfMXxlc2lhOmVzaWFfMXxvazpva18xIn19; blg=ru; history=eyJtZXRob2QiOiJwYXNzd29yZCJ9; origin=53w5fwZVaZiNYy4QYHZp|/sps/oauth/ae?scope=profile+openid+contacts&response_type=code&redirect_uri=https://www.mos.ru/api/acs/v1/login/satisfy&client_id=53w5fwZVaZiNYy4QYHZp; oauth_az=GSpw72qzeKoBYs34Am9A5H8YsYa7ig6QN_xeE8ca-j_8VN9mDADOpewZVEJAbcyYkXnt53fTyed4XuYJyupsMoUQe9TcfePFGIoJLIgZRJ8; lstate=8hIGwhYxF2jCl2_Ylmnsho8-A_pEqQ4lxY7U2U0UFsLUtBf7BCHFGGzZn1S6GYB6O_nfTRJcE1WHgRmjmVe_Cc5o0rd6BAByYu2aWS7YBj_6M1hK4ihVRmEBYbptNK8UkaMn4qU_Z5v0WenyXCPhr4GXAM47uSy_5a6uG948gM94VzZ37J_mYmntW-n-yXx7exZOetqDwhqxML48NxJrxFwqrqVZFt5OYRgM8-0OxvIMR09GrKTG0BPGhGerZChzh8yjWxDFUfE_ozzzwXr57itKi4GlVFXIHrjkBYxVY3S5X022VqH068FluqQOESvCpO14r6qLk33slQ7H1-zrwLCNEhHNbdU3DYvgd6RoKbPDSgVSp-TqZEBwx7TpltJI-a5oJbESzA9Vu5ZVw9h2v7hzNaJy97ImW9VuvXRVBHwmIi_cN6SnJOWq49ypOcOE3u4iiuzgb6K_pz7NDa8f6JUJbmCpsZwJ2pCTMJ4cQsX1Peg09U95C75b026QpLyShsoMReUubbXtn2m9eYhvIfzgRswQMr8Sj4LgqH9BEiL3TZaIIMxyo-bagNaFRXRi|MTU4NTU1NzMzOQ|U0gxQVMxMjhDQkM|ER7HYKGdWR7sn-Pq3KmUkQ|mVjnsvm1VMcEiFkuHm2WVw44TVg; mos_id=Cg8qAl6BJ1oWGVI8hI3RAgA=; session-cookie=1600e85627f68f9920f90eb004983c473c883880c61917c6ccff2032d7fef65a68736013a1bf70cde27eb74cb7044e91; _ym_uid=1585522529585213091; _ym_d=1585522529; _ym_isad=2; _ym_visorc_32628510=w; _ym_visorc_14112952=b; csrf-token-name=lcsrftoken; csrf-token-value=1601080c203f92df03b4aa6069781475b7ae63ee44069f88a39007ed388a13475d6ba770aa19a068; _ym_visorc_53480143=w
Upgrade-Insecure-Requests: 1

isDelayed=false&login=12&password=12&lcsrftoken=160107fff2ad7b1347fd1db484bfe4e7aaeecc1a04fb96230405c09e04822e9d0a660a3ae244cf48&bfp=4ffc3baee892f5091ddbe8e625c2596a&alien=false

Пытался реализовать это так, но возвращает time out:

import requests
url_auth = 'https://login.mos.ru'
url_auth_ref = 'https://login.mos.ru/sps/login/methods/password'
url_get = 'https://www.mos.ru/visit/gibddlicense/reserve/?reasonId=26'
login = ''
password = ''

s = requests.Session()
r = s.get(url_auth_ref)
headers = {'Referer': url_auth_ref}
csrf_token = r.cookies['lcsrftoken']
data = {'login':login, 'password': password, 'lcsrftoken': csrf_token}

d = s.post(url_auth, data=data, headers=headers)

dd = s.get(url_get)
print(dd.text)```

Пользовательский механизм аутентификации.

Любой вызываемый объект, который передается в качестве аргумента auth методу запроса, имеет возможность изменить запрос перед его отправкой.

Представим, что у есть веб-сервис, который будет отвечать только в том случае, если заголовок X-Pizza имеет значение пользователя. Это маловероятно, ну просто представим такую схему.

Затем можно сделать запрос, используя созданный класс PizzaAuth():

Пример базовой аутентификации.

Библиотека requests позволяет легко использовать многие формы аутентификации, включая очень распространенную базовую аутентификацию.

Расширение requests-oauthlib.

Расширение requests-oauthlib позволяет автоматически выполнять OAuth1 и OAuth2 аутентификацию из библиотеки requests без танцев с бубном.

Расширение будет полезно для большого числа веб-сайтов, которые используют OAuth1/2 для обеспечения быстрой аутентификации. Оно также предоставляет множество настроек, которые обрабатывают способы, которыми конкретные поставщики OAuth отличаются от стандартных спецификаций.

Для начала использования requests-oauthlib, его необходимо установить.

$ pip install requests_oauthlib

Расширение использует библиотеки Python requests и |OAuthlib|, чтобы предоставить простой в использовании интерфейс для создания клиентов OAuth1 и OAuth2.

В приведенном ниже примере показано веб-приложение, использующее веб-фреймворк Flask, которое подключается к API Github OAuth2. Этот пример должен быть легко перенесен на любой веб-фреймворк.

Хотя последовательность операций у большинства провайдеров остается неизменной, особенность Github заключается в том, что параметр redirect_uri является необязательным. Это означает, что может потребоваться явная передача redirect_uri объекту OAuth2Session (например, при создании настраиваемого OAuthProvider с помощью |flask-oauthlib|).

fromrequests_oauthlibimportOAuth2SessionfromflaskimportFlask,request,redirect,session,url_forfromflask.jsonimportjsonifyimportosapp=Flask(__name__)# Эта информация получена при регистрации нового приложения# GitHub OAuth здесь: https://github.com/settings/applications/newclient_id="<your client key>"client_secret="<your client secret>"authorization_base_url='https://github.com/login/oauth/authorize'token_url='https://github.com/login/oauth/access_token'@app.route("/")defdemo():"""1: Авторизация пользователя.    Перенаправление пользователя/владельца ресурса к поставщику     OAuth (например, Github) использование URL-адреса с несколькими    ключевыми параметрами OAuth.    """github=OAuth2Session(client_id)authorization_url,state=github.authorization_url(authorization_base_url)# Состояние используется для предотвращения CSRF, оставим на потом.session['oauth_state']=statereturnredirect(authorization_url)# 2: Авторизация пользователя, это происходит на провайдере.@app.route("/callback",methods=["GET"])defcallback():""" 3: Получение токена доступа.    Пользователь был перенаправлен обратно от поставщика на     зарегистрированный URL обратного вызова. С этим перенаправлением     приходит код авторизации, включенный в URL-адрес перенаправления.     Используем это, чтобы получить маркер доступа.    """github=OAuth2Session(client_id,state=session['oauth_state'])token=github.fetch_token(token_url,client_secret=client_secret,authorization_response=request.url)# На этом этапе уже можно получить защищенные ресурсы, сохраним # токен и покажем, как это делается из сохраненного токена в /profile.session['oauth_token']=tokenreturnredirect(url_for('.profile'))@app.route("/profile",methods=["GET"])defprofile():"""Извлечение защищенного ресурса с помощью токена OAuth 2.    """github=OAuth2Session(client_id,token=session['oauth_token'])returnjsonify(github.get('https://api.github.com/user').json())if__name__=="__main__":# Это позволяет нам использовать вызов по HTTP os.environ['OAUTHLIB_INSECURE_TRANSPORT']="1"app.secret_key=os.urandom(24)app.run(debug=True)
Похожее:  Личный кабинет НПФ Сбербанка: вход, регистрация, горячая линия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *