Проблема разбивки на страницы VBA XMLHTTP - не удается пройти через вторую страницу результатов поиска - PullRequest
0 голосов
/ 05 мая 2018

Я разрабатываю код VBA, чтобы обеспечить синхронизацию рабочей книги Excel со службой веб-счетов на https://www.fel.mx/CFDI33/Presentacion/Usuario/Ingreso.aspx

Я разработал некоторые рабочие функции с использованием объекта Internet Explorer и решил попытать счастья, перенеся его в XMLHTTP, чтобы, надеюсь, получить лучшую производительность и надежность. Функциональность, над которой я сейчас работаю, - просто войти в веб-сервис и получить список всех отмененных счетов

На данный момент я могу пройти через экран входа в систему, перейти к реестру счетов, отфильтровать список счетов по состоянию «Отменено» и перейти ко второй странице результатов. Проблема, с которой я сталкиваюсь (как бы глупо это не звучало), - это переместиться на третью страницу и дальше (я точно знаю, что есть еще несколько страниц, я даже могу добраться до последней страницы, используя кнопку «последняя страница», но не на страницы 3 до «последний - 1»).

Что касается контекста, этот бит кода выведет меня за пределы экрана входа в систему:

'Define xmlhttp request and html response objects
Dim xmlhttp_request As Object
Dim html_response As HTMLDocument

Set xmlhttp_request = CreateObject("Msxml2.XMLHTTP")
Set html_response = CreateObject("htmlFile")

'Get FEL login website html. We need this to later URL encode our POST data including the _EVENT params and our login credentials
With xmlhttp_request: .Open "GET", FEL_WEBSITE_LOGIN, False: .send: End With

'Put the xmlhttp responsetext in our html object
html_response.body.innerHTML = xmlhttp_request.responseText

'URL encode our password
encoded_password = WorksheetFunction.EncodeURL(FEL_PASSWORD)

'Prepare our POST data string
'We include the encoded _EVENT params, our login credentials and the login button item
post_data = _
    "__VIEWSTATE=" & WorksheetFunction.EncodeURL(html_response.getElementById("__VIEWSTATE").Value) & _
    "&__EVENTVALIDATION=" & WorksheetFunction.EncodeURL(html_response.getElementById("__EVENTVALIDATION").Value) & _
    "&txtUsuario=" & FEL_USERNAME & _
    "&txtCuenta=" & FEL_USERNAME & _
    "&txtContrena=" & encoded_password & _
    "&btnInicioSesion=Iniciar sesión"

'POST our xmlhttp request including our post data
With xmlhttp_request
    .Open "POST", FEL_WEBSITE_LOGIN, False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "Content-Length", Len(post_data)
    .send (post_data)
End With

Тогда я попаду на первую страницу счетов-фактур с фильтрацией результатов по каждому месяцу 2017 года в состоянии «Отменено»:

With xmlhttp_request: .Open "GET", FEL_WEBSITE_CFDI_REGISTRY, False: .send: End With
html_response.body.innerHTML = xmlhttp_request.responseText

post_data = _
    "__VIEWSTATEENCRYPTED=" & _
    "&__VIEWSTATE=" & WorksheetFunction.EncodeURL(html_response.getElementById("__VIEWSTATE").Value) & _
    "&__EVENTVALIDATION=" & WorksheetFunction.EncodeURL(html_response.getElementById("__EVENTVALIDATION").Value) & _
    "&ctl00$ContentPlaceHolder1$ddlMes=Todos" & _
    "&ctl00$ContentPlaceHolder1$ddlAno=2017" & _
    "&ctl00$ContentPlaceHolder1$ddlEstadoComprobante=1"

With xmlhttp_request
    .Open "POST", FEL_WEBSITE_CFDI_REGISTRY, False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "Content-Length", Len(post_data)
    .send post_data
End With

Затем, после этого я могу сделать это, чтобы перейти ко второй странице:

(На самом деле, я думаю, что здесь я снова фильтрую результаты и затем перехожу на следующую страницу, а не просто перехожу на следующую страницу из ранее отфильтрованных результатов. В этом я думаю, что это часть проблемы; прочитайте для более подробной информации)

html_response.body.innerHTML = xmlhttp_request.responseText

post_data = _
    "ctl00$ContentPlaceHolder1$ddlDia=Todos" & _
    "&ctl00$ContentPlaceHolder1$ddlMes=Todos" & _
    "&ctl00$ContentPlaceHolder1$ddlAno=2017" & _
    "&__VIEWSTATE=" & WorksheetFunction.EncodeURL(html_response.getElementById("__VIEWSTATE").Value) & _
    "&__PREVIOUSPAGE=" & WorksheetFunction.EncodeURL(html_response.getElementById("__PREVIOUSPAGE").Value) & _
    "&__EVENTVALIDATION=" & WorksheetFunction.EncodeURL(html_response.getElementById("__EVENTVALIDATION").Value) & _
    "&__VIEWSTATEENCRYPTED=" & _
    "&ctl00$ContentPlaceHolder1$pagCFDI$btnSiguiente="

With xmlhttp_request
    .Open "POST", FEL_WEBSITE_CFDI_REGISTRY, False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "Content-Length", Len(post_data)
    .send post_data
End With

И это насколько я понимаю. После этого я не могу на всю жизнь попасть на третью страницу. Я думал, что мог бы просто отправить тот же запрос POST, но он просто снова возвращает страницу 2.

Как вы можете себе представить, я только начинаю копаться в XMLHTTP, так что это все еще немного незнакомо мне.

Мне кажется, что мне нужно либо:

  1. Чтобы отправить тот же запрос POST, но не на FEL_WEBSITE_CFDI_REGISTRY, а на URL-адрес ответа предыдущего запроса POST (кажется, что в объекте XMLHTTP отсутствует свойство responseURL) или
  2. Возможно, мне нужно обработать какой-нибудь cookie, чтобы помочь объекту XMLHTTP отслеживать текущую страницу.

Кто-нибудь может увидеть, что мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...