Решила попробовать свое первое реальное практическое задание в жизни. По работе имею дело с кучей выписок и захотелось автоматизировать процесс скачивания огромного кол-ва. Есть внутренний портал с личнм кабинетом. С авторизацией сумела самостоятельно разобраться и думала, что это самое сложное. Но оказалось, что взять другую страницу для дальнейшей обработки (простейшая задача) не выходит, она не отдается корректно. Мне кажется, там какие-то защитные механизмы не позволяют и я их не до конца понимаю. Я поняла, что используется защита от csrf и что нужно всегда использовать в запросах токен и скорее всего и куки INT_OPT_LOW в которой также что-то зашифировано, пример вывода куки $coo: PasdflwerKASdhwerj-epYDFsdf-!23948234123-33212387, вывод $token: vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=
При авторации отправляя запрос на https://login.site.com/off/pub/j_check происходит следующее:
1. по 302 редиректу перенаправляет на https://login.site.com/off/
2. опять 302 но уже на https://login.site.com/off
3. еще раз 302 на https://login.site.com/off/gen/initSession?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=
4. и последний раз 302 на домашнюю https://login.site.com/off/gen/Home.htm?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT= после чего пытаюсь перейти по любой ссылке, например https://login.site.com/off/st/Stat.htm?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=
в браузере при таком переходе никакие редиректы не происходят запросы точно такие же как у меня (я их скопировала и передаю идентичные), ответы по браузеру как на скриншоте, а через питон получаю ответ с 404 ошибкой.
Пробовала в браузере грузить ссылку без токена и также получаю 404. Поэтому, складывается впечатление, что через питон запрос уходит без токена, но ведь в коде в запросе токен присваивается, да и сессия также используется. Может еще какие-то параметры упускаю, куда рыть!?
import requests from bs4 import BeautifulSoup import requests.cookies from urllib.parse import urljoin html_doc = requests.get('https://login.site.com/off/pub/preEnt.htm').text soup = BeautifulSoup(html_doc) tokenstart = soup.find('div', 'col-lg-6 col-12 align-to-cta') for a in tokenstart.find_all('a'): token1 = a.get('href') tok = token1.split('Token=') token = tok[1] def logbot(): s = requests.Session() s.get('https://login.site.com/off/pub/preEnt.htm') d = {'j_usr': 'USEER', 'j_pwd': 'PASSW00RD', 'csrfToken': token } r = s.post('https://login.site.com/off/pub/j_check', data=d, allow_redirects=True) p = str(s.cookies.get_dict()) o = list(p.split(': ')) p1 = o[1] cook = "".join(c for c in p1 if c not in '\'}') coo = {'INT_OPT_LOW': cook} head = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Connection': 'keep-alive', 'Host': 'login.site.com', 'Referer': 'https://login.site.com/off/gen/Home.htm?csrfToken=' + token, 'Upgrade-Insecure-Request': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0' } r2 = s.get('https://login.site.com/off/st/Stat.htm?csrfToken=' + token, headers=head, cookies=coo) return r2.text print(logbot())