Excel это не сложно

Основные форумы => Вопросы по Excel и VBA => Тема начата: SirEgor от 05.07.2020, 19:35:19



Название: Работа с сайтом на ajax
Отправлено: SirEgor от 05.07.2020, 19:35:19
Добрый день. Недавно начал изучать vba excel, возникла проблема.
Мне необходимо по средствам vba excel подключиться к сайту, отправить через спец. форму некоторые данные, и получившийся ответ записать на страницу в excel.
Но вместо html кода, который я получаю при открытии страницы, например через просмотр кода в гугле, приходит какой-то html-JavaScript код, который я даже не могу нигде на странице найти. Соответственно вытащить из него ничего нельзя.
Использую стандартный код:
Код: (vb)
Dim XMLHTTP As Object
Dim URL As String
Dim Txt As String

URL = "WWW.Какой-то сайт"

Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
XMLHTTP.Open "GET", URL, False
XMLHTTP.SEND

If XMLHTTP.statustext = "OK" Or XMLHTTP.Status = 200 Then
    MsgBox "Всё ок"
    Txt = XMLHTTP.responseText
    TextBox1.Value = Txt
Else:
    MsgBox "Отсутствует соединение"
End If

Set XMLHTTP = Nothing



Я только постигаю VBA и плох в web разработке, по этому очень прошу подсказать мне, где я могу найти ответ на свой вопрос и по возможности почитать об этом подробнее.
Спасибо.


Название: Re:Работа с сайтом на ajax
Отправлено: Дмитрий Щербаков(The_Prist) от 06.07.2020, 11:56:04
Не видя самой страницы сайта советовать особо нечего, т.к. непонятно что там вообще как выводится и можно ли это обработать.


Название: Re:Работа с сайтом на ajax
Отправлено: SirEgor от 06.07.2020, 20:23:41
Прошу прощения за непрофессиональный подход.
Сегодня на протяжении дня изучал различные ресурсы, особенно помог вот этот(если вдруг кто тоже столкнётся с той же проблемой):
https://www.youtube.com/watch?v=dShR33CdlY8

Сейчас попытаюсь описать всё основательно.
Имеем сайт, например: https://www.dimex.ws/kalkulyator/ekspress/

Заходя по данной ссылке попадаем на страницу, в которой сначала нужно выбрать "Вид услуги", затем ещё раз "Вид услуги" и в конце в итоге попадём на форму калькулятора.
Соль тут в том, что html код подгружается только после выбора опр. опции.
Если конспектировать, то вот что имеем до выбора услуги:

Код: (vb)
<div class="form-horizontal">
<div id="selectBox"><div class="control-group form-group row">
<div class="controls2 col-12"><select name="sel[]" class="form-control">
<option value="58">Выберите вид услуги</option><option value="4">Доставка по городу</option>
<option value="5">Доставка по стране</option><option value="6">Международная доставка</option>
</select>
</div>
</div>
</div>
<div id="f1"><!--  ||--></div>
</div>


И соответственно после в id "f1" у нас приходит:
Код: (vb)
<div class="form-horizontal">
<div id="selectBox"><div class="control-group form-group row"><div class="controls2 col-12">
<select name="sel[]" class="form-control"><option value="58">Выберите вид услуги</option><option value="4">Доставка по городу</option>
<option value="5">Доставка по стране</option><option value="6">Международная доставка</option></select></div></div><div class="control-group form-group row">
<div class="controls2 col-12"><select name="sel[]" class="form-control"><option value="59">Выберите вид услуги</option><option value="7">Доставка по вашему городу</option>
<option value="8">Доставка по другому городу</option></select></div></div></div>
<div id="f1"><!-- 5 ||--><script>
   function addListBox() {
      var myDynamoSelect = $('select[id="packaging"]');


И далее идёт ещё куча кода, который вставлять сюда бессмысленно, суть я думаю и так понятно.

Я понимаю, что судя по всему тут используется эльфийский, который я не знаю, а на изучение которого у меня уйдёт следующий месяц, из-за чего в частности для меня использовать подключение через какой-нибудь MSXML2.XMLHTTP60 бессмысленно.
По этому я стараюсь встать на костыли и запустив Internet Explorer дать ему команду сымитировать пользовательский клик и выбор опции. Пишу следующий код:
Код: (vb)

Sub WebIE_Connect()
    Dim IE As New SHDocVw.InternetExplorer 'Подрубаем IE
    Dim HTMLDoc As MSHTML.HTMLDocument 'Подрубаем работу с HTML
    Dim Checked As MSHTML.IHTMLElementCollection 'Подрубаем элемент из HTML
   
    IE.Visible = True 'Врубаем видимость IE
    IE.Navigate "https://www.dimex.ws/kalkulyator/ekspress/" 'Заходим на сайт
   
    'До тех пор, пока загрузка страницы не произойдёт, бездействуем:
    Do While IE.ReadyState <> READYSTATE_COMPLETE Or IE.Busy
    Loop
   
    Set HTMLDoc = IE.Document 'Пихаем HTML код в переменную
   
    Set Checked = HTMLDoc.getElementsByTagName("select") 'Записываем все элементы с тегом "Select"(она там одна, так что можно было и на прямик обратиться, но да пофиг)
   
    Application.Wait Now + TimeSerial(0, 0, 3) 'Ждём 3 секунды, ибо IE нужно время, что бы прогрузиться
   
    Checked(0).Value = "4" 'Меняем опцию на "Доставка по городу"
    Checked(0).Click 'Кликаем
   
    MsgBox "Сделано!", , "Ляляля!!!" 'Радуемся тому, что нихрена не получилось ((
End Sub


Как видно, если запустить данный код, то опция визуально поменяет своё значение, но страница при этом не подзагрузиться.
Собственно вопрос, есть ли возможность как сымитировать нажатие, а ещё лучше сделать это без IE. Очень прошу помочь, по возможности, накидайте пожалуйста ссылок на статьи по данной теме, так как я в гугле ничего найти не сумел.
Заранее - спасибо!


Название: Re:Работа с сайтом на ajax
Отправлено: Дмитрий Щербаков(The_Prist) от 07.07.2020, 11:29:08
Тут все непросто. Скачайте программу Fiddler, поиграйтесь параметрами и изучите те GET и POST, которые передаются сайту при выборе разных опций.
Следует еще так же учесть, что там и Cookie могут использоваться, что затрудняет автоматическую работу с сайтом.
Сейчас, если честно, нет времени заниматься этим.