Melden Sie sich bei Python bei Ajax Form an
-
25-09-2019 - |
Frage
Übrigens ... diese Website funktioniert nur mit Internet Explorer ....
Ich versuche, eine Website für einen Kunden zu verschrotten, damit ich eine Aufgabe für sie automatisieren kann. Grundsätzlich wird es nach verschiedenen Berichten kratzen und nach den Wendezeiten suchen und sie per E -Mail an den Kunden senden. Mein Schrottprogramm funktioniert einwandfrei. Das Problem, das ich habe, ist die Anmeldung auf der Website mit Mechanize, da das Anmeldeformular AJAX verwendet. Ich habe mich nach einer Lösung umgesehen, kann aber nicht genau finden, wonach ich suche.
Unten ist das HTML -Formular und (nach dem, was ich sagen kann) das Ajax, das es umgeht.
Funktion tranLogin () {var url = 'login.aspx? isajax = true & eventTarget = tranLogin'; var postdata = Form.Serialize ('Form1'); ajaxRequest = new ajax.request (url, {method: 'post', postbody: postdata, onComplete: translogInfinished, onFailure: reporterror, onexception: reportException}); }
FUNKTION TRANSLOGINFINISHIERT (serverResponse) {if (requestFailed) return; xmlnodes = serverResponse.responsexml; usrSite = "8000"; usrCode = decodexmlchar (xmlnodes.getElementsByTagName ('userCode') [0] .Text); if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '-1') {alert (decodexmlchar (xmlnodes.getElementsByTagName ('failsg') [0] .Text); Form.Enable ('Form1'); Rückkehr; } if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '20') {window.location.replace ('initpasswd.aspx? userSite =' + usrSite + '& usercode =' + usrCode); Rückkehr; } if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '14') {window.location.replace ('chgpasswd.aspx? type = chgpwd & userSite =' + usrSite + '& usencode =' + usrCode); Rückkehr; } if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '16') {window.location.replace ('chgpasswd.aspx? type = pwDexpire & userSite =' + usrSite + '& userCode =' + usrcode); Rückkehr; } if (xmlnodes.getElementsByTagName ('loginResult') [0] .Text == '0') {if (xmlnodes.getElementsByTagName ('pwDexPireWarning') [0] .Text == 'true') {var changepwdnow = findy. bestätigen (decodexmlchar (xmlnodes.getElementsByTagName ('pwdexpiremsg') [0] .Text)); if (changepwdnow == true) {window.location.replace ('chgpasswd.aspx? type = chgpwd & userSite =' + usrSite + '& usercode =' + usrcode); Rückkehr; } // var arg = {prompletMsg: decodexmlchar (xmlnodes.getElementsByTagName ('pwDexpiremsg') [0] .text), // Schaltflächen: [{value: "yes", rtnval: 1}, // {value: "nein nein ", rtnval: 0} //] //}; // var rtn = window.showmodaldialog ('../ modules/modalMessagebox.aspx', arg, "dialogHeight: 140px; dialogwidth: 500px; Mitte: 1; Status: nein;"); // if (rtn && rtn == 1) {// window.location.replace ('chgpasswd.aspx? type = chgpwd & userSite =' + usrSite + '& userCode =' + usrcode); // Rückkehr; //}
} if (jtrim ($ ('txTHospcode'). value) == '') {Hosplist = decodexMlchar (xmlnodes.getElementsByTagName ('Hosplist') [0] .Text) .Split ('|'); if (Hosplist.length <2) {selectedHospcode = Hosplist [0] .Split ('-') [0]; Transelecthosp (selectedHospcode); Rückkehr; } $ ('divhosplist'). style.display = 'block';
for(i=0;i<hospList.length;i++)
{
if (hospList[i] != '')
{
divHospCode = document.createElement("div");
divHospCode.className='divHospCode';
$('divHospListBG').appendChild(divHospCode);
lnkHospCode = document.createElement("a");
if (hospList[i].length <= 33)
lnkHospCode.innerText = hospList[i];
else
lnkHospCode.innerText = hospList[i].substr(0,30) + '...';
lnkHospCode.title = hospList[i];
lnkHospCode.className = 'lnkHospCode';
divHospCode.appendChild(lnkHospCode);
lnkHospCode.onmouseover = function(){this.style.color = '#000000';}
lnkHospCode.onmouseout = function(){this.style.color = '#6c6c6c';}
lnkHospCode.onclick = function(){TranSelectHosp(this.innerText.split('-')[0]);}
if (i > 7 && $('divHospListBG').style.overflow != 'auto')
{
$('divHospListBG').style.height = '198px';
$('divHospListBG').style.overflow = 'auto';
}
}
}
return;
}
else
{
TranSelectHosp(JTrim($('txtHospCode').value));
}
}
}
<form name="Form1" method="post" action="login.aspx" id="Form1">
Kontocode eingeben: <div class="divRight">
<input name="txtHospCode" type="text" id="txtHospCode" class="inputClass" maxlength="4" />
</div>
<div class="divLeft">
<span>Input User Code:</span>
</div>
<div class="divRight">
<input name="txtUserCode" type="text" id="txtUserCode" class="inputClass" maxlength="6" />
</div>
<div class="divLeft">
<span>Input Password:</span></div>
<div class="divRight">
<input name="txtPassword" type="password" id="txtPassword" class="inputClass" />
</div>
<div class="divLeft">
<span>Login As:</span>
</div>
<div class="divRight">
<input type="radio" name="rdLoginType" value="D" checked="checked" />Doctor
<input type="radio" name="rdLoginType" value="T" />Other
</div>
<div class="divLeft">
</div>
<div class="divRight">
<input class="buttonClass" id="btnOK" type="button" value="Enter" onclick="LoginIn();" />
<input class="buttonClass" id="btnReset" type="button" value="Reset" onclick="ResetInput();" />
</div>
Mein Code bisher
import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup
import html2text
import re
Browser einleiten
BR = Mechanize.Browser ()
Keksglas
cj = cookielib.lwpcookiejar () br.set_cookiejar (cj)
Browseroptionen
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)
Folgt Aktualisierung 0, hängt aber nicht an Aktualisierung> 0
Br.set_handle_refresh (mechanize._http.httprefreshProcessor (), max_time = 1)
User-Agent
BR.AddHeaders = [('User-Agent', 'Mozilla/4.0 (kompatibel; MSIE 7.0B; Windows NT 6.0)')
Def login_to_website (login_url, login_form_name, usr_form_name, pwd_form_name, ACCT_CODE_NAME, usr, pwd, ACCT_CODE): "" "Protokolle Benutzer in der Website" ""
# Open the url of the login page
br.open(login_url)
# Select the login form name
br.select_form(login_form_name)
# Enter user's credentials into the form
br.form[acct_code_name] = acct_code
br.form[usr_form_name] = usr
br.form[pwd_form_name] = pwd
br.find_control(name='rdLoginType').value = ['T']
# Submit the form
print "Logging in as:", usr
br.submit()
# print current url
print "We are now at:", br.geturl()
# print error
if br.geturl() == login_url:
print "Login Failed"
else: print "Successfully logged in"
login_to_website ('https://www.website.com', 'Form1', 'TxtUSERCODE', 'TxtPassword', 'TXtHospcode', usr, pwd, actcode)
Lösung
Mechanize verarbeitet JavaScript, soweit ich weiß, nicht. Ihre Optionen sind also in groben Reihenfolge dessen, was ich versuchen würde:
- Schalten Sie JavaScript in Ihrem Browser aus und prüfen Sie, ob Sie sich weiterhin auf der Website anmelden können. Wenn ja, versuchen Sie, Mechanisierungen mit diesem Prozess zu verwenden.
- Versuchen Sie, herauszufinden, wie sich das AJAX -Formular auswirkt (sowohl Server- als auch Client -Seite), und versuchen Sie, es mit Python zu emulieren. Wenn Sie es noch nicht gefunden haben, ist so etwas wie Firebug dafür von unschätzbarem Wert.
- Verwenden Sie eine der verschiedenen Bibliotheken, die es Python ermöglichen, die Kontrolle über einen echten Browser zu übernehmen. Ich habe das noch nie gemacht, aber ich weiß, dass es Wrapper für zumindest Firefox und dh gibt.