Я хочу войти в свой банковский счет, используя Excel и VBA.
У меня был полностью рабочий код, который мог войти в мой банк и загрузить выписки со счета и импортировать новые записи в мой лист Excel. Но после того, как мой банк внедрил PSD2, я не могу заставить его работать, хотя я пытаюсь скопировать все, что делает браузер.
Dim xmlhttp As New MSXML2.XMLHTTP60, htmlDoc As New HTMLDocument
' Open DKB-Site
Call SendXMLRequest(xmlhttp, "https://www.dkb.de/", "GET")
' Log into DKB-Account
htmlDoc.body.innerHTML = SendXMLRequest(xmlhttp, "https://www.dkb.de/banking", "POST", "j_username=myUsername&j_password=myPassword")
' Read XSRFPreventionToken
Dim XSRFToken As String
XSRFToken = Mid(htmlDoc.body.innerHTML, InStr(1, htmlDoc.body.innerHTML, "XSRFPreventionToken") + 28, 24)
' Wait for confirmation on mobile phone
Do
Sleep 1000
htmlDoc.body.innerHTML = SendXMLRequest(xmlhttp, "https://www.dkb.de/DkbTransactionBanking/content/LoginWithBoundDevice/LoginWithBoundDeviceProcess/confirmLogin.xhtml?$event=pollingVerification&_=" & DateDiff("s", #1/1/1970#, Now()), "GET")
Loop While htmlDoc.body.innerHTML Like "*WAITING*"
' Send XSRFPreventionToken after confirmation on mobile phone
Call SendXMLRequest(xmlhttp, "https://www.dkb.de/DkbTransactionBanking/content/LoginWithBoundDevice/LoginWithBoundDeviceProcess/confirmLogin.xhtml", "POST", "%24event=next&XSRFPreventionToken=" & WorksheetFunction.EncodeURL(XSRFToken))
' Navigate to financial overview
Call SendXMLRequest(xmlhttp, "https://www.dkb.de/banking/", "GET")
htmlDoc.body.innerHTML = SendXMLRequest(xmlhttp, "https://www.dkb.de/DkbTransactionBanking/content/banking/financialstatus/FinancialComposite/FinancialStatus.xhtml?$event=init", "GET")
' Copy account value
Dim dkbGiro As Currency
dkbGiro = CCur(htmlDoc.getElementsByClassName(" alignRight amount bold")(1).innerText)
' Log off from account
Call SendXMLRequest(xmlhttp, "https://www.dkb.de/DkbTransactionBanking/banner.xhtml?$event=logout", "GET")
Логин по-прежнему работает нормально, но, похоже, проблема в новом двухэтапном-login.
После того, как я подтверждаю вход в приложение и программа отправляет XSRFPreventionToken, я всегда получаю одну и ту же страницу, возвращаемую с сервера, которая говорит мне, чтобы подтвердить вход в мобильном приложении.
Я понятия не имею, что я делаю неправильно, поскольку никаких ошибок не происходит, и это в основном то, что делает браузер.
Любые идеи?
РЕДАКТИРОВАТЬ: Если вам интересно ... МойSendXMLRequest выглядит следующим образом (я не обрабатываю файлы cookie, так как это никогда не требовалось ни в одном банке):
Private Function SendXMLRequest(xmlhttp As MSXML2.XMLHTTP60, url As String, requestType As String, Optional postData As String = "") As String
With xmlhttp
.Open requestType, url, True
If requestType = "POST" Then
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Content-Length", Len(postData)
End If
.send (postData)
' Synchronize async request, so that Excel does not freeze
While .readyState <> READYSTATE_COMPLETE: DoEvents: Wend
' Return response
SendXMLRequest = .responseText
End With
End Function