Stack Overflow на русском Asked by oneren37 on November 10, 2021
Пытаюсь спарсить контент доступный только авторизованному пользователю. реализовать авторизацию у меня получилось. Post запрос возвращает страничку "вы успешно авторизовались бла бла … " и в session.cookies появляются кукисы. Я так понимаю, что эти куки нужны чтобы сервер понимал, что мы авторизовались. так вот вопрос заключается в том как эти куки передавать серверу при дальнейших запросах? потому что когда я пытаюсь получить страницу session.get(some_url, cookies = session.cookies)
возвращается страница авторизации
import requests
from bs4 import BeautifulSoup as bs
session = requests.Session()
#get CSRF
r = session.get('https://cas.spbstu.ru/login?service=https%3A%2F%2Fcas.spbstu.ru%2Foauth2.0%2FcallbackAuthorize%3Fclient_id%3D5cae4f19-00ac-4910-b731-8e44065ad93d%26redirect_uri%3Dhttps%253A%252F%252Fdl.spbstu.ru%252Fauth%252Fspbstu%252Fredirect.php%253Fauth_service%253Dspbstu_oauth2%26response_type%3Dcode%26client_name%3DCasOAuthClient')
page = bs(r.content, 'html.parser')
csrf = page.select('input[name="execution"]')[0]['value']
#login
url = 'https://cas.spbstu.ru/login?service=https%3A%2F%2Fcas.spbstu.ru%2Foauth2.0%2FcallbackAuthorize%3Fclient_id%3D5cae4f19-00ac-4910-b731-8e44065ad93d%26redirect_uri%3Dhttps%253A%252F%252Fdl.spbstu.ru%252Fauth%252Fspbstu%252Fredirect.php%253Fauth_service%253Dspbstu_oauth2%26response_type%3Dcode%26client_name%3DCasOAuthClient'
params = {
'username' :'*******',
'password' :'*******',
'execution' : csrf,
'_eventId' :'submit',
'geolocation':''
}
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',
'Referer': 'https://dl.spbstu.ru/my/',
'Connection': 'keep-alive',
}
answer = session.post(url, data = params, headers = headers)
answ_bs = bs(answer.content, 'html.parser')
# print(answ_bs)
content_page = session.get('https://dl.spbstu.ru/my/')
content = bs(content_page.content, 'html.parser')
print(content)
print(session.cookies)
Если попытаться залогинится введя рандомные логин и пароль, можно заметить что серверу отправляется
username: Alex12345
password: 321312312
execution: 49848f0b-e9d5-481c-aa86-b0cb09e170b3_ZXlKaGJHY2lPaUpJVXpVeE1pSjkuaDlqNklyRmN0NUxiOVk4ejNFSkw1MEw3akp2ak9tVUlhbjV1ZE5XbFVKVVNiYVhoV<...>zBuQ1JLU0hB
_eventId: submit
geolocation:
Принцип генерации первых и последних двух понятен, а вот третий вызывает вопросы. Первичный осмотр загружаемы JS (в разделе Sources) не привел к этому пониманию. К сожалению я не могу провести полный реверс инжиниринг, т.к. не знаю логин пароль (на сайте не предусмотрена регистрация), однако я бы мог посоветовать вам использовать Selenium + Firefox web driver:
Запусукаем браузер и получаем доступ к старнице. Желательно все урлы поместить в отдельный фалйл config а конфиденциальные данные (лог пароль) в переменные среды.
import config
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("config.URL")
Дале находим поля ввода лог и пароля:
fields = find_elements_by_class_name("form_input")
login_area = field[0]
pass_area = fields[1]
Далле пишем в них текст при помощи методов
.switchTo().activeElement().sendKeys("some text data _ 123 !@#%^&*()_+");
Первый переключит виртуальный "КУРСОР" на это поле второй сделает его активным а 3-ий введёт текст
Далее находим кнопку (!!! Она становится активна только поссле заполнения верхних полей, попытка сделать этот блок кода раньше приведет к ошибке, хотя из архитектурных соображений лучше его поместить к login и pass area!!!)
button_login = find_element_by_id("btn btn-rounded submit")
button_login.click()
P.S. Для использования селениума вам так же потребуется скачать webdriver.Firefox или webdriver.Chrome
Answered by BlueScreen on November 10, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP