Stukje broncode van pagina inlezen (liefst met VB 6.0)

Status
Niet open voor verdere reacties.

JankoJuraj

Gebruiker
Lid geworden
7 jan 2022
Berichten
13
Hallo iedereen!

Is het mogelijk om een stukje broncode van een webpagina 'in te lezen' in een variabele van een programmeertaal zoals (liefst :rolleyes:) VB 6.0?
Het gaat over deze pagina: https://www.puzzle-pipes.com/
en onderstaande afbeelding toont (de weg naar) het stukje code waarin ik geïnteresseerd ben (HTML en javascript, getoond in Chrome na F12):
LJftwj3

LJftwj3

pipes_1.jpg

Een beetje meer uitleg mag misschien wel...

Ik ben bezig met het maken van een 'robot-solver' voor de puzzels op die pagina.
Voor er iemand zich geroepen voelt om mij naar mijn voeten te geven: ja, dat mag daar... :)
Er is zelfs een aparte 'Hall Of Fame' voor robots.


Ik ben al een heel eind op weg, maar er is iets dat mij ergert :evil:
Met de methode die ik nu gebruik, duurt het inlezen van een 15x15 puzzel ca 15 seconden.
Het verzenden van de oplossing duurt ca 5 seconden.
Het vinden van de oplossing zelf duurt hooguit enkele MILI-seconden :shocked:
Die verhouding vind ik nogal krom, en dat inlezen/verzenden moet dus beter!!!

Voor het inlezen van de puzzel denk ik aan bovenstaande methode: inlezen van de javascriptcode " var task = '.......' " vanuit de HTML-broncode, maar alle suggesties zijn welkom.

Het laatste programmeerwerk dat ik ooit gedaan heb, is zo'n 20 jaar geleden in VB 6.0
Ik weet het... zelfs toen was VB6 al behoorlijk uit de mode, maar ik hou wel van een beetje retro :p
Als het echt nodig is, wil ik wel overwegen om iets in HTML/JavaScript (of zo?) te proberen. En weer... alle suggesties zijn welkom.

Met groetjes en dank voor alle reacties,
Janko.
 
Heb je al je profiling op je script toegepast om te kijken welk deel traag is, en waar die bottleneck zit?
 
Ik weet niet precies wat 'profiling' in deze context betekent, maar ik weet wel waar het boeltje traag gaat lopen...

Om de puzzel in te laden, 'lees' ik de kleur van een aantal specifieke pixels op het scherm.
Ik gebruik daarvoor API-calls. De essentie van de methode ziet er zo uit:

Code:
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long


Private Sub Command1_Click()


Dim myDC As Long
Dim clrTmp(29, 29) As Long
Dim GetDesktopWindow As Long
Dim x As Integer
Dim y As Integer
Dim i As Integer
Dim j As Integer
Dim sStart As Single
Dim sStop As Single
    
    myDC = GetDC(GetDesktopWindow)
    x = 50
    y = 300
    
    sStart = GetTickCount()
    For i = 0 To 29
        For j = 0 To 29
            clrTmp(i, j) = GetPixel(myDC, x + i, y + j)
        Next j
        DoEvents
    Next i
    sStop = GetTickCount()
    
    Label1.Caption = (sStop - sStart) / 1000
    
    ScaleMode = 3
    DrawWidth = 1
    For i = 0 To 29
        For j = 0 To 29
            PSet (i + 10, j + 10), clrTmp(i, j)
        Next j
    Next i


End Sub

Bovenstaand voorbeeld (1 formulier met 1 knop en 1 label) leest de kleur van een gebied van 30x30 pixels en laat zien hoe lang dat duurt.
 
Gemaakt in excel VBA, zou ook in VB6 moeten werken
Code:
Public Sub Main()

    sUrl = "https://www.puzzle-pipes.com/"
    sVarTask = "var task = '"
    lVarTask = Len(sVarTask)

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", sUrl, False
        .send
        sResponseText = .ResponseText
    End With

    With CreateObject("HTMLFILE")
        .body.innerhtml = sResponseText
        Set oScripts = .getelementsbytagname("script")
        For Each oScript In oScripts
            sScript = oScript.Text
            lTask = InStr(1, sScript, sVarTask)
            If lTask <> 0 Then
                lTaskText = lTask + lVarTask
                lQuote = InStr(lTaskText, sScript, "'")
                sTask = Mid(sScript, lTaskText, lQuote - lTaskText)
                Exit Sub
            End If
        Next
    End With
End Sub
 
@alphamax : dit is iets waar ik zeker mee aan de slag zal gaan!
Als ik het voorbeeld goed begrijp, dan wordt er een object gemaakt met een NIEUWE instantie van de puzzel-pagina.
Op zich al heel interessant, maar ik vermoed wel dat de puzzel in dat object een andere zal zijn dan degene die ik momenteel in mijn browser zie.
En dan zal ik ook naar een andere verzendmethode moeten zoeken...
 
Is inderdaad een probleem, als je de browser en VB6 naast elkaar hebt lopen, dan heb je 2 verschillende puzzles.
Ik denk ook dat je later programma matig in de browser op de tegels moet klikken om ze goed te zetten en op de button "done" moet klikken
 
Je kan wel met VB6 een instantie van internet explorer aanmaken.
Vanuit VB6 kan je met code elke button in internet explorer aanklikken.
 
... Ik denk ook dat je later programma matig in de browser op de tegels moet klikken om ze goed te zetten en op de button "done" moet klikken
Klopt helemaal! Zo doe ik het nu ook :thumb:

Je kan wel met VB6 een instantie van internet explorer aanmaken.
Vanuit VB6 kan je met code elke button in internet explorer aanklikken.
Kan die instantie ook zichtbaar gemaakt worden op een formulier?
En zou ik ook aan de broncode kunnen, op een gelijkaardige manier als jou excel VBA-code (maar dan toegepast op de IE-instantie)?
 
Code:
Public Sub Main2()

    sUrl = "https://www.puzzle-pipes.com/"
    sVarTask = "var task = '"
    lVarTask = Len(sVarTask)

    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .Navigate sUrl
        Do While .Busy Or .readyState <> 4
            DoEvents
        Loop
        sScript = .Document.getelementbyid("puzzleContainer").innertext
        lTask = InStr(1, sScript, sVarTask)
        lTaskText = lTask + lVarTask
        lQuote = InStr(lTaskText, sScript, "'")
        sTask = Mid(sScript, lTaskText, lQuote - lTaskText)
        .Quit
        MsgBox sTask
    End With

End Sub
 
Bedankt alphamax! Daar kan ik me zeker een hele tijd mee zoet houden :thumb:
 
Met de methode die ik nu gebruik, duurt het inlezen van een 15x15 puzzel ca 15 seconden.
Het verzenden van de oplossing duurt ca 5 seconden.
Het vinden van de oplossing zelf duurt hooguit enkele MILI-seconden
Volgens mij is het niet mogelijk om een pagina van internet in millisec te laden.
Bijvoorbeeld het linkje wat je bij #1 geeft:

wf-1.jpg

Maar 15 sec is erg veel :confused:

P.S. Internet Explorer zit in Windows 11 niet meer onder de motorkap.
 
Laatst bewerkt:
Volgens mij is het niet mogelijk om een pagina van internet in millisec te laden ... Maar 15 sec is erg veel ...
Ik denk dat ik hier verkeerd begrepen wordt. Dit is wat ik bedoelde:
stap 1 : Open een browser, en surf naar de puzzelpagina. Geen idee hoe lang dit duurt...
stap 2 : De robot 'leest' de puzzel en plaatst hem in zijn geheugen. Dit duurt ongeveer 15 seconden voor een 15x15 puzzel, en dat vind ik veel te lang.
stap 3 : De robot zoekt en vindt de oplossing binnen enkele
milliseconden.
stap 4 : De robot zendt de juiste muiskliks naar de juiste tegels en klikt dan op
'Done'. Dit duurt ongeveer 5 seconden, wat ik toch ook korter zou willen.
 
De robots zijn supersnel, zie zullen wel andere technieken gebruiken dan VB6

Robots / programmatic solvers info
1. baely 00:00.017
2. nbjohnson 00:00.381
3. dbut2 00:00.475
bron: https://www.puzzle-pipes.com/hall.php?hallsize=0

Het zal heel moeilijk zijn om dit te evenaren, maar het maken van een solver kan ook een persoonlijke uitdaging zijn.
 
Het ligt er ook aan hoe zuinig je met geheugenverbruik bent tijdens programmeren, hoeveel threads je gebruikt, en hoe snel je computer is.
 
stap 1 : Open een browser, en surf naar de puzzelpagina. Geen idee hoe lang dit duurt...
Voor stap 1, zie plaatje bij #11, het laden van de totale pagina duurt de eerste keer 4,4 seconden maar het plaatje wat je wilt hebben kan eerder beschikbaar zijn.
Daarna zal bij het opvragen de tijd korter zijn omdat bepaalde bestanden dan al in de cache van de browser staan.

Zit je op WiFi of met een kabeltje aan de router?
 
De robots zijn supersnel, zie zullen wel andere technieken gebruiken dan VB6
...
Het zal heel moeilijk zijn om dit te evenaren, maar het maken van een solver kan ook een persoonlijke uitdaging zijn.
Minder dan een halve seconde, inclusief verzenden van de oplossing... dat gaat inderdaad krap worden :confused:
Hoewel... De solver zelf is bliksemsnel :cool:

Het ligt er ook aan hoe zuinig je met geheugenverbruik bent tijdens programmeren, hoeveel threads je gebruikt, en hoe snel je computer is.
De echte bottleneck ligt volgens mij bij de snelheid waarmee je verbonden bent met de server van de puzzel.
Het inlezen van de puzzel en vooral het verzenden van de oplossing gaan tijd in beslag nemen.
De tijd nodig om de puzzel op te lossen is verwaarloosbaar.

...Zit je op WiFi of met een kabeltje aan de router?
Kan beide zijn... soms zelfs op laptop via hotspot van mijn gsm :d
De grafieken die je laat zien, zijn best knap!
 
... Zit je op WiFi of met een kabeltje aan de router?
Kan beide zijn... soms zelfs op laptop via hotspot van mijn gsm
De pagina bestaat uit meerdere bestanden die je naar je browser moet halen, zie plaatje #11, elke regel is een bestand.
Als je een langzame verbinding hebt (bijv. je zit te ver van je WiFi router) dan duurt het laden van de pagina relatief lang.
 
...
Als je een langzame verbinding hebt (bijv. je zit te ver van je WiFi router) dan duurt het laden van de pagina relatief lang.
Als ik ooit kans wil maken om in de Robot-Hall-Of-Fame te komen, zal ik zeker rekening moeten gaan houden met zo'n dingen :rolleyes:
Eerst maar eens kijken of ik iets fatsoenlijks in mekaar kan steken
;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan