Авторизация на сайте используя requests

Сама проблема — мне нужно переписать код программы указанной ниже на python(не всю программу а только код логина с помощью requests на сайт https://vega.ua/) Итак есть программа AnyBalance на андройд на которую ставятся пакеты которые как сообщает программа работают на java. Вот сам пакет http://anybalance.ru/catalog/ab-telephony-vegatele/ В файле main.js сам код логина и парсинга сайта https://vega.ua/ но почему то прописанный как https://my.vegatele.com/ Я находил ответы как залогиниться на сайт с помощью requests но единственный рабочий ответ который я нашел это https://stackoverflow.com/a/61140905/12045924 Но мне нужна полная автоматика потому этот ответ не подходит. Повторяя проблему — нужен код на питоне который бы заходил на сайт и только. Также есть ещё один вопрос — в файле main.js есть строки 49-53 getParam которые как раз и получают значения с сайта. Мне нужно понять как получить значение на изображении. Строку с новой ссылкой на страницу я могу записать а вот как правильно написать строку получения значения не могу. Ну и сам код на питоне который я успел написать но который не хочет заходить(headers использую которые дал выше приведённый ответ)
import requests from bs4 import BeautifulSoup g_headers = < 'Connection': 'keep-alive', 'sec-ch-ua': '^\\^Google', 'sec-ch-ua-mobile': '?0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'referer': 'https://my.vegatele.com/ru/auth/login', 'Accept-Language': 'ru,ru-RU;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6', >login = requests.get('https://my.vegatele.com/ru/auth/login', headers=g_headers) soup = BeautifulSoup(login.text, features="lxml") for n in soup('input'): if n['name'] == '_csrf': token = n['value'] break header = < 'referer':'https://my.vegatele.com/ru/auth/login', 'X-CSRF-Token':token, 'X-Requested-With':'XMLHttpRequest'>html = requests.post('https://my.vegatele.com/ru/auth/login', < 'login':'login', 'password':'password', >, headers=header) html = requests.get('https://my.vegatele.com/ru/auth/login', headers=g_headers) print(html.text)
P.S. Извиняюсь если это был не java а java script
Отслеживать
76.7k 6 6 золотых знаков 54 54 серебряных знака 120 120 бронзовых знаков
задан 24 янв 2021 в 1:26
Dobrodeetel Dobrodeetel
1 1 1 бронзовый знак
Лучше в вопросе предоставить всю информацию. Например, вы пытались переписать на питон код с другого языка, тот код нужно предоставить в сам вопрос, т.к. вопрос должен быть самодостаточным, к тому же это повысит шансы получить ответ (мне лично лень переходить по ссылкам и там что-то качать) 🙂
24 янв 2021 в 4:15
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
POST запрос на https://my.vegatele.com/ru/auth/login вернулся с 200 Ok , вместо 403 Forbidden .
import requests from bs4 import BeautifulSoup url = 'https://my.vegatele.com/ru/auth/login' session = requests.session() session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36' rs = session.get(url) root = BeautifulSoup(rs.content, 'html.parser') name_by_value = dict() for input_el in root.select('#vega_auth_login input[name]'): name = input_el['name'] name_by_value[name] = input_el.get('value', '') name_by_value['login'] = '1111' name_by_value['password'] = '2222' auth_data = < f'vega_auth_login[]': value for name, value in name_by_value.items() > session.headers.update(< 'X-CSRF-Token': name_by_value['_csrf'], 'X-Requested-With': 'XMLHttpRequest', >) rs = session.post(url, files=auth_data) print(rs) #
А чтобы получить 200 сделал следующее:
Посмотрел в браузере на запрос авторизации и увидел расхождение.

- В запросе отправляется и _csrf , т.к. он присутствует на форме в виде input .
- В запросе каждое поле из input оборачивается в vega_auth_login[] , т.е. не login , а vega_auth_login[login] (у той формы id=’vega_auth_login’ , наверное, такое правило оборачивания названий полей):
- В запросе Content-Type будет multipart/form-data , а у вас получится application/x-www-form-urlencoded , т.к. попадет в параметр data , а для того запроса нужно будет передавать в files :
# Тут перечислить поля login_data = < . >html = requests.post('https://my.vegatele.com/ru/auth/login', files=login_data, headers=header)
# These two lines enable debugging at httplib level (requests->urllib3->http.client) # You will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA. # The only thing missing will be the response.body which is not logged. try: import http.client as http_client except ImportError: # Python 2 import httplib as http_client http_client.HTTPConnection.debuglevel = 1 # You must initialize logging, otherwise you'll not see debug output. import logging logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True import requests .
Парсинг сайта с применением авторизации

Любой, кто когда-либо пытался парсить сайты на python начинал с простого запроса «get» библиотеки «requests». Запрос «get» выгружает html код страницы, который можно обрабатывать под свои нужды.
Но иногда данные доступны только после авторизации на ресурсе. В этом посте я покажу, как можно подключаться, используя логин-пароль и библиотеку «requests».
Использование сессий дает преимущества в скорости парсинга данных и исключает блокировку учетной записи. Если приходится выгружать данные — страницу сайта за страницей, при каждом новом запросе будет создаваться новый запрос с новым подключением к сайту, при использовании сессии она создается один раз и используется на всем протяжении работы.
Возьмем сайт https://ivi.ru/ и попытаемся залогиниться.

Для авторизации требуется ввести email и пароль. В библиотеке requests есть метод «POST», с помощью которого реализуются отправки данных на сервер. Общий вид использования метода: «requests.post(url, headers, data)». «url» ссылка на ресурс, «headers» заголовки запроса, «data» данные запроса, которые мы будем передавать.
Импорт, авторизация и исходные параметры
pip install requests
Прежде всего, нужно узнать, откуда брать данные «headers» и «data». Для этого запустим инструмент разработчика. Переходим во вкладку СЕТЬ и обновляем страницу. Здесь видим все активности сети.

На главной странице сайта входим в профиль. Открывается форма авторизации, вводим логин-пароль и нажимаем кнопку ВОЙТИ. Ищем нашу ссылку.
Чтобы быстрее находить нужную строку в отображении полей нужно добавить поле «Method» и по нему отсортировать столбец. Данные на авторизацию отправляются в «POST» запросах.
Находим строку v5/

Смотрим информацию по этой строке

Во вкладке «headers» находим «General» в нем возьмем «url», в «Request Headers» нас интересует только «User-Agent», который пропишем в «headers», в «Form Data» данные для запроса «data».
import requests
url = 'https://api.ivi.ru/mobileapi/user/login/ivi/v5/'
headers = < 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36' >
data =
Создаем сессию, она будет держать наше соединение с сайтом, и мы сможем с ним работать.
session = requests.Session() session.headers.update(headers) response = session.post(url, data=data)
Смотрим статус ответа
response
Ответ 200 означает успешный ответ от сервера.
Посмотрим, что возвратил наш запрос
response.json()
, 'email': 'test@yandex.ru', 'email_real': 1, 'msisdn': '', 'confirmed': 1, 'storageless': False, 'is_debug': False, 'children': [], 'basic': '0.0000', 'bonus': '0.0000'>>
Здесь важная строка «session», которая указывает на наш номер сессии. Дальше в примере будет видно, что, если бы мы не создали сессию, изменить данные нам бы не удалось.
Попробуем поменять данные профиля. Нажимаем на кнопку редактировать и меняем имя.

Ищем в инструменте разработчика нашу строку. Чтобы не было много записей, можно сразу же после нажатия кнопки сохранить остановить загрузку страницы, «POST» запрос на изменение будет идти первым, только после этого происходит загрузка страницы с обновленными данными.

Записываем «url» и копируем «data». Необходимо обратить внимание на строку «session», где нужно передать наш номер сессии. Номер берем из ответа сервера.
url_change_nick = 'https://api.ivi.ru/mobileapi/user/info/v5/'
session_id = response.json()['result']['session'] data =
response = session.post(url_change_nick, data=data)
Чтобы удостовериться в работе нашего кода обновляем страницу в браузере.

Наш код успешно сработал.
Использование учетных данных WINDOWS
Также бывают редкие случаи, когда нужно использовать логин-пароль от учетной записи Windows. Для этого можно использовать библиотеку «requests-negotiate-sspi». Она становится особенно полезной, когда часто меняется пароль от учетной записи.
Устанавливаем и импортируем библиотеку, нам нужен метод «HttpNegotiateAuth»
pip install requests_negotiate_sspi from requests_negotiate_sspi import HttpNegotiateAuth
Повторяем все, что делали выше: прописываем «headers», заполняем «data» и поднимаем сессию. Попробуем получить дату и время сервера.
Вначале сделаем запрос без передачи данных авторизации
xml_request = ''' ''' headers = < 'Host': host_name, 'Content-Type': 'text/xml; charset=utf-8', 'Content-Length': str(len(xml_request)) >session.headers = headers
response = session.post('http://' + host_name + '/ServerService.asmx?WSDL', data=xml_request) response
Посмотрим текст ответа
response.text
401 - Unauthorized: Access is denied due to invalid credentials.
Как мы видим ошибка авторизации.
Повторяем запрос с использованием «HttpNegotiateAuth»
response = session.post('http://' + host_name + '/ServerService.asmx?WSDL', auth=HttpNegotiateAuth(), data=xml_request) response.text
44298.576980902777
Ответ на запрос даты и времени сервера получен успешно.
Sessions позволяет вам использовать requests более эффективно и решать проблемы с подключением к аккаунту, ускорять работу выполнения запросов и исключать блокировку при ограничении количества соединений.
Как залогиниться на сайте при помощи python requests?
День добрый
Есть задача спарсить сайт https://www.strava.com, для парсинга используем Python.
Парсить надо внутренние пользовательские данные сайта. Для этого надо залогинеца, а с этим проблема. Что бы мы не пробовали пока результат отрицательный. Нужна помощь специалиста в этом вопросе.
Заранее спасибо
from bs4 import BeautifulSoup import requests from fake_useragent import UserAgent from time import sleep def authorize(): headers = < 'User-Agent': UserAgent().chrome, ># utf8: ✓ # 'utf8': '✓', login_data = < 'utf8': '✓', 'plan': '', 'email': 'mail@ru', 'password': 'pass', >with requests.Session() as s: s.get('https://www.strava.com') s.verify = False url = 'https://www.strava.com/login/' r = s.get(url) soup = BeautifulSoup(r.text, 'html5lib') login_data['authenticity_token'] = str(soup.find('input', attrs=)['value']) headers['X-CSRF-Token'] = soup.select_one('meta[name="csrf-token"]')['content'] headers['cookie'] = '; '.join([x.name + '=' + x.value for x in s.cookies]) sleep(1) r2 = s.post(url, data=login_data, headers=headers) r3 = s.get('https://www.strava.com/clubs/225082/members') sleep(1) print(r3.text) def main(): authorize() if __name__ == '__main__': main()
- Вопрос задан более трёх лет назад
- 3198 просмотров
Комментировать
Решения вопроса 1

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Да тут делов на 2минуты:
import requests from bs4 import BeautifulSoup import time headers = data = url = 'https://www.strava.com/session' session = requests.Session() # Сессия def get_token():# Метод, для получения токена response = session.post(url,headers=headers) soup = BeautifulSoup(response.text,"html.parser") token = soup.find('input',).get('value') return token # Возвращает токен def auth(): # Метод, для авторизации response = session.post(url,headers=headers,data=data) return response.text data['authenticity_token'] = get_token() # Вызывает метод для получения токена, и результат заносим в словарь time.sleep(2) # Пауза 2 сек :) html = auth() # Авторизируемся. В html будет наш ответ после авторизации if 'Log Out' in html: # Если строка 'Log Out' есть в html, значит авторизация прошла успешно print('Login OK!') else: print('Login Error!')
Если что не понятно, пишите.
Ответ написан более трёх лет назад
Нравится 4 1 комментарий
Павел Иванов @Ivanov_pv Автор вопроса
Спасибо большое за помощь, все работает
Ответы на вопрос 1

Назар Тропанец @nazartropanets
изучаю deep learning и ML(Python)
Попробуйте промониторить через Network вход в аккаунт(нажимаете f12 и выбираете Network), логинитесь и отсылаете форму. Во вкладке Network должны были отослатся данные входа на сервер, посмотрите что передается, вероятнее всего вместе с паролем и именем передается какой-то токен, и из-за этого не получается выполнить авторизацию. Для авторизации нужно передавать все данные которые должны передаватся, а не только юзернейм и пароль.
Ответ написан более трёх лет назад
Павел Иванов @Ivanov_pv Автор вопроса
Да токен тоже предается в коде он он добавляется тут
. login_data['authenticity_token'] = str(soup.find('input', attrs=)['value']) .
Промониторить через Network в гуглхроме, вот вся выдача что была с post запросом
В коде формируется первые шесть строчек с реализацией токена, а что еще добавлять?
Подскажите если не сложно?
utf8: ✓ authenticity_token: YW0S8lRJ/EqPqkS/wTUj5qCRExIgpzIn9Ryd/A3xuJQQVSKaoozomMDW2LDnDkdrD0UShE8S3FGKWv8199ws3w== plan: email: mail@.ru password: pass event: pageview metadata: initial_referrer: https://www.strava.com/login is_iframe: false user_language: ru open_app: false has_app_websdk: false feature: journeys callback_string: branch_view_callback__1 data: source: web-sdk branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm session_id: 792280983689258684 identity_id: 791901031512693012 sdk: web2.53.1 browser_fingerprint_id: 707829489312081104 event: web-login metadata: initial_referrer: https://www.strava.com/login browser_fingerprint_id: 707829489312081104 identity_id: 791901031512693012 sdk: web2.53.1 session_id: 792353521164926825 branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm identity_id: 792353521173559587 identity: 58983723 browser_fingerprint_id: 707829489312081104 sdk: web2.53.1 session_id: 792353521164926825 branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm

Назар Тропанец @nazartropanets
Павел Иванов, да, вы передаете все параметры, но я не могу понять в чем проблема
Попробуйте выввести все параметры, которые вы передаете, и проверьте в чем может быть проблема
Возможно в plan нужно передовать — » «, вместо — «»
Как авторизоваться на сайте с помощью python requests?
Я наверное упускаю что-то фундаментальное. Я уже пробовал на разных сайтах — результат один и тот же — код страницы без авторизации.
Хочу авторизоваться, получить куки и работать с сайтом передавая куки.
- Вопрос задан более трёх лет назад
- 57879 просмотров
Комментировать
Решения вопроса 2

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, >)