Найти - Пользователи
Полная версия: Авторизация с помощью Requests
Начало » Python для новичков » Авторизация с помощью Requests
1
Panzershracker
Добрый день!
Уже месяц ломаю голову над авторизацией на одном ресурсе, не пойму почему у меня не получается.
Итак, я пробовал делать это с помощью Реквеста, но не особо получается, вроде все делаю правильно,
и данные какие нужно отправляю, но все безуспешно. Единственное как у меня получилось пройти авторизацию так это с помощью selenium webdriver, но в нем мне ,пока, еще сложнее разобраться, так что хотелось бы использовать реквестс, да и скорость с ним выше.
Скажу сразу, обковырял весь гугл, смотрел кучу видео, прочитал Web Scraping with Python изд. O'reilly, Но, она не особо мне помогла в этом вопросе.
Возможно, есть совет по какой нибудь литературе, которая придется к месту.
Вот код:
 import requests
from bs4 import BeautifulSoup as soup
# from pathlib import Path
GB = 'https://geekbrains.ru'
LOGIN_URL = 'https://geekbrains.ru/login'
CPT = 'https://geekbrains.ru/wanna_captcha'
with requests.Session() as session:
    r = session.get(GB)
    print(f'Code for {GB} is :', r.status_code)
    soup = soup(r.text, 'lxml')
    token = soup.select_one('[name="authenticity_token"]')['value'] #str class
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    r = session.post(CPT, data = {'user[email]': 'mail',
                                  'user[password]': 'pass',
                                  'authenticity_token' : token,
                                  'utf8': 'true',
                                  'user[remember_me]': '0',
                                  'user-agent': user_agent})
    cpt = session.get(CPT)
    log_url = session.get(LOGIN_URL)
    print(f'Code for {CPT} is :', cpt.status_code)
    print(f'Code for {LOGIN_URL} is :', log_url.status_code)

Все видео, так или иначе, похожи на мой скрипт, но проблема в том, что у авторов выходит, а у меня - нет!
После логина есть промежуточная страница /wanna_captcha, код ответа которой 302. В form data там содержатся пароль, логин, utf8: ✓, запомнить меня и authenticity_token. Как я понимаю, это те данные что она пересылает на целевую страницу… Через скрипт код ответа с этой страницы 404.
Короче, подскажите пожалуйста.

Code for https//ресурс is : 200
Code for https//ресурс/wanna_captcha is : 404
Code for https//ресурс/login is : 200

JOHN_16
Panzershracker
После логина есть промежуточная страница /wanna_captcha, код ответа которой 302
кхм… капча…302.. Наверное кто то хочет что бы вы подтвердили что вы не от бездушный?
ЧТо такое капча понимаете?
ЧТо такое код 302 (редирект) понимаете? Что предполагается делать в этом случае?
В этом и ответ видимо
Panzershracker
JOHN_16

На странице ничего нет. Никакой капчи. Я имею ввиду в графическом смысле.
Что делать в этом случае не понимаю. Слал Пост и на эту ссылку в том числе, ничего не дало, если вы об этом.
Panzershracker
Видимо, после одного сомнительного ответа помощь закончилась)
JOHN_16
Panzershracker
ну ладно вам..
вот вы на страницу /wanna_captcha переходили? Мне просто не понятно насколько вы хорошо понимаете то что делаете.
P.S. если вы пишите бота как именно вы собрались капчу обходить?
Panzershracker
JOHN_16
Panzershrackerну ладно вам..вот вы на страницу /wanna_captcha переходили? Мне просто не понятно насколько вы хорошо понимаете то что делаете.P.S. если вы пишите бота как именно вы собрались капчу обходить?

Ну начну поэтапно…
- что я делаю - понимаю не до конца, тк я новичок.
- на капчу заходил (там сообщение, что такой страницы нет и веселая картинка), скрин приложу.
- ну вроде как это не совсем бот, пока пытаюсь просто авторизоваться методами реквеста, а дальше будет видно. Будем решать преблемы по мере возникновения

По поводу моего видения - это паттерн post/redirect/get, о нем я чисто случайно прочел вчера, и он очень походит на мою ситуацию. Заключается в недопущении повторной отправки формы (как то так), то есть, как я понимаю, сначала должен идти post потом get…как то так. И вот, этот метод, просто подразумевает редирект с кодом 302/303, который я собственно и получаю, и, как мне кажется, капчей там особо и не пахнет, просто я не до конца понимаю что делаю.
==============
Вру! вне авторизации страница выдает код 404. 302 выдает только при редиректе (почему? связано с куки, токеном, заголовками? с чем?)
JOHN_16
ну нет, не повторная отправка формы, а подтверждения чт овы человек, для предотвращения программного захода.
Вообще стандартный алгоритм такой
заходите на страницу авторизации, посылаете POST (обычно) запрос с данными формы.
В ответе вам приходит какой нибудь либо все ок и перенаправление на страницу уже в статусе атворизированого пользователя, либо хотим капчу и перенаправление на страницу с капчей.
На странице с капчей форма поля которой (включая скрытые) отправляются POST запросом и уже по этому результату либ все ок и перенаправление на страницу либо не ок.
КОнкретная реализация этого алгоритма, как вы можете догадаться, различается от сайта к сайту.
aiscy
 import requests
from bs4 import BeautifulSoup as soup
from urllib.parse import urljoin
with requests.Session() as session:
    session.headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    session.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0'
    resp = session.get('https://geekbrains.ru/login')
    auth_token = soup(resp.text, 'lxml').select_one('input[name="authenticity_token"]')['value']
    resp = session.post(
        'https://geekbrains.ru/wanna_captcha',
        data={
            'user[email]': '',
            'user[password]': '',
            'user[remember_me]': 0,
            'authenticity_token': auth_token,
            'utf8': '✓'
        }
    )
    url_user_profile = soup(resp.text, 'lxml').select_one('li.gb-top-menu__item.dropdown > a')['href']
    resp = session.get(urljoin('https://geekbrains.ru', url_user_profile))
    user_name = soup(resp.text, 'lxml').select_one('div.user-info > div > span').text
    print('Logged as', user_name)
Panzershracker
JOHN_16
ну нет, не повторная отправка формы, а подтверждения чт овы человек, для предотвращения программного захода.Вообще стандартный алгоритм такойзаходите на страницу авторизации, посылаете POST (обычно) запрос с данными формы.В ответе вам приходит какой нибудь либо все ок и перенаправление на страницу уже в статусе атворизированого пользователя, либо хотим капчу и перенаправление на страницу с капчей.На странице с капчей форма поля которой (включая скрытые) отправляются POST запросом и уже по этому результату либ все ок и перенаправление на страницу либо не ок.КОнкретная реализация этого алгоритма, как вы можете догадаться, различается от сайта к сайту.

Ясно, что ничего не ясно)

aiscy
ОДНАКО!!! Спасибо!
Кстати, есть какая либо рекомендация по тому, какие заголовки указывать? их там тьма, не знал что выбрать… Может есть какие-то боле-менее общие рекомендации?

Ребят, а есть рекомендация по литературе какой-нибудь чтоб лучше в теме разбираться? Готовый код - это конечно супер, но понимание важнее.
Заранее благодарен!
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