Как получить ответный URL в модуле запросов Python? - PullRequest
1 голос
/ 06 октября 2019

Я пытаюсь зайти на сайт login.php, используя модуль запросов Python. Если попытка будет успешной, страница будет перенаправлена ​​на index.php. Если нет, она останется там в login.php.

Я смог сделать то же самое с модулем mechanize.

import mechanize
b = mechanize.Browser()
url = 'http://localhost/test/login.php'
response = b.open(url)
b.select_form(nr=0)
b.form['username'] = 'admin'
b.form['password'] = 'wrongpwd'
b.method = 'post'
response = b.submit()
print(response.geturl())
if response.geturl() == url:
    print('Failed')
else:
    print('OK')

Если логин / пароль правильный

user@linux:~$ python script.py 
http://localhost/test/index.php
OK
user@linux:~$ 

Если логин / пароль неправильный

user@linux:~$ python script.py 
http://localhost/test/login.php
Failed
user@linux:~$ 

Мой вопрос: каксделать то же самое с requests модулем?

Я пробовал другой подход здесь , но ни один из них не работает.

1 Ответ

1 голос
/ 06 октября 2019

Я взял код из вашего вопроса и изменил его:

import requests
url = 'http://localhost/test/login.php'
values = {'username': 'admin', 'password': 'wrongpwd'}
r = requests.post(url, data=values)
print(r.url)  # prints the final url of the response

Вы можете знать, что это точно, потому что это задокументировано в исходном коде . Все, что я сделал, это открыл определение класса Response.

Теперь вернемся к исходному вопросу.

Модуль запросов Python для проверки успешности входа в систему HTTP илине

Это зависит от того, правильно ли реализован веб-сайт.

Когда вы отправляете форму, любой веб-сайт отвечает вам HTTP-ответом, который содержит код состояния. Правильно реализованный веб-сайт возвращает разные коды состояния в зависимости от того, что вы отправили. Вот их список . Если все будет честно, код состояния ответа будет 200:

import requests
url = 'http://localhost/test/login.php'
values = {'username': 'admin', 'password': 'wrongpwd'}
r = requests.post(url, data=values)
print(r.status_code == 200)  # prints True

Если пользователь ввел неправильные учетные данные, код состояния ответа будет 401 (см. список выше). Теперь, если веб-сайт не реализован должным образом, он все равно ответит 200, и вам придется угадывать, успешен ли вход в систему, основываясь на других вещах, таких как response.content и response.url.

...