Итак, задача заключается в том, чтобы просто открыть сайт, и переходить по ссылкам в одной вкладке как паук. Просто следовать по цепочке. На данный момент есть вот такие варианты скриптов:
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://www.example.com/"
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, ".html") > 0 Then
url = a.href
Exit For
End If
Next
ie.Navigate url
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
Но здесь мне не подходит способ ie.Navigate url. Потому, что нужно, чтобы передавался referer при переходе по ссылке. А при ie.Navigate url этого не происходит, потому что он просто заново загружает ссылку. Я же придумал для передачи referer использовать a.focus : WshShell.SendKeys "{ENTER}". По этому сделал такой вариант:
Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "https://site.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
a.focus
WshShell.SendKeys "{ENTER}"
Exit For
End If
Всё сработало и точно как нужно. Но, осталась вторая задача... После того, как перешел по ссылке, нужно заново найти ссылку по той же "маске" и снова перейти по ней. Чтобы упростить, давайте вместо a.focus : WshShell.SendKeys "{ENTER}" использовать a.Click. Я потом под себя исправлю.
Вот и не могу придумать, каким образом просто повторить это действие .click снова и снова на каждой новой странице. Пробовал просто несколько раз повторить For Each, но ничего не происходило. Дальше второго перехода по ссылке скрипт застывал без ошибок.
Set ie = CreateObject("InternetExplorer.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
ie.Visible = True
ie.Navigate "https://site.com/"
'wait for IE to finish loading the page
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
a.focus
WshShell.SendKeys "{ENTER}"
Exit For
End If
next
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
a.focus
WshShell.SendKeys "{ENTER}"
Exit For
End If
next
While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend
For Each a In ie.document.getElementsByTagName("a")
If InStr(a.href, "site.com/directory1/") > 0 Then
a.focus
WshShell.SendKeys "{ENTER}"
Exit For
End If
next
Но здесь, похоже я просто еще очень глупый и не особо разбираюсь в структуре VBS. По этому сделал всё хоть и логично, но похабно Если бы подобный вариант сработал - меня бы это устроило просто идеально!
Далее начали появляться версии, почему не работает. К примеру:
When using the Click method your handle to the IE instance gets messed up for some reason. You could try to re-attach to the window with something like this:
Set app = CreateObject("Shell.Application")
For Each wnd In app.Windows
If InStr(1, wnd.FullName, "iexplore.exe", vbTextCompare) > 0 Then
Set ie = wnd
Exit For
End If
Next
Далее, Flasher показал самый оптимизированный вариант:
URI = "http://forum.script-coding.com/" ' исходный адрес
Sec = 1 ' максимальное число секунд на проверку загрузки страницы
' массив с искомыми подстроками и секундами на ожидание после пробела:
Arr = Array("viewtopic 3", "register.php 2", "rules.html 2")
Set IE = CreateObject("InternetExplorer.Application")
Dim M(0) : M(0) = 0 : IE.Visible = True : OpenURL URI
Sub OpenURL(URL)
IE.Navigate(URL) : T = Timer
Do : WScript.Sleep 50 : If Timer - T > Sec Then Exit Do
Loop Until Not IE.Busy And IE.ReadyState = 4
For Each Link In IE.Document.Links
If InStr(Link, Split(Arr(M(0)))(0)) And Split(Link, "#")(0) <> Split(URL, "#")(0) Then
If InStrRev(Link, "/index.php") = 0 And (InStr(Link, "://") Or Left(Link, 4) = "www.") Then
WScript.Sleep Split(Arr(M(0)))(1) * 1000
Link.Click : If M(0) = UBound(Arr) Then Exit Sub
M(0) = M(0) + 1 : URL = Link : Test = 1 : Exit For
End If
End If
Next : If Test Then OpenURL URL
End Sub
Но здесь скрипт при любых обстоятельствах(любые сайты, ссылки, и время ожидания) показывал одну и ту же ошибку сразу перед вторым переходом по ссылке. И дальше ничего не происходило.
Требуемый ресурс занят. 800700AA
Самый простой вариант, как мне показалось, предложил omegastripes:
Dim strUrl, oIE, oTag
strUrl = "http://forum.script-coding.com/"
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate strUrl
WScript.Sleep 5000
For Each oTag in oIE.Document.GetElementsByTagName("a")
If InStr(1, oTag.href, ".php") > 0 Then
oTag.Click
Do While Rnd < .9
WScript.Sleep 100 + Rnd * 2000
oTag.Click
Loop
Exit For
End If
Next
Отличается от всех тем, что действие .click помещено в Loop. С рандомным ожиданием между переходами. И вариант очень простой. Просто идеально! Ведь я запросто смогу его переделать под свои нужды с определенными сайтами и дополнительными действиями. НО! После первого перехода по ссылке опять получаю ошибку:
Разрешение отклонено: 'Click'. 800A0046
Мне подойдет даже самый примитивный вариант, который просто сработает. Даже если там просто повторяющиеся строчки. "Красота" кода не имеет значения. Просто хочу открыть сайт, найти ссылку, и клацать её на каждой странице куда заведет Быть может как-то можно заключить .click в переменную а потом её применять "снаружи" For each, как в варианте с .Navigate url? Уже всю голову поломал)) Просто не хватает знаний. VBS для меня не очень знаком. Но у новичков всегда так, главное амбиции поддерживать
Огромное спасибо за вашу помощь!