Авторизация на сайте используя 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
Ответы (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[{name}]': 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)
# <Response [200]>
А чтобы получить 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, т.к.{'login':'login', 'password':'password',}попадет в параметрdata, а для того запроса нужно будет передавать вfiles:# Тут перечислить поля login_data = { ... } html = requests.post('https://my.vegatele.com/ru/auth/login', files=login_data, headers=header)Для понимания того какие данные отправляются
requests, советую включить ему отладку:# 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 ...