Как авторизоваться на сайте через python
Перейти к содержимому

Как авторизоваться на сайте через python

  • автор:

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

Библиотека requests позволяет указать собственный механизм аутентификации, а так же поддерживает без дополнительной настройки механизм базовой аутентификации.

Реализации аутентификации являются подклассами AuthBase и легко поддаются определению. Библиотека requests предоставляет две общие реализации схемы аутентификации в подмодуле requests.auth : HTTPBasicAuth и HTTPDigestAuth .

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

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

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

from requests.auth import AuthBase class PizzaAuth(AuthBase): """Присоединяет HTTP аутентификацию к объекту запроса.""" def __init__(self, username): # здесь настроем любые данные, связанные с аутентификацией self.username = username def __call__(self, req): # изменяем и возвращаем запрос req.headers['X-Pizza'] = self.username return req 

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

>>> requests.get('http://pizzabin.org/admin', auth=PizzaAuth('superken')) #

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

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

# псевдокод (необходимо определить используемые переменные) >>> from requests.auth import HTTPBasicAuth # указываем параметры аутентификации >>> auth = HTTPBasicAuth('fake@example.com', 'password') >>> resp = requests.post(url=url, data=body, auth=auth) >>> resp.status_code # 201 >>> content = resp.json() >>> print(content['body']) 

Расширение 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 |).

from requests_oauthlib import OAuth2Session from flask import Flask, request, redirect, session, url_for from flask.json import jsonify import os app = Flask(__name__) # Эта информация получена при регистрации нового приложения # GitHub OAuth здесь: https://github.com/settings/applications/new client_id = "" client_secret = "" authorization_base_url = 'https://github.com/login/oauth/authorize' token_url = 'https://github.com/login/oauth/access_token' @app.route("/") def demo(): """1: Авторизация пользователя. Перенаправление пользователя/владельца ресурса к поставщику OAuth (например, Github) использование URL-адреса с несколькими ключевыми параметрами OAuth. """ github = OAuth2Session(client_id) authorization_url, state = github.authorization_url(authorization_base_url) # Состояние используется для предотвращения CSRF, оставим на потом. session['oauth_state'] = state return redirect(authorization_url) # 2: Авторизация пользователя, это происходит на провайдере. @app.route("/callback", methods=["GET"]) def callback(): """ 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'] = token return redirect(url_for('.profile')) @app.route("/profile", methods=["GET"]) def profile(): """Извлечение защищенного ресурса с помощью токена OAuth 2. """ github = OAuth2Session(client_id, token=session['oauth_token']) return jsonify(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) 

Обратите внимание, что Oauth2 работает через уровень SSL. Если сервер не настроен для поддержки HTTPS, то метод fetch_token вызовет ошибку oauthlib.oauth2.rfc6749.errors.InsecureTransportError . Большинство людей не устанавливают SSL на своих серверах во время тестирования, и это нормально. Можно отключить эту проверку двумя способами:

    Установив переменную окружения.

export OAUTHLIB_INSECURE_TRANSPORT=1 
# Где-то в webapp_example.py, например, # перед запуском приложения. import os os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' 

Авторизация на сайте ( Python )

Поля ввода login/pass он нашёл правильно, а вот кликать по логину не хочет, видимо, надо задавать как-то явно. Попытался решить ректально-орально через pyAutoGui эмуляцией нажатия Enter, взбрыкнул браузер (как я понял).
Подскажите, как правильно указать кнопку login селениуму.

f22
Codeby Academy

Gold Team
05.05.2019 1 802 224 BIT 768

Начинаю пытаться питонить и парсить. Сразу полез в прикладную часть. Выбрал регистратора доменов и попытался спарсить дропов, воткнулся сразу же, прямо на этапе авторизации.

from selenium import webdriver chromedriver ='D:\python\chromedriver.exe' browser= webdriver.Chrome(chromedriver) browser.get('https://member.expireddomains.net/domains/expiredru/?o=changes&r=d#listing') login=browser.find_element_by_id('inputLogin') password=browser.find_element_by_id('inputPassword') login.send_keys('Login') password.send_keys('Password') Login.click()

Поля ввода login/pass он нашёл правильно, а вот кликать по логину не хочет, видимо, надо задавать как-то явно. Попытался решить ректально-орально через pyAutoGui эмуляцией нажатия Enter, взбрыкнул браузер (как я понял).
Подскажите, как правильно указать кнопку login селениуму.

Вариантов нажатия на кнопку там очень много. Попробуй найти её id через

 element = driver.find_element_by_id("login") element.click()
driver.find_element_by_xpath('//div[@id="login"]') element.click()

Авторизация на сайте

Author24 — интернет-сервис помощи студентам

Есть код, который должен авторизовываться на сайте и возвращать имя пользователя из аккаунта:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import requests from bs4 import BeautifulSoup url = 'https://secure.simmarket.com/login.php?action=process' url_next = 'https://secure.simmarket.com/default-en.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' } s = requests.Session() req = s.post(url, data={"email_address" : "stepanovatai@yandex.ru", "password": "stepanovatai"}, headers=headers) get_next = s.get(url_next) soup = BeautifulSoup(get_next.text, "html.parser") name = soup.find('div', class_='header-menu-head-heading') print(name)

Но код ничего не возвращет. Помогите разобраться. В чем проблема ?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Авторизация на сайте
Недавно начал заниматься django. Возник вопрос как сделать регистрацию и авторизацию на сайте? Буду.

Авторизация на сайте
Доброго времени знатоки! Есть код на питоне: //from selenium import webdriver from.

Авторизация на сайте
Всем привет! Есть код, который должен возвращать строку из аккаунта пользователя. Не проходит.

Авторизация на сайте requests
Здравствуйте, заморочился с авторизацией на сайте informatics.mccme.ru библиотекой requests.post.

Автоматизируй это!

Эксперт Python

7104 / 4607 / 1215
Регистрация: 30.03.2015
Сообщений: 13,221
Записей в блоге: 29

Orlov1, в том что там нет этих данных, вот тут они есть https://secure.simmarket.com/account_edit.php

Регистрация: 03.02.2019
Сообщений: 560

Welemir1, ошибаетесь. Вот тут :

1 2 3 4
div class="header-menu-head-heading"> [B]Tai Stepanova[/B] span class="header-menu-head-subheading nobr">Your ID : 498164/span> /div>

Даже если код переписать так и парсить со страницы личных данных аккаунта :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import requests from bs4 import BeautifulSoup url = 'https://secure.simmarket.com/login.php?action=process' url_next = 'https://secure.simmarket.com/account_edit.php' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' } s = requests.Session() req = s.post(url, data={"email_address" : "stepanovatai@yandex.ru", "password": "stepanovatai"}, headers=headers) get_next = s.get(url_next) soup = BeautifulSoup(get_next.text, "html.parser") name = soup.findAll('td', class_='form_td') print (name)

Код не возвращает требуемые данные.
Автоматизируй это!

Эксперт Python

7104 / 4607 / 1215
Регистрация: 30.03.2015
Сообщений: 13,221
Записей в блоге: 29
Orlov1, там не все просто, в коде увидишь причину проблем

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
>>> url = 'https://secure.simmarket.com/login.php?action=process' >>> import requests >>> from lxml import html >>> s = requests.Session() >>> headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'Referer': 'https://secure.simmarket.com/account_edit.php'} >>> req = s.post(url, data={"email_address" : "stepanovatai@yandex.ru","password": "stepanovatai"}, headers=headers) >>> 'Stepanova' in req.text False >>> headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'Sec-Fetch-User': '?1', 'Referer': 'https://secure.simmarket.com/account_edit.php'} >>> req = s.post(url, data={"email_address" : "stepanovatai@yandex.ru","password": "stepanovatai"}, headers=headers) >>> 'Stepanova' in req.text True >>> parsed = html.fromstring(req.text) >>> vals = parsed.xpath('//div[@class="header-menu-head-heading"]') >>> vals[0].text '\n\t\t\t\t\tTai Stepanova\n\t\t\t\t\t' >>> vals[0].text_content().replace('\t','') '\nTai Stepanova\nYour ID : 498164\n'

Регистрация: 03.02.2019
Сообщений: 560

Welemir1, благодарю за показательный код.
Подскажите как определить, что нужно передавать и эти параметры в запросе ?:

'Sec-Fetch-User': '?1', 'Referer': 'https://secure.simmarket.com/account_edit.php'}

Автоматизируй это!

Эксперт Python

7104 / 4607 / 1215
Регистрация: 30.03.2015
Сообщений: 13,221
Записей в блоге: 29

Orlov1, часто это происходит именно путем проб и ошибок. Я по опыту знаю что иногда все дело в каком то поле или куки, потому начал с наиболее подозрительных. Они и сработали. В общем алгоритм таков (если в результате нет того, что ищешь):
1) реквестами получаешь текст страницы и смотришь есть ли вообще в нем искомое
2) если нет то через браузер смотришь -не запрашивается ли эта инфа через аякс запросы или вебсокеты
3) если нет, то значит дело в самом запросе и начинаешь смотреть как именно браузер его делает, что в нем есть. Обычно имеет значение именно юзер-агент, куки, реферер или поля со специфическими именами. И начинаешь подбирать их, чтобы заработало.

Регистрация: 03.02.2019
Сообщений: 560

Welemir1, как не странно, но код работает со стандартным user-agent.
Код записан так и он работает, только дважды нужно отправить post запрос, иначе не проходит авторизация. Не пойму пока почему.
Принципиально ошибка была в методе парсинга.

Почему два запроса нужно ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
import requests from lxml import html url = 'https://secure.simmarket.com/login.php?action=process' s = requests.Session() headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'} username = "stepanovatai@yandex.ru" password = "stepanovatai" req = s.post(url, data={'email_address': username, 'password': password}, headers=headers) req = s.post(url, data={'email_address': username, 'password': password}, headers=headers) try: parsed = html.fromstring(req.text) vals = parsed.xpath('//div[@class="header-menu-head-heading"]') vals1 = (vals[0].text_content().replace('\t','')) if "Your ID" in vals1: print ('Имя пользователя : ' + vals1) except: print('Ошибка авторизации')

Как авторизоваться на сайте с помощью python requests?

Я наверное упускаю что-то фундаментальное. Я уже пробовал на разных сайтах — результат один и тот же — код страницы без авторизации.
Хочу авторизоваться, получить куки и работать с сайтом передавая куки.

  • Вопрос задан более трёх лет назад
  • 59811 просмотров

Комментировать
Решения вопроса 2

nobodynoone

Lorem Ipsum @nobodynoone

requests.auth это компонент, который используется для авторизации по методу `Basic\Digital access authentication`, если у вас на сайте форма с авторизацией, то надо отправлять форму. Короче, учите матчасть.

session = requests.Session() session.post('http://example.com/auth/login', < 'username': 'admin', 'password': 'password', 'remember': 1, >)

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

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