我是一名自學成才的業餘程序員,我是這個論壇的新手。請多多包涵。Excel VBA Msxml2.XMLHTTP.6.0與Msxml2.ServerXMLHTTP.6.0
大約兩年前,我寫了一個簡單的Excel vba程序登錄到網站,並以.csv文件的形式獲取客戶聲明。我的程序利用GET和POST請求。直到三週前,這個程序完美地工作(爲我的需要),當時它不幸破壞了我。該程序無法通過最初的GET請求。具體來說,它會在getReq.send行中斷開。
我遇到了這個帖子: Login into website using MSXML2.XMLHTTP instead of InternetExplorer.Application with VBA
在這裏,我才知道,你可以使用 「Msxml2.XMLHTTP.6.0」 而不是 「Msxml2.ServerXMLHTTP.6.0」。我相應地修改了我的代碼,無需在Get請求之後解析Cookie,並且它工作正常!但我不知道。儘管我已經開始工作,但我並不覺得自己在這個過程中學到了很多東西。
有些信息需要注意:
- 我原來的計劃我的工作電腦(WindowsXP的)上爆發。
- 認爲這可能是一個XP問題,無論如何,在新機器的市場上,我更新到一臺運行Windows7的新電腦。該程序仍然無法正常工作,但我收到了一條不同的錯誤消息。
- 我在Windows10電腦上運行我的代碼,它工作正常。
- 我使用相同的代碼來連接到各種其他網站,它工作正常,無論操作系統是什麼。
所以,我的具體問題:
- 爲什麼會與Msxml2.XMLHTTP.6.0代碼的工作,但不是Msxml2.ServerXMLHTTP.6.0?
- 爲什麼代碼首先會破裂?
- 爲什麼代碼在一個特定的網站上工作,但沒有另一個?
任何見識將不勝感激。我附上我的代碼(登錄信息X'd出)。
Sub RCGInquiry()
Dim postReq, getReq, cookies
Dim p0 As Integer, p1 As Integer, temp As String
Dim result As String, respHead As String
Set getReq = CreateObject("Msxml2.ServerXMLHTTP.6.0")
'Set getReq = CreateObject("Msxml2.XMLHTTP.6.0")
' Visit homepage so we can find the cookies
getReq.Open "GET", "https://www.rcginquiry.com/sfs/Entry", False
getReq.send
respHead = getReq.getAllResponseHeaders
Debug.Print respHead
' Need to parse the cookie from Respone Headers
cookies = ""
p0 = 1
Do While InStr(p0, respHead, "Set-Cookie:") > 0
p0 = InStr(p0, respHead, "Set-Cookie:") + 11
p1 = InStr(p0, respHead, Chr(10))
temp = Trim(Mid(respHead, p0, p1 - p0))
cookies = cookies & temp & "; "
Loop
cookies = Left(cookies, Len(cookies) - 2)
' Debug.Print cookies
' Login
Set postReq = CreateObject("Msxml2.ServerXMLHTTP.6.0")
'Set postReq = CreateObject("Msxml2.XMLHTTP.6.0")
postReq.Open "POST", "https://www.rcginquiry.com/sfs/Entry", False
postReq.setRequestHeader "Cookie", cookies
postReq.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 'send appropriate Headers
postReq.send "Usrid=XXXX&Psswd=XXXX" ' send login info
'-------------------------------------------------------------------------------
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim FSO As Object
Dim myFile As Object
Dim path As String
Dim y As Integer
curDate = Format(Date, "mm_dd_yy")
' Download CSV
postReq.Open "POST", "https://www.rcginquiry.com/sfs/Downloads/tmp.csv?filetype=POS&format=MFA20&heading=true&allaccts=true&junk=tmp.csv", False
postReq.setRequestHeader "Cookie", cookies 'must resend cookies so it knows i am logged in
postReq.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
postReq.send "filetype=POS&format=MFA20&heading=true&allaccts=true&junk=temp.csv" 'url query parameters
' Writes responseText to a .csv file
Set FSO = CreateObject("Scripting.FileSystemObject")
Set myFile = FSO.createtextfile("C:\Users\Adam\Desktop\POSITION\" & curDate & ".csv", True)
myFile.write (postReq.responseText)
myFile.Close
Set FSO = Nothing
Set myFile = Nothing
End Sub
他們使用完全不同的堆棧 - [這是MS要說](https://support.microsoft.com/en-us/kb/290761)。我無法權威地發表意見,但是IIR將以明文發送您的憑證。 – Comintern