Найти - Пользователи
Полная версия: Помогите с работой внутри кабинета
Начало » Python для новичков » Помогите с работой внутри кабинета
1
sweetlan@
Здравствуйте. Погомогите пожалуйста хоть каким-нить советом
Решила попробовать свое первое реальное практическое задание в жизни. По работе имею дело с кучей выписок и захотелось автоматизировать процесс скачивания огромного кол-ва. Есть внутренний портал с личнм кабинетом. С авторизацией сумела самостоятельно разобраться и думала, что это самое сложное. Но оказалось, что взять другую страницу для дальнейшей обработки (простейшая задача) не выходит, она не отдается корректно. Мне кажется, там какие-то защитные механизмы не позволяют и я их не до конца понимаю. Я поняла, что используется защита от 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())
py.user.next
sweetlan@
  
s.get('https://login.site.com/off/st/Stat.htm' + token
Что ты прибавляешь к адресу страницы?
sweetlan@
py.user.next
1. Прибавляю токен который греплю из страницы еще до авторизации, он есть в одном из HTML тегов в значении ссылки, вот оттуда его выдераю и через переменную token куда нужно вставляю, ведь в окне браузера все ссылки с этим токеном, без токена страницы не загрузятся.
2. Прибавляю заголовки
3. Прибавляю 1 куки имя его INT_OPT_LOW
py.user.next
Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.
sweetlan@
py.user.next
Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.
Ой, моя ошибка когда писала сообщение и оно куда-то делось, в коде именно так Stat.htm?csrfToken=' + token, точно также как и у реферера. Т.е. строчка должна быть такой
  r2 = s.get('https://login.site.com/off/st/Stat.htm?csrfToken=' + token, headers=head, cookies=coo)
но к сожалению никакой разницы и 404 как обычно получаю.
Поправила свое первое сообщение, чтобы без ошибки было.
Кстати отравляя запрос, что с токеном, что без него, результат все равно 404.
py.user.next
Значит, надо узнать, что отсылается через питон.

Можешь чисто наугад ковырять печенье. Оно неправильно переделывается, так как превращать словарь в строку в питоне не принято. Скорее всего, ошибка где-то там, но может и в другом месте быть. Например, что-то не передаётся, а должно передаваться; а не передаётся потому, что теряется где-то при переделывании.

Чтобы это решить эффективнее, нужно:
1) Узнать, что именно посылается браузером.
2) Узнать, что именно посылается питоном.
3) Выровнять то, что посылается питоном, до такой степени, чтобы это было неотличимо от браузера.

Обычно (хоть ты и говоришь, что там супер-защита) никакой супер-защиты нет. Нужно выделить только самые ключевые элементы и их использовать.
sweetlan@
        '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',
Вот эти все заголовки вообще можно не передавать. Они никогда не проверяются, меняются от браузера к браузеру и вообще нафиг не нужны. А вот в печенье может быть что-то важное и оно не соблюдено. Часто там вся защита строится на referer + agent + печенье.

Для анализа того, что посылает браузер, надо открыть консоль браузера и записать оттуда все запросы-ответы.
Для анализа того, что посылает питон, можно использовать netcat. Только там везде https надо заменить на http, чтобы шифрование было убрано. Через netcat можно посылать ответы на запросы, которые питон будет принимать, обрабатывать и дальше что-то запрашивать на основе принятых данных.
Дальше ты просто сравниваешь эти две сессии (браузерную и потонью) между собой и ищешь то, чего не хватает в питоньей.

Можно и прослушать обмен между браузером и этим настоящим сервисом, но тогда в сниффер (Wireshark или tcpdump) нужно вставить SSL-ключ, чтобы расшифровывать https-трафик на лету, - довольно-таки не тривиальная задачка, потому что когда ключ туда вставляешь, он как не расшифровывал ничего, так и не расшифровывает. И там нигде не написано, в чём ошибка.
sweetlan@
Спасибо за наводки, буду пробовать и перепроверить все.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB