VBA - 坚持发送xmlhttp POST请求

时间:2017-03-10 20:24:48

标签: javascript vba excel-vba cookies xmlhttprequest

我正在制作一个简单的代码,以便进行一些自动化,但我仍然遇到了POST请求。

我打算捕获验证码图像并以Excel形式为用户显示输入,然后将其与其他所需数据一起发送回服务器,然后解析响应HTML以获取我需要的数据。

免责声明:我并没有试图绕过验证码,因为用户仍然需要阅读并输入验证码,相反,我只是尝试自动点击几下并复制/粘贴。这不是坏事。

因此,该网站是:http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp

所以我首先要做的是获取验证码信息,将其保存并显示给用户,到目前为止没有任何问题。我还在代码的这一部分中获取了cookie信息:

Dim WinHttpReq As New XMLHTTP60
Dim Docweb As New HTMLDocument
Dim IE As Object
Dim corpo As String
 Const adTypeBinary = 1
 Const adSaveCreateOverWrite = 2

    '\\Get Captcha Image data stream and Session Cookie data
    url = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp"
    WinHttpReq.Open "GET", url, False
    WinHttpReq.setRequestHeader "Content-Type", "image/png"
    WinHttpReq.send
    Oimg = WinHttpReq.responseBody
    Ocookie = WinHttpReq.getResponseHeader("Set-Cookie")

    '\\To create the png file
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Type = adTypeBinary
    oStream.Open
    filepath = ThisWorkbook.Path & "\" & "captcha.png"
    oStream.write Oimg
    oStream.savetofile filepath, adSaveCreateOverWrite

    '\\PNG show on this form activation
    Load FrmCaptcha
    FrmCaptcha.Show

然后在用户输入验证码之后,这是POST的代码以及我遇到的问题:

CNPJ = 00000000000191
url = "http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/valida.asp"
WinHttpReq.Open "POST", url, False
WinHttpReq.setRequestHeader "Cookie", "flag=1; _ga=GA1.3.1119390031.1461615099; nova_visita_ano=a27de975-d212-bd09-8afe-66e1675887f1; nova_visita_mes=a27de975-d212-bd09-8afe-66e1675887f1; " & Split(Ocookie, ";")(0)
WinHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WinHttpReq.send "origem=comprovante&cnpj=" & CNPJ & "&txtTexto_captcha_serpro_gov_br=" & FrmCaptcha.TextBox1.Value & "&submit1=Consultar&search_type=cnpj"
Debug.Print WinHttpReq.Status
pag = WinHttpReq.responseBody
corpo = WinHttpReq.responseText

此代码中的变量CNPJ仅用于测试。在原始代码中,宏循环遍历列中的数据。

然后我运行IE来检查responsetext(仅测试阶段):

Set IE = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
IE.Navigate "about:blank"
IE.Visible = True
IE.Document.write corpo

最后写入HTML文档来解析响应:

Docweb.body.innerHTML = corpo

'\\Here comes the Code to parse the HTML, which is not problem

问题是POST请求的服务器响应不是预期的。这与我输入网站中的数据并单击提交表单不同。

我不知道它是否与cookie会话有关,或者与手动提交表单时网站运行的Jscript有关:

<form id="theForm" action="" onSubmit="javascript:return Submeter();" method="post" name="frmConsulta">

的Jscript:

function Submeter()
        {
            document.cookie = 'flag=1';
            if (validaCaracteresCaptcha('theForm', 'txtTexto_captcha_serpro_gov_br', 'valida.asp') == false)
            {
                return false;
            }
        }

function validaCaracteresCaptcha(nomeForm, idLetra, paginaDestino) {
            var form = document.getElementById(nomeForm);
            if (document.getElementById(idLetra).value == "")
            {
                 AlertaCaptcha("Favor preencher algum o campo de validação");
                 form.action= "";
                 return false;
            }
            //if (document.getElementById(idLetra).value != "" && document.getElementById(idSom).value != "")
            //{
            //   AlertaCaptcha("Favor preencher apenas um dos campos de validação");
            //   form.action="";
            //   return false;
            //}
            if (document.getElementById("cnpj").value == "")
            {
                 AlertaCaptcha("Favor preencher o campo de CNPJ");
                 form.action="";
                 return false;
            }
            form.action=paginaDestino;
            return true;
        }

所以,如果有人可以提供帮助: 如何处理这些Jscrip验证?他们需要吗?并发送Cookie数据,是否正确?或问题出在其他地方?

另一个重要信息:Captcha是在访问时生成的,这意味着它会在每次请求时发生变化,而不会出现&#34; src&#34;或与之关联的唯一网址ID。 我认为如果cookie验证是正确的,这不是问题,因为此代码只请求它一次,稍后发送其结果输入字符串。

我遇到的另一个问题是,如果我在代码获取cookie信息后测试并停止代码,那么尝试再次运行代码会在&#34; Ocookie&#34;变量,因为VBA链接到前一个会话并发送已存储的cookie数据。如何通过代码重置它?

对于这篇长篇文章感到抱歉,我将非常感谢您的帮助。

欢呼声

0 个答案:

没有答案