Python запрашивает 422 ошибки на пост - PullRequest
0 голосов
/ 09 мая 2018

Я пытался очистить веб-сайт, такой как GitHub, который требует аутентификации при входе, но, в отличие от Github, у него нет и API. Я следовал этим инструкциям и многим другим, но, похоже, ничего не работает и просто возвращает ошибку 422.

from lxml import html

url = "https://github.com/login"
user = "my email"
pas = "associated password"

sess = requests.Session()
r = sess.get(url)

rhtml = html.fromstring(r.text)

#get all hidden input fields and make a dict of them
hidden = rhtml.xpath(r'//form//input[@type="hidden"]')
form = {x.attrib["name"]: x.attrib["value"] for x in hidden}

#add login creds to the dict
form['login'] = user
form['password'] = pas

#post
res = sess.post(url, data=form)

print(res)
# <Response [422]>

Я также пытался просто sess.post(url, data={'login':user, 'password':pas}) с тем же результатом. get Использование файлов cookie и их использование в сообщении, похоже, тоже не работает.

Как я могу получить свою страницу входа, желательно без использования Selenium?

1 Ответ

0 голосов
/ 10 мая 2018

Это потому, что форма action отличается от страницы входа.

Вот как вы можете сделать это, используя requests и BeautifulSoup:

import requests
from bs4 import BeautifulSoup

url = "https://github.com/login"
user = "<username>"
pwd = "<password>"

with requests.Session() as s:

    r = s.get(url)
    soup = BeautifulSoup(r.content, "lxml")

    hidden = soup.find_all("input", {'type':'hidden'})
    target = "https://github.com" + soup.find("form")['action']
    payload = {x["name"]: x["value"] for x in hidden}

    #add login creds to the dict
    payload['login'] = user
    payload['password'] = pwd

    r = s.post(target, data=payload)
    print(r)
...