Pergunta

BTW ... Este site funciona apenas com o Internet Explorer ....

Estou tentando descartar um site para um cliente para poder automatizar uma tarefa para eles. Basicamente, ele raspará para diferentes relatórios e procurará os horários de virada e enviá -los para o cliente. Meu programa de demolição funciona bem, o problema que estou tendo está fazendo login no site com Mechanize, pois o formulário de login está usando o AJAX. Procurei uma solução, mas não consigo encontrar exatamente o que estou procurando.

Abaixo está o formulário HTML e (pelo que posso dizer) o Ajax que o lida.

function 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}); }

função transginfinished (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 ('Failmsg') [0] .Text)); Form.enable ('form1'); Retorna; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '20') {window.Location.replace ('initPasswd.aspx? Usersite =' + usrsite + '& userCode =' + usrcode); Retorna; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '14') {Window.Location.replace ('chGpasswd.aspx? Type = chGPWD & Usersite =' + Ursite + '& UserCode =' + USRRCOD); Retorna; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '16') {window.Location.replace ('chGpasswd.aspx? Type = pwdexpire & usersite =' + usrsite + '& userCode =' + USRrCode); Retorna; } if (xmlnodes.getElementsByTagName ('LoginResult') [0] .Text == '0') {if (xmlnodes.getElementsByTagName ('pwdexpireWarning') [0] .Text == 'True') {var alteração. confirmar (decodexmlchar (xmlnodes.getElementsByTagName ('pwdexpiremsg') [0] .text)); if (changepwdnow == true) {window.location.replace ('chgpasswd.aspx? type = chgpwd & usersite =' + usrsite + '& userCode =' + usrcode); Retorna; } // var arg = {PromptMsg: decodexmlchar (xmlnodes.getElementsByTagName ('pwdexpiremsg') [0] .text), // botões: [{value: "sim", rtnval: 1}, // {Valor: "Não ", rtnval: 0} //] //}; // var rtn = window.showmodaldialog ('../ modules/modalmessageBox.aspx', arg, "dialogHeight: 140px; diálogo de diálogo: 500px; centro: 1; status: no;"); // if (rtn && rtn == 1) {// window.location.replace ('chgpasswd.aspx? type = chgpwd & usersite =' + usrsite + '& userCode =' + usrcode); // Retorna; //}
} if (jTrim ($ ('txthospCode'). value) == '') {Hosplist = decodexmlchar (xmlnodes.getElementsByTagName ('Hosplist') [0] .text) .split ('|'); if (hosplist.length <2) {selectedHospCode = Hosplist [0] .split ('-') [0]; Transelecthosp (SelectedHospCode); Retorna; } $ ('divhosplist'). style.display = 'bloco';

                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">
Código da conta de entrada:
            <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>

Meu código até agora


import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup
import html2text
import re

Navegador Instatiate

Br = mecanize.browser ()

Pote de biscoitos

CJ = Cookielib.lwpcookiejar () BR.SET_COOKIEJAR (CJ)

Opções do navegador

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)

Segue a atualização 0, mas não está pendurado na atualização> 0

BR.SET_HANDLE_REFRESH (mecanize._http.httprefreshprocessor (), max_time = 1)

Agente de usuário

Br.AddHeaders = [('User-Agent', 'Mozilla/4.0 (compatível; 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): "" "Logs o usuário no site" ""

# 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, acctcode)

Foi útil?

Solução

Mecanize não, até onde eu sei, o JavaScript. Portanto, suas opções são, em ordem aproximada do que eu tentaria:

  • Desligue o JavaScript no seu navegador e veja se você ainda pode fazer login no site. Nesse caso, tente usar mecanizar com esse processo.
  • Tente descobrir qual é o efeito do formulário AJAX (lado do servidor e do cliente) e tente imitá -lo usando o Python. Se você ainda não o encontrou, algo como o Firebug é inestimável para isso.
  • Use uma das várias bibliotecas que permitem que o Python assuma o controle de um navegador real. Eu nunca fiz isso, mas sei que existem embalagens por pelo menos Firefox e IE.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top