Войдите в Duolin go, используя Python запросы - PullRequest
0 голосов
/ 09 мая 2020

Я хочу попасть на главную (обучающую) страницу моего профиля go Duolin, но у меня возникают небольшие проблемы с поиском правильного способа входа на веб-сайт с моими учетными данными с помощью Python запросов. Я пытался делать запросы так же хорошо, как я их понимал, но я в значительной степени новичок в этом, так что до сих пор все шло напрасно. Помощь будет очень признательна!

Кстати, это то, что я пробовал собственными силами:

#The Dictionary Keys/Values and the Post Request URL were taken from the Network Source code in Inspect on Google Chrome

import requests

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/81.0.4044.138 Safari/537.36'
}

login_data = 
{
'identifier': 'something@email.com',
'password': 'myPassword'
}

with requests.Session() as s:
    url = "https://www.duolingo.com/2017-06-30/login?fields="
    s.post(url, headers = headers, params = login_data)
    r = s.get("https://www.duolingo.com/learn")
    print(r.content)

Пост-запрос получает следующее содержимое:

b'{"details": "Malformed JSON: No JSON object could be decoded", "error": "BAD_REQUEST_SCHEMA"}'

И так как вход не удается, запрос на получение страницы обучения получает следующее:

b'<html>\n <head>\n  <title>401 Unauthorized</title>\n </head>\n <body>\n  <h1>401
Unauthorized</h1>\n  This server could not verify that you are authorized to access the document you
requested.  Either you supplied the wrong credentials (e.g., bad password), or your browser does not
understand how to supply the credentials required.<br/><br/>\n\n\n\n </body>\n</html>'

Извините, если я делаю глупые ошибки. Я мало что знаю обо всем этом. Спасибо!

1 Ответ

0 голосов
/ 09 мая 2020

Если вы внимательно изучите запрос POST, вы увидите, что:

  • принятый тип содержимого application/json
  • имеется больше полей, чем вы указали (distinctId, landingUrl)
  • данные отправляются как json тело запроса, а не параметры URL

Единственное, что вам нужно выяснить, это как получить distinctId, то вы можете сделать следующее:

РЕДАКТИРОВАТЬ:

Отправка электронной почты / пароля в виде json тела кажется достаточным, и нет нужно получить distinctId, например:

import requests
import json

headers = {'content-type': 'application/json'}

data = {
    'identifier': 'something@email.com',
    'password': 'myPassword',
    }

with requests.Session() as s:
    url = "https://www.duolingo.com/2017-06-30/login?fields="
    # use json.dumps to convert dict to serialized json string
    s.post(url, headers=headers, data=json.dumps(data))
    r = s.get("https://www.duolingo.com/learn")
    print(r.content)
...