Excel VBA中的XmlHttp Post不更新网站表单

Posted

技术标签:

【中文标题】Excel VBA中的XmlHttp Post不更新网站表单【英文标题】:XmlHttp Post in Excel VBA not updating website form 【发布时间】:2013-07-23 00:53:33 【问题描述】:

我经常需要在 NV 的状态中搜索无人认领的财产,并将结果放入 Excel 电子表格中。我正在尝试自动化该过程,但我仅限于使用 Excel 2010 和 VBA。下面是我尝试使用 xmlhttp 提交表单的网站的 URL。

网址:https://nevadatreasurer.gov/UPSearch/

我创建了一个类来自动在其他网站上提交表单,但无论我在 postdata 中输入什么,表单都永远不会提交。以下是我的提交,以及提交表单的方法。

上课:

cXML.openWebsite "Post", "https://nevadatreasurer.gov/UPSearch/Index.aspx", _
                 "ctl04$txtOwner=" & strSearchName

类方法:

Public Sub openWebsite(strOpenMethod As String, strURL As String, _
Optional strPostData As String)

pXmlHttp.Open strOpenMethod, strURL


If strPostData <> "" Then
    strPostData = convertSpaceToPlus(strPostData)
    pXmlHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
    pXmlHttp.send (strPostData)
Else
    pXmlHttp.send
End If

'Create DOM html documnet
pHtmlObj.body.innerHTML = pXmlHttp.responseText

End Sub

每次responseText都是主站,没有更新,好像我没有提交postdata一样。我对 IE 自动化相当陌生,但有人可以提供一个不起作用的原因以及一个有效的代码示例吗?

谢谢!

更新:太平洋标准时间 2013 年 7 月 26 日上午 8:30

无需对我的方法进行任何更改,我就可以通过另一个网站提交表单。 OR 无人认领财产表格的状态。效果很好!

网址:https://oregonup.us/upweb/up/UP_search.asp

但是,当我尝试加利福尼亚州无人认领的财产网站时,我遇到了同样的问题。无论我做什么,responseText 始终是没有更新的原始搜索页面。

网址:https://scoweb.sco.ca.gov/UCP/Default.aspx

它仍然不适用于我原来帖子中的 NV 状态。我正在使用正确的帖子数据,为每个网站编码的 URL,看不出有什么区别。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

试试下面的代码

Public Sub openWebsite(strOpenMethod As String, strURL As String, Optional strPostData As String)

    Dim pXmlHttp As Object
    Set pXmlHttp = CreateObject("MSXML2.XMLHTTP")
    pXmlHttp.Open strOpenMethod, strURL, False
    pXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    pXmlHttp.send (strPostData)


    Dim pHtmlObj As Object
    Set pHtmlObj = CreateObject("htmlfile")
    pHtmlObj.body.innerHTML = pXmlHttp.ResponseText
    MsgBox pXmlHttp.ResponseText

End Sub

Sub test()
    Dim btnSearch As String, strSearchType As String, strSearchName As String, PostData As String
    btnSearch = "Search"
    strSearchType = "Owner"
    strSearchName = "Santosh"
    PostData = "ctl04%24txtOwner=" & strSearchName & "&ctl04%24btnSearch=" & btnSearch & "&ctl04%24rblSearchType=" & strSearchType
    openWebsite "POST", "https://nevadatreasurer.gov/UPSearch/Index.aspx", PostData
End Sub

使用 Firebug 发布数据视图

网址编码

响应文本

【讨论】:

@Andy 我手动对我的 postdata 进行了 urlencoded,并使用您的代码而不改变结果。 responceText 始终是没有变化的原始搜索页面。您无法在 MsgBox 中看到完整的响应,但如果您保存文本,您将获得此代码:&lt;table width="100%"&gt; &lt;tr&gt; &lt;td width="33%" valign="top"&gt; &lt;/td&gt; &lt;td width="33%" valign="top"&gt; 如果您在网页上查看源代码,您将获得:&lt;table width="100%"&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;&lt;div id="ctl04_pnlResults" style="background-color:#66CCFF;border-color:Blue;border-width:2px;border-style:Solid;"&gt; 随后是结果 打扰一下,Santosh,你介意看看我的问题吗?它类似于这个,我的代码基于这个答案。但是我仍然遇到问题,似乎没有人在看我的问题......这里:***.com/questions/38570380 非常感谢。【参考方案2】:

你应该对这个字符串中的字符进行urlencode:

"ctl04$txtOwner=" & strSearchName

此处讨论了执行此操作的方法:SO link,因为 VBA 对此没有内置函数。

美元符号需要替换为 %24,任何空格都需要替换为 %20。如果这些是字符串中唯一的非字母数字字符,您可以采用简单的方法,使用VBA.Replace()(两次)。您目前正在用“+”替换空格,这通常会起作用,但美元符号可能是个问题。

【讨论】:

以上是关于Excel VBA中的XmlHttp Post不更新网站表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 vba 和 xmlhttp 自动提交网站上的帖子表单

VBA如何缓存xmlhttp请求返回值?

Vba 中的 Http 发布

VBA - XMLHTTP 和 WinHttp 请求速度

如何使用 VBA 从 Excel 向服务器发送 HTTP POST 请求?

VBA XMLHTTP 清除身份验证?