2017-01-02 131 views
1
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) 

我正在嘗試登錄PowerSchool並從登錄所需頁面中刪除我的成績。我一直在視頻後觀看視頻,無法弄清楚爲什麼它不起作用。我有一個Tkinter窗口,詢問我的用戶名和密碼,然後用它登錄到該網站。但是當我運行它時,我得到的僅僅是登錄頁面的源代碼。這是檢查元素下的網絡選項卡的圖片。使用Python請求登錄Powerschool

Request Headers/Form Data

我不知道什麼是錯在這裏,我一直在尋找到這一段了。 在此先感謝!

+0

網頁比你想象的更復雜。首先:每個'post()'在'pstoken','contexDat','account'和'pw'中可能需要不同的值。你必須用登錄表單'get()'頁面並在HTML中找到正確的值。第二:服務器可能會檢查其他元素,如cookie(所以最好使用'requests.Session()')或頭部(大部分是'User-Agent')。 – furas

+0

,它可以使用JavaScript散列/計算一些數據來控制表單 - 即。它可以在'pw'字段發送散列密碼。 – furas

回答

2

我沒有一個帳戶來測試,但多件事情是錯在你目前的做法:

  • 密碼(pw場)通過下面的函數(定義here)散列:

    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; 
    } 
    
  • 每次提出請求時,您都不能擁有相同的標記值。您必須從實際表單中獲取令牌值。這意味着您需要首先「獲取」home.html,提取令牌值,然後在「POST」請求中使用它們。

對於第二個問題,你可能想嘗試像mechanizemechanicalSoup東西,會「自動填充」表單字段的自動休息。但是,他們無法執行在這種特殊情況下非常重要的JavaScript。

如果您想避免處理所有這些問題,請查看瀏覽器自動化和selenium package

+0

感謝您的回覆,我花了一些時間來修復一些代碼,並且我能夠提取pstoken和contextdata。我在看,我注意到pstoken和contextdata是改變每篇文章的唯一值。所以我得到了它們並將它們放在值中並在有效載荷中使用它們。我仍然必須找出散列函數的第一個問題。但我想知道這是否是正確的做法,是朝着正確方向邁出的一步。更新的代碼在上面,謝謝。 – Sam