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">
                &nbsp;<input type="radio" name="rdLoginType" value="D" checked="checked" />Doctor&nbsp;&nbsp;
                <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)

War es hilfreich?

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top