Невозможно войти на сайт с запросами

Ради интереса я пытаюсь использовать запросы Python для входа на студенческий портал моей школы. Это то, что я придумал до сих пор. Я пытаюсь быть очень явным в заголовках, потому что я получаю код состояния 200 (код, который вы также получаете, не входя в систему) вместо 302 (успешный вход).

import sys
import os
import requests

def login(username, password):
    url = '(link)/home.html#sign-in-content'
    values = {
        'translator_username' : '',
        'translator_password' : '',
        'translator_ldappassword' : '',
        'returnUrl' : '',
        'serviceName' : 'PS Parent Portal',
        'serviceTicket' : '',
        'pcasServerUrl' : '\/',
        'credentialType' : 'User Id and Password Credential',
        'account' : username,
        'pw' : password,
        'translatorpw' : password
    }

    headers = {
        'accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'accept-encoding' : 'gzip, deflate, br',
        'accept-language' : 'en-US,en;q=0.9',
        'cache-control' : 'max-age=0',
        'connection' : 'keep-alive',
        'content-type' : 'application/x-www-form-urlencoded',
        'host' : '(link)',
        'origin' : '(link)',
        'referer' : '(link)guardian/home.html',
        'upgrade-insecure-requests' : '1'
    }

    with requests.Session() as s:
        p = s.post(url, data=values)
        if p.status_code == 302:
            print(p.text)
        print('Authentication error', p.status_code)

        r = s.get('(link)guardian/home.html')
        print(r.text)

def main():
    login('myname', 'mypass')

if __name__ == '__main__':
    main()

Используя Chrome для проверки сетевых запросов, все эти заголовки находятся в разделе "Заголовки запросов" в дополнение к длинному номеру cookie, длине контента и агенту пользователя.

Формы следующие:

pstoken:(token)
contextData:(text)
translator_username:
translator_password:
translator_ldappassword:
returnUrl:(url)guardian/home.html
serviceName:PS Parent Portal
serviceTicket:
pcasServerUrl:\/
credentialType:User Id and Password Credential
account:f
pw:(id)
translatorpw:

Я что-то упускаю с названиями заголовков / форм? Это проблема с куки?

Если я посмотрю на p.requests.headers, это то, что отправлено:

{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'accept-encoding': 'gzip, deflate, br', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'connection': 'keep-alive', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'content-type': 'application/x-www-form-urlencoded', 'host': '(url)', 'origin': '(url)', 'referer': '(url)guardian/home.html', 'upgrade-insecure-requests': '1', 'Content-Length': '263'}

p.text дает мне HTML-код страницы входа

Протестировано с PowerAPI, запросами, Mechanize и RoboBrowser. Все терпят неудачу.

1 ответ

Какой ответ вы ожидаете? Вы используете неправильный способ проанализировать свой ответ.

with requests.Session() as s:
    p = s.post(url, data=values)
    if p.status_code == 302:
        print(p.text)
    print('Authentication error', p.status_code)

    r = s.get('(link)guardian/home.html')
    print(r.text)

В своем коде вы распечатываете Authentication error игнорирование status_codeЯ думаю, что по крайней мере это должно быть так:

with requests.Session() as s:
    p = s.post(url, data=values)
    if p.status_code == 302:
        print(p.text)
        r = s.get('(link)guardian/home.html')
        print(r.text)
    else:
        print('Authentication error', p.status_code)
Другие вопросы по тегам