2016-04-29 90 views
0

我在localhost\administration一個登錄頁面,我使用此代碼登錄:如何使用Python登錄到網頁?

import urllib 
import http.cookiejar as ckj 
lg = {'nick':'john','pass':'password'} 
url = 'http://localhost/administration/' 
cj = ckj.CookieJar() 
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) 
lgdata = urllib.parse.urlencode(lg).encode("utf-8") 
opener.open(url,lgdata) 
res = opener.open(url) 
print(res.read()) 

的頁面是唯一的PHP代碼。 現在我要登錄到這個頁面localhost:8080/pentaho/Login,但該頁面正在使用JavaScript進行登錄,我不知道如何&什麼數據我應該發送到頁面。

據我所知,我需要有url = localhost:8080/pentaho/Loginlg = {'j_username':'username','j_password':'password'},但這並不是我需要發送給操作的所有信息,或者這是不正確的。

這裏是登錄表單的HTML代碼:

<form name="login" id="login" action="j_spring_security_check" method="POST" 
onkeyup="if(window.event && window.event.keyCode && window.event.keyCode==13) 
{var buttonToClick = document.getElementById('loginbtn'); 
if(buttonToClick){ buttonToClick.click();}}"> 
    <input id="j_username" name="j_username" type="text" placeholder="" autocomplete="off"> 
    <input id="j_password" name="j_password" type="password" placeholder="" autocomplete="off"> 
    <button type="submit" id="loginbtn" class="btn">Login</button> 
    <input type="hidden" name="locale" value="en_US"> 
</form> 

這裏是頁

<script type="text/javascript"> 
    function toggleEvalPanel() { 
    var evaluationPanel = $("#evaluationPanel"); 
    evaluationPanel.toggleClass("afterSlide"); 
    $("#eval-arrow").toggleClass("closed"); 
    } 
    function bounceToReturnLocation() { 
    // pass 
    var locale = document.login.locale.value; 
    var returnLocation = 'http\x3A\x2F\x2Flocalhost\x3A8080\x2Fpentaho\x2Findex.jsp'; 
    if (returnLocation != '' && returnLocation != null) { 
     window.location.href = returnLocation; 
    } else { 
     window.location.href = window.location.href.replace("Login", "Home") + "?locale=" + locale; 
    } 
    } 
    function doLogin() { 
    // if we have a valid session and we attempt to login on top of it, the server 
    // will actually log us out and will not log in with the supplied credentials, you must 
    // login again. So instead, if they're already logged in, we bounce out of here to 
    // prevent confusion. 
    if (false) { 
     bounceToReturnLocation(); 
     return false; 
    } 
    jQuery.ajax({ 
     type: "POST", 
     url: "j_spring_security_check", 
     dataType: "text", 
     data: $("#login").serialize(), 
     error:function (xhr, ajaxOptions, thrownError){ 
     if (xhr.status == 404) { 
      // if we get a 404 it means login was successful but intended resource does not exist 
      // just let it go - let the user get the 404 
      bounceToReturnLocation(); 
      return; 
     } 
     //Fix for BISERVER-7525 
     //parsereerror caused by attempting to serve a complex document like a prd report in any presentation format like a .ppt 
     //does not necesarly mean that there was a failure in the login process, status is 200 so just let it serve the archive to the web browser. 
     if (xhr.status == 200 && thrownError == 'parsererror') { 
      document.getElementById("j_password").value = ""; 
      bounceToReturnLocation(); 
      return; 
     } 
     // fail 
     $("#loginError").show(); 
     $("#loginError button").focus(); 
     }, 
     success:function(data, textStatus, jqXHR){ 
     if (data.indexOf("j_spring_security_check") != -1) { 
      // fail 
      $("#loginError").show(); 
      $("#loginError button").focus(); 
      return false; 
     } else { 
      document.getElementById("j_password").value = ""; 
      bounceToReturnLocation(); 
     } 
     } 
    }); 
    return false; 
    } 
    function loginAs (username, password) { 
    $("#j_username").attr("value", username); 
    $("#j_password").attr("value", password); 
    doLogin(); 
    } 
    $(document).ready(function(){ 
    $("#login").submit(doLogin); 
    if (false) { 
     bounceToReturnLocation(); 
    } 
    $("#login-background").fadeIn(1000, function() { 
     $("#login-logo").addClass("afterSlide"); 
     $("#animate-wrapper").addClass("afterSlide"); 
     $("#j_username").focus(); 
     $("#login-footer").addClass("afterSlide"); 
    }); 
    }); 
</script> 

回答

1

看起來你應該提出一個AJAX請求。你可以嘗試這樣的:

import requests 

headers = { 
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0', 
    'Accept': 'application/json, text/javascript, */*; q=0.01', 
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 
    'X-Requested-With': 'XMLHttpRequest' 
} 

login_url = '/pentaho/j_spring_security_check' 
s = requests.Session() 
data = {'j_username': YOURUSERNAME, 'j_password': YOURPASSWORD} 
s.post(login_url, data=login_data) 

content = s.post(url, data=data, headers=headers) 
print content 
+0

謝謝你的答案,我只是試過這個,但並不真正的工作。我回來的是,這意味着我試圖訪問服務器上的複雜文檔 – Andrew

0

的JavaScript的望着JavaScript中,您要發送一個POST請求http://localhost:8080/pentaho/j_spring_security_check與有效載荷j_username=<username>&j_password=<password>

安全檢查的位置取決於公式的位置,我認爲它的w就像在同一個文件夾中一樣,否則url會改變。