2016-12-07 106 views
5

我是一名自學成才的業餘程序員,我是這個論壇的新手。請多多包涵。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電腦上運行我的代碼,它工作正常。
  • 我使用相同的代碼來連接到各種其他網站,它工作正常,無論操作系統是什麼。

所以,我的具體問題:

  1. 爲什麼會與Msxml2.XMLHTTP.6.0代碼的工作,但不是Msxml2.ServerXMLHTTP.6.0?
  2. 爲什麼代碼首先會破裂?
  3. 爲什麼代碼在一個特定的網站上工作,但沒有另一個?

任何見識將不勝感激。我附上我的代碼(登錄信息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 
+1

他們使用完全不同的堆棧 - [這是MS要說](https://support.microsoft.com/en-us/kb/290761)。我無法權威地發表意見,但是IIR將以明文發送您的憑證。 – Comintern

回答

0

blog post提到說,ServerXLMHTTP不會通過客戶端上的代理工作,但XMLHTTP會。在Excel VBA中,我使用的是ServerXLMHTTP.6.0,它在公司網絡中的某些客戶端失敗,而XMLHTTP工作。

相關問題