При работе с сайтами / формами ASP.NET необходимо также указать обязательные скрытые входные данные Postback, а именно:
__EVENTTARGET
__EVENTARGUMENT
__VIEWSTATE
__VIEWSTATEGENERATOR
__EVENTVALIDATION
Их можно найти как input
с type="hidden"
. Мое предложение состоит в том, чтобы получить эти скрытые переменные с помощью модуля BeautifulSoup4
( link ), который обеспечивает относительно простой способ получения элементов с веб-страницы. Другие выбирают метод re
( Regular Expressions ), который немного более рудиментарен, но многим нравится его способность выполнять работу быстро и без дополнительных внешних зависимостей.
В любом случае, когда вы получите эти скрытые значения, вы включите их в полезную нагрузку вместе с тем, что у вас уже есть.
Чтобы понять, как я сюда попал, вы можете взглянуть на исходный код и заметить функцию __doPostBack
в нескольких местах, таких как эта:
function EnterEvent(e) {
if (e.keyCode == 13){
__doPostBack('ctl00$ContentPlaceHolder1$btnLogin', "");
}
}
Что это значит?
Это означает, что вам нужно будет предоставить соответствующую __EVENTTARGET
& __EVENTARGUMENT
для функции при отправке данных в зависимости от выполняемого вами действия.
Как мне определить соответствующие значения для этих двух переменных?
Для этого мы рассмотрим исходный код кнопки входа в систему:
<a id="lnkstlogin" href="javascript:__doPostBack('ctl00$lnkstlogin','')">Login</a>
Здесь вы увидитесоответствующие значения для этих двух переменных, которые необходимо передать для успешного входа в систему.
__EVENTTARGET = ctl00$lnkstlogin # and if that fails you can try the default value ctl00$ContentPlaceHolder1$btnLogin
__EVENTARGUMENT = '' # Empty String`
Полный рабочий код
# python3.7
# pip install requests BeautifulSoup4
from bs4 import BeautifulSoup
import requests
page = 'http://www.staloysiuspuc.in/student_login.aspx'
sess = requests.Session()
params = {
'ctl00$ContentPlaceHolder1$txtusername' : '***',
'ctl00$ContentPlaceHolder1$txtpass_1' : '***',
'ctl00$ContentPlaceHolder1$txtpass_2' : '***',
'ctl00$ContentPlaceHolder1$txtpass_3' : '***'
}
"""
Step 1: GET page, so Session stores cookies & so we can grab the needed values to postback
"""
resp = sess.get(page)
soup = BeautifulSoup(resp.text, 'html.parser')
# Step 2: Add the discussed parameters
params['__EVENTTARGET'] = 'ctl00$ContentPlaceHolder1$btnLogin'
params['__EVENTARGUMENT'] = ''
params['__VIEWSTATE'] = soup.find('input', id='__VIEWSTATE')['value']
params['__VIEWSTATEGENERATOR'] = soup.find('input', id='__VIEWSTATEGENERATOR')['value']
params['__EVENTVALIDATION'] = soup.find('input', id='__EVENTVALIDATION')['value']
# Step 3: Make the POST request
resp = sess.post(page, data=params)
# resp.url should be the url you said we'd be redirected to
print(resp.url)