Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python请求登录到Powerschool_Python_Web Scraping_Python Requests_Powerschool - Fatal编程技术网

使用Python请求登录到Powerschool

使用Python请求登录到Powerschool,python,web-scraping,python-requests,powerschool,Python,Web Scraping,Python Requests,Powerschool,我正在尝试登录到PowerSchool,并从需要登录的页面上获取我的成绩。我一直在看一个又一个视频,不明白为什么它不起作用。我有一个Tkinter窗口,询问我的用户名和密码,然后用它登录该网站。但是当我运行它时,我得到的只是登录页面的源代码。以下是inspect element下网络选项卡的图片 / 我不确定这里出了什么问题,我已经调查了一段时间了。 提前谢谢 我没有要测试的帐户,但在您当前的方法中有多个方面是错误的: 密码(pw字段)通过以下函数(定义)散列: 函数doPCASLogin(表

我正在尝试登录到PowerSchool,并从需要登录的页面上获取我的成绩。我一直在看一个又一个视频,不明白为什么它不起作用。我有一个Tkinter窗口,询问我的用户名和密码,然后用它登录该网站。但是当我运行它时,我得到的只是登录页面的源代码。以下是inspect element下网络选项卡的图片

/

我不确定这里出了什么问题,我已经调查了一段时间了。
提前谢谢

我没有要测试的帐户,但在您当前的方法中有多个方面是错误的:

  • 密码(
    pw
    字段)通过以下函数(定义)散列:

    函数doPCASLogin(表单)
    {
    var originalpw=form.pw.value;
    变量b64pw=b64_md5(原始值);
    var hmac_md5pw=十六进制hmac_md5(pskey,b64pw)
    form.pw.value=hmac_md5pw;
    form.dbpw.value=hex_hmac_md5(pskey,originalpw.toLowerCase())
    if(form.ldappassword!=null){
    //LDAP已启用,因此请发送明文密码
    //如果客户使用LDAP,则应启用SSL
    form.ldappassword.value=originalpw;//发送未混合的密码
    }
    //翻译登录
    var translatorpw=form.translatorpw.value;
    变量i=translatorpw.indexOf(“;”);
    if(i<0){
    form.translator\u username.value=translatorpw;
    form.translator_password.value=“”;
    }
    否则{
    form.translator\u username.value=translatorpw.substring(0,i);
    translatorpw=translatorpw.substring(i+1);//获取密码
    translatorpw2=translatorpw;
    translatorpw=b64_md5(translatorpw);//在移动到pcas中添加
    form.translator\u password.value=hex\u hmac\u md5(pskey,translatorpw);
    if(form.translator\u ldappassword!=null){
    //LDAP已启用,因此请发送明文密码
    //如果客户使用LDAP,则应启用SSL
    form.translator\u ldappassword.value=translatorpw2;//发送LDAP的pw
    }
    }
    返回true;
    }
    
  • 您不能在每次发出请求时都具有相同的令牌值。您必须从实际表单中获取令牌值。这意味着您需要首先“获取”home.html,提取令牌值,然后在“POST”请求中使用它们

对于第二个问题,您可能希望尝试像
mechanize
mechanicalSoup
这样的方法,自动“自动填充”表单字段的其余部分。但是,他们不能执行JavaScript,这在这种特殊情况下非常重要


如果您想避免处理所有这些问题,请查看浏览器自动化和

网页比你想象的更复杂。第一:每个
post()
可能需要在
pstoken
contexDat
帐户和
pw
中使用不同的值。您必须使用登录表单
get()
页面,并在HTML中找到正确的值。第二:服务器可能会检查其他元素,如cookies(因此最好使用
requests.Session()
)或header(主要是
用户代理
)。它可以使用JavaScript散列/计算一些数据来控制表单-即,它可以在
pw
字段中发送散列密码。感谢您的回复,我花了一些时间来修复一些代码,并且能够提取pstoken和contextdata。我看了看,发现pstoken和contextdata是唯一改变每篇文章的值。所以我得到了它们,并将它们放入值中,然后在有效载荷中使用它们。我仍然需要找出散列pw的第一个问题。但我想知道这是否是正确的做法,是否朝着正确的方向迈出了一步。更新的代码在上面,谢谢。
def get_Auth():

    USERNAME = User.get("1.0", END)
    PASSWORD = Pass.get("1.0", END)
    print(USERNAME)
    print(PASSWORD)

    url = 'https://ps.lphs.net/public/home.html'

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.92 Safari/537.36 Vivaldi/1.6.689.34'}

    g = requests.get(url)

    soup = BeautifulSoup(g.content)

    'Find The Values'

    PSTOKEN = None
    CONTEXTDATA = None

    for input in soup.find_all('input')[0:1]:
        PSTOKEN = input.get('value')

        print(PSTOKEN)

    for input in soup.find_all('input')[1:2]:
        CONTEXTDATA = input.get('value')

        print(CONTEXTDATA)


    payload = {
              'pstoken': PSTOKEN,
              'contextData': CONTEXTDATA,
              'dbpw': '',
              'translator_username': '',
              'translator_password': '',
              'translator_ldappassword': '',
              'returnUrl': 'https://ps.lphs.net/guardian/home.html',
              'serviceName': 'PS Parent Portal',
              'serviceTicket': '',
              'pcasServerUrl': '\ /',
              'credentialType': 'User Id and Password Credential',
              'account': USERNAME,
              'pw': PASSWORD,
              'translatorpw': ''
              }

    r = requests.post(soup, data=payload)
    print(r)
function doPCASLogin(form)
{
   var originalpw = form.pw.value;
   var b64pw = b64_md5(originalpw);
   var hmac_md5pw = hex_hmac_md5(pskey, b64pw)
   form.pw.value = hmac_md5pw;
   form.dbpw.value = hex_hmac_md5(pskey, originalpw.toLowerCase())
   if (form.ldappassword!=null) {
     // LDAP is enabled, so send the clear-text password
     // Customers should have SSL enabled if they are using LDAP
     form.ldappassword.value = originalpw; // Send the unmangled password
   }

   // Translator Login
   var translatorpw = form.translatorpw.value;
   var i = translatorpw.indexOf(";");
    if (i < 0) {
        form.translator_username.value = translatorpw;
        form.translator_password.value = "";
    }
    else {
        form.translator_username.value = translatorpw.substring(0,i);
        translatorpw = translatorpw.substring(i+1); // Get the password
        translatorpw2 = translatorpw;
        translatorpw = b64_md5(translatorpw);                   // Added in move to pcas
        form.translator_password.value = hex_hmac_md5(pskey, translatorpw);
        if (form.translator_ldappassword!=null) {
            // LDAP is enabled, so send the clear-text password
            // Customers should have SSL enabled if they are using LDAP
            form.translator_ldappassword.value = translatorpw2; // Send the pw for LDAP
        }
    }

    return true;
}