@R4ndolphC4rter

Python Requests Как авторизоваться на сайте?

Добрый день!

Моя цель:
Написать программу на python. На вход подаются данные login и password, на выход подаётся ответ True/False (зависит, соответственно, от того, смогла ли программа выполнить вход).
Авторизация проходит на сайте Netflix, это моя задача. (Также пытался и на других сайтах, например, vk, но - безуспешно).

Реализация 1:
Для начала решил написать код, результатом выполнения которого являлся print(r.text). Как я понимаю, при вводе правильных и неправильных логина и пароля результаты ( print(r.text) ) должны отличаться, но у меня они одинаковые.
КОД УДАЛЁН
Реализация 2:
Выдаёт предупреждение UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 11. To get rid of this warning, pass the additional argument 'features="lxml"' to the BeautifulSoup constructor.
soup = Soup(login.text)

Но, не смотря на это, работает.
Результат ( при вводе верных/неверных данных):
'https://www.netflix.com/Login?nextpage=https%3A%2F...'
Ожидаемый результат (при верных данных):
'https://www.netflix.com/browse'
КОД УДАЛЁН

13.07.19
Начался 3 день моих мучений, держу в курсе...
19:55, я вернулся со школы, продолжаю тщетные попытки.
Мои планы? Собираюсь отправлять post запрос, а затем отправлять get запрос, пытаясь получить доступ к https://www.netflix.com/browse (страница, к который нельзя получить доступ не авторизовавшись).
r1 = requests.post(URL_LOG, data=data, headers=headers)

где URL_LOG="https://www.netflix.com/it/login"
data - словарь
data = {
    "userLoginId": LOGIN,
    "password": PASSWORD,
    "rememberMe": "true",
    "flow": "websiteSignUp",
    "mode": "login",
    "action": "loginAction",
    "withFields": "rememberMe,nextPage,userLoginId,password,countryCode,countryIsoCode",
    "authURL": authURL,
    "nextPage": "",
    "showPassword": "",
    #"countryCode": "+49",
    #"countryIsoCode": "DE"
}

Разобрался с authURL, кажется... После запуска программы переменная authURL=1563037356982.KrbIyYOuJlwUftNcRnCFSfROnB8= (например).
s = requests.Session()
s.headers.update({"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"})
soup = Soup(s.get(URL_LOG).text, features="lxml")

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch, br",
    "Accept-Language": "it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4",
    "Connection": "keep-alive",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
}
result = requests.get(URL_LOG, headers=headers)
tree = html.fromstring(result.text)
authURL = list(set(tree.xpath("//input[@name='authURL']/@value")))[0]

Это успех!
headers - ещё не разобрался :(
Пытаюсь вникнуть в чужие коды, откуда они берут данные для словаря - мне не известно. (Откуда я взял данные для словаря headers? Скопировал с чужого кода (а их было несколько), увы, они больше не работают). Тайное расследование какое-то. Пойду читать литературу, гляди с сотого раза вникну.

После многочисленных запросов на сервер, Netflix временно заблокировали мой ip. Скачал на компьютер VPN. Где я сегодня не побывал! Канада, Германия, США, Франция, Норвегия и множество других мест. продолжаю мучиться... Потому что на мой get запрос по адресу https://www.netflix.com/browse возвращается url=https://www.netflix.com/login (как будто я не авторизовался, но логин и пароль-то верные!).

Код на текущий момент (13.07.19 21:14) aka Реализация 3:
import requests
from lxml import html, etree

URL_LOG = "https://www.netflix.com/login"
URL_MAIN = "https://www.netflix.com/browse"
LOGIN = "MY_LOGIN"
PASSWORD = "MY_PASSWORD"

s = requests.Session()

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Connection": "keep-alive",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}

result = requests.get(URL_LOG, headers=headers)
tree = html.fromstring(result.text)
authURL = list(set(tree.xpath("//input[@name='authURL']/@value")))[0]

print(authURL)

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Cache-Control": "max-age=0",
    "Connection": "keep-alive",
    "Content-Length": "313",
    "Content-Type": "application/x-www-form-urlencoded",
    #"Cookie": "nfvdid=BQFnAAEBEJxbF-N0cMOnfTmUxgT9zsZA_s_RaJ0fg2fV7bXcmlV1-6TTVTaw_1F85KjMtVuQwen50FFpoxN3UajeIhJKq3kGbTUYskxDNoUqSXEKjXzO5Q%3D%3D; memclid=56a08146-0c8d-4804-a0fd-b4f260fa97c7; NetflixId=v%3D2%26ct%3DBQAOAAEBEPWqAdwhDzT9fGigJ17MprOA8HnnmJwbPXxVXQU6l7-AoAf0CdmoJ4OKFuXNmN_Gk1VSxDTfOlR5l6vTdpv2E5uDgM_-TOYTDJUAn6dasLtySfwFb36rx9zlcFZXd2V4ev_Phv7xeXEiIHg2-07r9D_-lk1mOvi0vrkA4Ks0fDdZPUKNzxSv6I9wG1JTy6VgQJWgmHohn0pZllDVFPTgtK7w80Z6zk8HpsS2NhHVN5fFtpDltPxcyhgvpSKoubPjI34tHyi5mdZ4wFWS5Fr-M9mSften3mCFSEbbD60owhL0UqJSTgqj0fEMcvWTHOHyrmMh2mNsnULZLssEAX8nLODtEg..%26bt%3Ddev%26mac%3DAQEAEAABABRtx6338QBfcQqapPEDcdramTVeKrC8MEo.; SecureNetflixId=v%3D2%27mac%3DAQEAEQABABSZexlJGSn3i-7avPfXiwl-aToM9mLR0Js.%26dt%3D1563037431438; flwssn=e448dd2d-4808-4bde-ac20-d2c32f5fc16d; clSharedContext=698074de-40c7-48a6-bf24-2738230a2f51; hasSeenCookieDisclosure=true; didUserInteractWithPage=true; dsca=anonymous; cL=1563038693194%7C156303869337943053%7C156303869386624258%7C%7C4%7Cnull",
    "Host": "www.netflix.com",
    "Origin": "https://www.netflix.com",
    "Referer": "https://www.netflix.com/login",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}

data = {
    "userLoginId": LOGIN,
    "password": PASSWORD,
    "rememberMe": "true",
    "flow": "websiteSignUp",
    "mode": "login",
    "action": "loginAction",
    "withFields": "rememberMe,nextPage,userLoginId,password,countryCode,countryIsoCode",
    "authURL": authURL,
    "nextPage": "",
    "showPassword": "",
    #"countryCode": "+49",
    #"countryIsoCode": "DE"
}

r1 = s.post(URL_LOG, data=data, headers=headers)
r2 = s.get(URL_MAIN)

print(r1.url)
print(r2.url)


От перестановки слагаемых, так сказать...
На мой get запрос вместо ожидаемой ссылки возвращается (уже будоражащая мои не очень ясные очи) ссылка на страницу авторизации.
23:28 - Завтра продолжу биться об стену, на сегодня, пожалуй, хватит.

14.07.2019
Утро доброе! Продолжим... Сегодня попробую покопать в сторону cookies.

5d2ae64927441880069380.png
Видимо, мне предлагают отдохнуть...
Я подожду.
За этот день я ничего толкового не сделал, сегодня я наслаждался сериалами.

15.07.2019
Сегодня снова без каких-либо результатов, НО я дождался ответов, которые берусь обдумывать и изучать.
Места для последующих комментариев не хватает (максимум 10 тыс. символов). Приходится удалять коды Реализаций 1 и 2. Ничего страшного, в них всё равно не было ничего интересного.
ОХ ЧЁРТ! СДЕЛАЛ!!! РАБОТАЕТ! 15.07.2019 23:29 Теперь бегом дорабатывать, попытаюсь встроить proxy.

Вопрос:
Так как же мне реализовать авторизацию, при этом, желательно, возвращая True/False?

Сам я с подобной темой столкнулся впервые и опыта как такового не имею.
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
@R4ndolphC4rter Автор вопроса
ВСЕМ СПАСИБО! ВОПРОС ЗАКРЫТ.
r1 = s.post(URL_LOG, data=data, headers=headers)
URL_LOG - константа.
data - словарь, динамичными значениями которого являются login & password, authURL.
headers - словарь, динамичным значением (текстовой переменной) которого является cookies.
Все остальные элементы словарей являются статичными и вытащены прямиком с сайта через консоль разработчика.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Messiah_v2
На сколько мне известно при любой авторизации выдается некий токен, который требуется записать в куки сессии.
Проследите авторизацию трассировкой в браузере. Посмотрите куки до и после авторизации. Думаю ответ лежит там
Ответ написан
nastya_cyxarik
@nastya_cyxarik
php, python dev
selenium не пробовали?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 60 000 до 120 000 руб.
Protoplan Краснодар
от 80 000 до 150 000 руб.
16 июл. 2019, в 15:39
5000 руб./за проект
16 июл. 2019, в 15:13
100000 руб./за проект
16 июл. 2019, в 15:09
120000 руб./за проект