Форум сайта python.su
0
Здравствуйте. Погомогите пожалуйста хоть каким-нить советом
Решила попробовать свое первое реальное практическое задание в жизни. По работе имею дело с кучей выписок и захотелось автоматизировать процесс скачивания огромного кол-ва. Есть внутренний портал с личнм кабинетом. С авторизацией сумела самостоятельно разобраться и думала, что это самое сложное. Но оказалось, что взять другую страницу для дальнейшей обработки (простейшая задача) не выходит, она не отдается корректно. Мне кажется, там какие-то защитные механизмы не позволяют и я их не до конца понимаю. Я поняла, что используется защита от 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())
Отредактировано sweetlan@ (Фев. 25, 2019 05:57:49)
Прикреплённый файлы:
Screen Shot 2019-02-22 at 3.51.10 PM.png (24,1 KБ)
Офлайн
857
sweetlan@Что ты прибавляешь к адресу страницы?s.get('https://login.site.com/off/st/Stat.htm' + token
Офлайн
0
py.user.next1. Прибавляю токен который греплю из страницы еще до авторизации, он есть в одном из HTML тегов в значении ссылки, вот оттуда его выдераю и через переменную token куда нужно вставляю, ведь в окне браузера все ссылки с этим токеном, без токена страницы не загрузятся.
Отредактировано sweetlan@ (Фев. 23, 2019 04:50:55)
Офлайн
857
Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.
Офлайн
0
py.user.nextОй, моя ошибка когда писала сообщение и оно куда-то делось, в коде именно так Stat.htm?csrfToken=' + token, точно также как и у реферера. Т.е. строчка должна быть такой
Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.
r2 = s.get('https://login.site.com/off/st/Stat.htm?csrfToken=' + token, headers=head, cookies=coo)
Офлайн
857
Значит, надо узнать, что отсылается через питон.
Можешь чисто наугад ковырять печенье. Оно неправильно переделывается, так как превращать словарь в строку в питоне не принято. Скорее всего, ошибка где-то там, но может и в другом месте быть. Например, что-то не передаётся, а должно передаваться; а не передаётся потому, что теряется где-то при переделывании.
Чтобы это решить эффективнее, нужно:
1) Узнать, что именно посылается браузером.
2) Узнать, что именно посылается питоном.
3) Выровнять то, что посылается питоном, до такой степени, чтобы это было неотличимо от браузера.
Обычно (хоть ты и говоришь, что там супер-защита) никакой супер-защиты нет. Нужно выделить только самые ключевые элементы и их использовать.
sweetlan@Вот эти все заголовки вообще можно не передавать. Они никогда не проверяются, меняются от браузера к браузеру и вообще нафиг не нужны. А вот в печенье может быть что-то важное и оно не соблюдено. Часто там вся защита строится на referer + agent + печенье.'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',
Отредактировано py.user.next (Фев. 25, 2019 09:45:38)
Офлайн
0
Спасибо за наводки, буду пробовать и перепроверить все.
Офлайн