我正在制作一个简单的代码,以便进行一些自动化,但我仍然遇到了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数据。如何通过代码重置它?
对于这篇长篇文章感到抱歉,我将非常感谢您的帮助。
欢呼声