首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python对PowerSchool进行身份验证

使用Python对PowerSchool进行身份验证
EN

Stack Overflow用户
提问于 2018-02-08 09:30:22
回答 1查看 453关注 0票数 1

这是一件困扰我一段时间的事情。我想写一个程序,这样我就可以自动登录到我的PowerSchool门户网站,它将来可能会让我做一些事情,比如解析我的时间表和成绩。要做到这一点,第一步是身份验证,这已经成为我的一个问题。

代码语言:javascript
复制
import sys
import os
import requests
import lxml
import json
from bs4 import BeautifulSoup


def login(username, password):
    with requests.Session() as s:
        url = 'https://sisavrsb.ednet.ns.ca/guardian/home.html#sign-in-content'
        r = s.get(url)
        soup = BeautifulSoup(r.text, "lxml")
        token = soup.select_one("[name='pstoken']")['value']
        contextdata = soup.select_one("[name='contextData']")['value']
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-US,en;q=0.5',
            'Connection': 'keep-alive',
            #'Content-Length': '423',
            #'Content-Type': 'application/x-www-form-urlencoded',
            #'Cookie': 'JSESSIONID=0B1666C446234245CECC2983F1D6CA8A; PowerSchool_Cookie_K=2069644430.1.329063952.2221457792',
            'DNT': '1',
            #'Host': 'sisavrsb.ednet.ns.ca',
            'Referer': 'https://sisavrsb.ednet.ns.ca/public/',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0'
        }
        print(contextdata)
        data = json.dumps({
            'account': username,
            #'contextData': '30A7205567365DDB643E707E25B32D43578D70A04D9F407113CF640632082056',
            'contextData' : contextdata,
            'credentialType': 'User Id and Password Credential',
            #'dbpw': '61a2474517a2f79ae0da0781b9bdf57d',
            #'dbpw' : password,
            'pcasServerUrl': '\/',
            'pstoken': token,
            'pw': password,
            'returnUrl': '',
            'serviceName': 'PS Parent Portal',
            'serviceTicket': '',
            'translator_ldappassword': '',
            'translator_password': '',
            'translator_username': '',
            'translatorpw': ''

        })
        p = s.post(url, headers=headers, data=data, allow_redirects=True)
        soup = BeautifulSoup(p.text, "lxml")
        if p.status_code == 302:
            print('Success!')
        else:
            print('Authentication error', p.status_code)
            print('cookies', requests.utils.dict_from_cookiejar(s.cookies))
            print(p.history)
            print(p.headers)

def main():
    login('xxxxx', 'xxxxx')


if __name__ == '__main__':
    main()

在这一点上,我尝试了几乎所有的方法,从机械化到(过时的) PowerSchool应用程序接口。我已经尽了最大努力复制头文件和数据,使用requests.Session()使cookies正常工作。在摆弄了几个小时之后,我终于得到了它,这样p.history()就不是空的了。它现在包含了"<Response [302]>",这对我来说非常模糊,但总比什么都没有好。

这是我的输出

代码语言:javascript
复制
Authentication error 200
cookies {'JSESSIONID': 'B847F853CC373DC7EAA8800FA02EEC00', 'PowerSchool_Cookie_K': '2069644430.1.329063608.2225303936'}
[<Response [302]>]
{'Server': 'Apache-Coyote/1.1', 'Cache-control': 'no-store, no-cache, must-revalidate, post-check=0, check=0', 'Expires': 'Thu, 01 Dec 1994 16:00:00 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '8238', 'Date': 'Thu, 08 Feb 2018 01:01:05 GMT'}

我已经离开了网站链接,以便您可以使用POST请求进行测试,并查看标题等。我对如何解决这个问题束手无策,但我真的很想让它正常工作。显然,历史记录中有302,这对邮政编码来说是一个好兆头,但我仍然无法通过登录。如果我执行另一个requests.get()并打印输出,它将再次成为登录页面。

机械化(抛出500内部服务器错误):

代码语言:javascript
复制
import mechanize
import cookielib

br = mechanize.Browser()

cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

# Debugging
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
br.set_handle_refresh(False)

# Fake User-Agent header
br.addheaders = [('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')]
br.open('https://sisavrsb.ednet.ns.ca/public/home.html')

#
br.select_form(name='LoginForm')
br.form['account'] = 'xxxxx'
br.form['pw'] = 'xxxxxx'

br.method = 'POST'
response = br.submit()
print response.read()

编辑: RoboBrowser也给了我一个500的回复。想知道是因为我遗漏了什么,还是仅仅是他们那头的问题。

EN

回答 1

Stack Overflow用户

发布于 2018-06-29 02:45:49

不确定这对你是否有效,但我最近也做了类似的事情。

所有的逻辑都是在/admin/javascript/md5.js文件中完成的(这似乎是一个他们修改并添加了自己的函数的库)。

这是我在自己的脚本中使用的python

代码语言:javascript
复制
from bs4 import BeautifulSoup
import requests, base64, hashlib, hmac

POWERSCHOOL_BASE_URL = "https://powerschool.eips.ca/"

def initLoginPage(httpSession: requests.Session) -> [str, str]:
    response = httpSession.get(POWERSCHOOL_BASE_URL + "public/home.html")
    html_response = BeautifulSoup(response.content, "lxml")

    contextData = html_response.find('input', id='contextData').attrs['value']
    pstoken = html_response.find('input', attrs={'name': 'pstoken'}).attrs['value']

    return contextData, pstoken

def getPassword(contextData: str, password: str) -> str:
    return hmac.new(contextData.encode('UTF-8'), msg=base64.b64encode(hashlib.md5(password.encode('UTF-8')).digest()).strip(b'='), digestmod=hashlib.md5).hexdigest()

def login(httpSession: requests.Session, username: str, pw: str, pstoken: str) -> requests.Response:
    post_data = {
        'account': username,
        'pw': pw,
        'pstoken': pstoken,
    }
    return httpSession.post(POWERSCHOOL_BASE_URL + "guardian/home.html", data=post_data)

附注:整个PowerSchool系统真的非常令人困惑和不安全(如果密码散列一行的怪物还不够)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48676069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档