Не удается войти на сайт с запросами Python - PullRequest
0 голосов
/ 13 октября 2019

Пожалуйста, помогите мне войти на этот сайт. Веб-сайт: http://www.staloysiuspuc.in/student_login.aspx Я пытался войти, используя запросы на python

<form method="post" action="./student_login.aspx" id="form1"> Это форма Мой код:

import requests

url = "http://www.staloysiuspuc.in/student_login.aspx"
payload = {
    'ctl00$ContentPlaceHolder1$txtusername' : '*****',
    'ctl00$ContentPlaceHolder1$txtpass_1' : '*****',
    'ctl00$ContentPlaceHolder1$txtpass_2' : '*****',
    'ctl00$ContentPlaceHolder1$txtpass_3' : '*****'
}
s = requests.Session()
r = s.post(url, data=payload)
print(r.url)

Я получаю один и тот же URL снова и снова,Он должен быть перенаправлен на www.st ......... .com / student_profile Пожалуйста, помогите

1 Ответ

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

При работе с сайтами / формами 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(&#39;ctl00$lnkstlogin&#39;,&#39;&#39;)">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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...