我在 localhost\administration
有一个登录页面,我使用此代码登录:
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/Login
和 lg = {'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>
这是页面的 javascript
<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>
最佳答案
看来您应该发出 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
关于javascript - 如何使用Python登录网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940398/