Форум сайта python.su
Здравствуйте!
Для авторизации использую модуль requests.
Пробовал сразу requests.post(url, data={'login':'mylogin', ‘passwd’:'mypass', headers=headers)
Response возвращает код 200, но content возвращает либо страницу passport.yandex.ru, либо код 400.
Пробовал использовать сеанс. Session=requests.sessions().
Затем response=Session.post(url, data={'login':'mylogin', ‘passwd’:'mypass', headers=headers). Тоже самое.
Пробовал использовать модуль lxml для чтения параметров формы авторизации. При чем, там при первом обращении по url авторизации в форме виден только login, а password не выдаётся. Поэтому запросом вида Session (form.action, data=form.form_values(), headers=headers) не отправить поле пароля.
Также пробовал авторизоваться через BasicAuth. Тоже не получилось. Может я где-то ошибся с порядком действий или ещё чего. В общем, если может кто помочь, хотя бы подсказать порядок действий и способ авторизации.
Офлайн
Надо тебе сначала проанализировать процесс авторизации. Для этого нужен браузер и в нём нужно открыть консоль разработчика, а потом просмотреть там отправляемые запросы и получаемые на них ответы. После этого можно через питон с его модулями воспроизвести процесс, который в браузере выполнялся и привёл к нужному результату.
dimanodg
Пробовал сразу
dimanodg
Пробовал использовать сеанс
dimanodg
Пробовал использовать модуль lxml
dimanodgВместо того чтобы тыкать пальцем во все места, где надо и где не надо, надо провести предварительный анализ процесса. Чаще всего все эти способы оказываются не нужны и срабатывает самый первый. Только надо точно узнать, что в это время передаётся, в том числе и в неявном виде (заголовки, печенье).
Также пробовал авторизоваться через BasicAuth
Отредактировано py.user.next (Апрель 6, 2020 19:03:51)
Офлайн
Все смотрел. Я же говорю, там хитро устроено. Сначала форма с post запросом, где нет поля password, далее срабатывает череда JavaScript, затем идёт ввод пароля. Я пробовал передавать параметры в несколько этапов. Но не выходит. Один раз получилось авторизоваться. Я даже страницу эту сохранил в файл.))) Потом продолжил эксперименты и сейчас уже не могу воспроизвести те запросы. Но дело в том, что авторизация прошла, но потом я куки передаю в get запрос на kinopoisk, а возвращается 404.
Офлайн
dimanodgJavaScript работает у тебя в браузере и нужен только для того, чтобы сформировать следующий запрос и послать его на сервер. Сервер не знает, как у тебя выполняется JavaScript (даже если посылает тебе эти JavaScript-скрипты), он только запросы получает от тебя по протоколу HTTP. Когда запрос HTTP посылается, он может сопровождаться параметрами, которые находятся либо в адресе запрашиваемого ресурса, либо в заголовках запроса (к ним же относится и печенье - это просто заголовки запроса), либо в теле запроса (данные в POST-запросе, например). Никакой JavaScript там не фигурирует вообще даже близко.
далее срабатывает череда JavaScript
dimanodgЭтот пароль потом будет засунут в HTTP-запрос в каком либо виде и просто отослан на сервер внутри HTTP-запроса. Сервер не знает, что у тебя там происходит, он даже не знает, вводишь ли ты пароль, потому что просто не может к тебе в компьютер залезть.
далее срабатывает череда JavaScript, затем идёт ввод пароля
dimanodgПеченья может быть недостаточно. Оно может быть необходимо (хотя это тоже не всегда бывает и печенье можно не передавать), но при этом может быть недостаточно и вместе с печеньем нужно ещё что-то передавать.
Но дело в том, что авторизация прошла, но потом я куки передаю в get запрос на kinopoisk, а возвращается 404.
Офлайн
буду дальше смотреть!
Нашел хороший ресурс, который из CURL формирует python script.
https://curl.trillworks.com/#
Офлайн
Авторизация на сайте КиноПоиск перенаправляет на страницу
https://passport.yandex.ru/auth/welcome?origin=kinopoisk&retpath=https%3A%2F%2Fsso.passport.yandex.ru%2Fpush%3Fretpath%3Dhttps%253A%252F%252Fwww.kinopoisk.ru%252Fapi%252Fprofile-pending%252F%253Fretpath%253Dhttps%25253A%25252F%25252Fwww.kinopoisk.ru%25252F%26uuid%3D74725e71-7544-44d1-84ba-2a6631e617c1%26reason%3Dlogin%26session-status%3DNO_AUTH
Форма авторицации имеет Action=
https://passport.yandex.ru/auth?origin=kinopoisk&retpath=https%3A%2F%2Fsso.passport.yandex.ru%2Fpush%3Fretpath%3Dhttps%253A%252F%252Fwww.kinopoisk.ru%252Fapi%252Fprofile-pending%252F%253Fretpath%253Dhttps%25253A%25252F%25252Fwww.kinopoisk.ru%25252F%26uuid%3D9baec764-9234-4dc5-8546-5dd6da98781f%26reason%3Dlogin%26session-status%3DNO_AUTH
Использую следующий скрипт для авторизации на yandex с автоматическим переходом на КиноПоиск:
import urllib import requests from bs4 import BeautifulSoup USERNAME = input('Введите вашу почту: ') PASSWORD = input('Введите ваш пароль: ') url_login = "https://passport.yandex.ru/auth?" user_id = 38983828 # Это id пользователя на КиноПоиске url_parse = "https://www.kinopoisk.ru/user/%d/votes/list/ord/date/page/1/#list" % (user_id) headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:74.0) Gecko/20100101 Firefox/74.0', # 'Accept': 'application/json, text/javascript, */*; q=0.01', # 'Accept-Language': 'en-US,en;q=0.5', # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', # 'X-Requested-With': 'XMLHttpRequest', # 'Connection': 'keep-alive', } def login_session(session): payload = urllib.parse.urlencode({ 'origin': 'kinopoisk', 'retpath': 'https://www.kinopoisk.ru/', 'login': USERNAME, 'passwd': PASSWORD, }) session.headers.update(headers) session.headers.update({'Referer':'https://www.kinopoisk.ru/'}) return session.post(url_login, data = payload) def parse_one(session): cookies=session.cookies.get_dict() print(cookies) return session.get(url_parse, cookies=cookies, headers=headers) def save_html(outfile, content): with open(outfile, 'w', encoding="utf8") as output_file: output_file.write(content.text) def print_html(outfile): with open(outfile, 'r', encoding="utf8") as output_file: for line in output_file: print(repr(line)) if __name__== '__main__': session = requests.Session() login_response = login_session(session) print(login_response.status_code) save_html('login.html', login_response) # print_html('login.html') response = parse_one(session) print(response.status_code) save_html('parse.html', response) # print_html('parse.html')
Отредактировано dimanodg (Апрель 8, 2020 21:37:41)
Офлайн
dimanodgИспользуй теги кода, без них скрипт не читается.
Использую следующий скрипт для авторизации
Офлайн
py.user.nextотредактировал
Офлайн
dimanodgСтатус 200 не может приводить к редиректу. Скорее всего, это внутренний редирект.
Вызов post-запроса авторизации на https://passport.yandex.ru возвращает статус-код 200 и редиректит на retpath -> https://www.kinopoisk.ru/.
dimanodg
Соответственно, при попытке передать session.cookies в get-запрос процедуры parse_one возвращается код 404.
dimanodgСкорее всего, ты что-то не передал.
Что я делаю неправильно?
dimanodgВыше я писал, что печенья может быть недостаточно. Недостаточно - это значит, что нужно и печенье передать, и ещё что-то передать. На одно печенье он просто думает “ну и что, что этот гаврик мне передал одно печенье, я хочу знать, где и как он его получил, а этой информации нет, так что в доступе отказано, пусть входит по-нормальному”.
Соответственно, при попытке передать session.cookies
Отредактировано py.user.next (Апрель 8, 2020 21:41:28)
Офлайн
py.user.next
Там, скорее всего, устроено так: ты заходишь на Яндекс, а Яндекс заходит на КиноПоиск и потом секрет, полученный от КиноПоиска при своём входе, передаёт тебе; затем ты этот секрет от КиноПоиска, полученный от Яндекса, передаёшь КиноПоиску и таким образом КиноПоиск тебя опознаёт как вошедшего и даёт страницу как авторизованному.
Если ты что-то недополучил от Яндекса либо что-то не додал КиноПоиску, то никакого авторизованного прохода к страницам, требующим авторизованного пользователя, он тебе не даёт.
Офлайн