Найти - Пользователи
Полная версия: Python. Авторизация на КиноПоиск.
Начало » Web » Python. Авторизация на КиноПоиск.
1 2
dimanodg
Здравствуйте!
Для авторизации использую модуль 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. Тоже не получилось. Может я где-то ошибся с порядком действий или ещё чего. В общем, если может кто помочь, хотя бы подсказать порядок действий и способ авторизации.
py.user.next
Надо тебе сначала проанализировать процесс авторизации. Для этого нужен браузер и в нём нужно открыть консоль разработчика, а потом просмотреть там отправляемые запросы и получаемые на них ответы. После этого можно через питон с его модулями воспроизвести процесс, который в браузере выполнялся и привёл к нужному результату.

dimanodg
Пробовал сразу
dimanodg
Пробовал использовать сеанс
dimanodg
Пробовал использовать модуль lxml
dimanodg
Также пробовал авторизоваться через BasicAuth
Вместо того чтобы тыкать пальцем во все места, где надо и где не надо, надо провести предварительный анализ процесса. Чаще всего все эти способы оказываются не нужны и срабатывает самый первый. Только надо точно узнать, что в это время передаётся, в том числе и в неявном виде (заголовки, печенье).
dimanodg
Все смотрел. Я же говорю, там хитро устроено. Сначала форма с post запросом, где нет поля password, далее срабатывает череда JavaScript, затем идёт ввод пароля. Я пробовал передавать параметры в несколько этапов. Но не выходит. Один раз получилось авторизоваться. Я даже страницу эту сохранил в файл.))) Потом продолжил эксперименты и сейчас уже не могу воспроизвести те запросы. Но дело в том, что авторизация прошла, но потом я куки передаю в get запрос на kinopoisk, а возвращается 404.
py.user.next
dimanodg
далее срабатывает череда JavaScript
JavaScript работает у тебя в браузере и нужен только для того, чтобы сформировать следующий запрос и послать его на сервер. Сервер не знает, как у тебя выполняется JavaScript (даже если посылает тебе эти JavaScript-скрипты), он только запросы получает от тебя по протоколу HTTP. Когда запрос HTTP посылается, он может сопровождаться параметрами, которые находятся либо в адресе запрашиваемого ресурса, либо в заголовках запроса (к ним же относится и печенье - это просто заголовки запроса), либо в теле запроса (данные в POST-запросе, например). Никакой JavaScript там не фигурирует вообще даже близко.

dimanodg
далее срабатывает череда JavaScript, затем идёт ввод пароля
Этот пароль потом будет засунут в HTTP-запрос в каком либо виде и просто отослан на сервер внутри HTTP-запроса. Сервер не знает, что у тебя там происходит, он даже не знает, вводишь ли ты пароль, потому что просто не может к тебе в компьютер залезть.

dimanodg
Но дело в том, что авторизация прошла, но потом я куки передаю в get запрос на kinopoisk, а возвращается 404.
Печенья может быть недостаточно. Оно может быть необходимо (хотя это тоже не всегда бывает и печенье можно не передавать), но при этом может быть недостаточно и вместе с печеньем нужно ещё что-то передавать.

Ничего нового со времён HTTP не придумали, поэтому нет никаких секретных авторизаций. Значит, ты плохо отследил обмен по протоколу HTTP и что-то упустил.
dimanodg
буду дальше смотреть!
Нашел хороший ресурс, который из CURL формирует python script.
https://curl.trillworks.com/#
dimanodg
Авторизация на сайте КиноПоиск перенаправляет на страницу
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')

Вызов post-запроса авторизации на https://passport.yandex.ru возвращает статус-код 200 и редиректит на retpath -> https://www.kinopoisk.ru/. Но открываемая страница не авторизована! Если в headers убрать ‘retpath’:'https://www.kinopoisk.ru/', то открывается авторизованная страница аккаунта пользователя yandex. То есть, сама авторизация на yandex происходит. Нет авторизованного редиректа!!!
Соответственно, при попытке передать session.cookies в get-запрос процедуры parse_one возвращается код 404.
Что я делаю неправильно?
py.user.next
dimanodg
Использую следующий скрипт для авторизации
Используй теги кода, без них скрипт не читается.
dimanodg
py.user.next
отредактировал
py.user.next
dimanodg
Вызов post-запроса авторизации на https://passport.yandex.ru возвращает статус-код 200 и редиректит на retpath -> https://www.kinopoisk.ru/.
Статус 200 не может приводить к редиректу. Скорее всего, это внутренний редирект.

dimanodg
Соответственно, при попытке передать session.cookies в get-запрос процедуры parse_one возвращается код 404.
dimanodg
Что я делаю неправильно?
Скорее всего, ты что-то не передал.

Там, скорее всего, устроено так: ты заходишь на Яндекс, а Яндекс заходит на КиноПоиск и потом секрет, полученный от КиноПоиска при своём входе, передаёт тебе; затем ты этот секрет от КиноПоиска, полученный от Яндекса, передаёшь КиноПоиску и таким образом КиноПоиск тебя опознаёт как вошедшего и даёт страницу как авторизованному.

Если ты что-то недополучил от Яндекса либо что-то не додал КиноПоиску, то никакого авторизованного прохода к страницам, требующим авторизованного пользователя, он тебе не даёт.

dimanodg
Соответственно, при попытке передать session.cookies
Выше я писал, что печенья может быть недостаточно. Недостаточно - это значит, что нужно и печенье передать, и ещё что-то передать. На одно печенье он просто думает “ну и что, что этот гаврик мне передал одно печенье, я хочу знать, где и как он его получил, а этой информации нет, так что в доступе отказано, пусть входит по-нормальному”.
dimanodg
py.user.next
Там, скорее всего, устроено так: ты заходишь на Яндекс, а Яндекс заходит на КиноПоиск и потом секрет, полученный от КиноПоиска при своём входе, передаёт тебе; затем ты этот секрет от КиноПоиска, полученный от Яндекса, передаёшь КиноПоиску и таким образом КиноПоиск тебя опознаёт как вошедшего и даёт страницу как авторизованному.

Если ты что-то недополучил от Яндекса либо что-то не додал КиноПоиску, то никакого авторизованного прохода к страницам, требующим авторизованного пользователя, он тебе не даёт.

А может быть и такое: полученный от КиноПоиска “Секрет”, Яндекс и не думал передавать мне! )))

“А был ли мальчик? Может никакого мальчика то и не было?”
В самую пору доставать свой шаманский бубен.
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