Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

IE sichtbar obwohl visible := false



  • Please log in to reply
15 replies to this topic
real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

Hallo zusammen,

 

ich versuche gerade für ein Makro von mir einen Updater zu schreiben.

Hierfür frage ich von einer URL das letzte Änderungsdatum ab (http://zersan.de/autocall/update.php).

Wenn online eine neue Version verfügbar ist, soll dann die Datei heruntergeladen werden.

 

Ich habe allerdings schon beim Abfragen des Änderungsdatums probleme.

Anbei mein aktueller Code:

IE := ComObjCreate("InternetExplorer.Application")
IE.visible := false
IE.navigate("about:blank")
IE.document.location.href := "http://zersan.de/autocall/update.php"
while (IE.busy || IE.readyState < 4)
{
   Sleep,100
}
source_version := IE.document.body.innerHTML

msgbox % source_version

Auf meinem eigenen Rechner funktioniert der Code eigentlich einwandfrei.

Der IE bleibt versteckt, das Datum wird ausgelesen und in die Variable geschrieben.

 

Sobald das Makro aber auf einem anderen Rechner gestartet wird (auf dem kein AHK installiert ist - keine ahung ob das wichtig ist..) haut das ganze nicht mehr hin.

IE öffnet sich sichtbar (aber mit der korrekten URL).

Das datum wird NICHT in die Variable abgelegt - kann wohl aus irgend einem grund nicht ausgelesen werden!? - und das Update wird daher auch nicht gestartet.

 

Problem hier ist, dass ich hinter einem Proxy sitze bzw im IE ein Automatisches Konfigurationsscript hinterlegt ist - ohne das natürlich auch nichts geht.

Daher funktioniert zb "UrlDownloadToFile" nicht.

Konnte bisher keinen anderen Weg finden, um "nach außen telefonieren" zu können....

 

Hat irgendjemand eine Idee oder kann mir einen Tipp geben?

 

Viele Grüße und Danke schonmal!



real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

so,

 

habe eben (nach über 6 stunden suchen) eine möglichkeit gefunden wie es scheinbar auf jedem Rechner läuft:

url := "http://zersan.de/autocall/update.php?" + A_Sec + A_MSec

WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")

WebRequest.Open("GET", url, false)

WebRequest.Send()

msgbox % WebRequest.ResponseText

Einziges Problem ist, dass nicht der reine Text (Das Datum) ausgegeben wird, sondern noch 3 Sonderzeichen.

Kann jemand erklären wo die her kommen?

und wie ich die sauber beseitigen kann? (Meine nicht mit substr, o.Ä......)

 

 

WebRequest.ResponseText gibt derzeit "20140514091617" aus.



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
MsgBox, % DownloadToString("http://zersan.de/autocall/update.php?", 0)

DownloadToString(url, noproxy := 1, encoding="utf-8")   ; DownloadToString() by Bentschi
{
    static a := "AutoHotkey/" A_AhkVersion
    if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", noproxy, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
        return 0
    c := s := 0, o := ""
    if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
    {
        while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
        {
            VarSetCapacity(b, s, 0)
            DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
            o .= StrGet(&b, r>>(encoding="utf-16"||encoding="cp1200"), encoding)
        }
        DllCall("wininet\InternetCloseHandle", "ptr", f)
    }
    DllCall("wininet\InternetCloseHandle", "ptr", h)
    return o
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

Funktioniert. Danke ! :)

 

Hatte die Funktion "DownloadToString" schonmal getestet. Da hatte ich aber keine Ausgabe erhalten. - Komisch..

 

 

Kannst du vielleicht erklären, warum das visible := false scheinbar nur auf meinem Rechner funktioniert?



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Ich habe noproxy hinzugefügt
DownloadToString(url, noproxy := 1, encoding="utf-8")
MsgBox, % DownloadToString("http://zersan.de/autocall/update.php?", 0)


vlt deswegen hat es das letzte mal nicht funktioniert:

Ja, du kannst das Script ändern, damit ein Proxy verwendet wird...
in der Zeile 4 wird der DllCall InternetOpen ausgeführt:
if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
Rot markiert hab ich den Wert der geändert werden müsste.
Aktuell ist in dem Script eine 1, die für INTERNET_OPEN_TYPE_DIRECT steht.
Stellst du den Wert auf 0 für INTERNET_OPEN_TYPE_PRECONFIG, wird ein Proxy verwendet, wenn einer in den Internetoptionen eingestellt wurde



und wegen visible := false hab ich keine ahnung grin.png
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

oh cool danke, das hatte ich auf die schnelle überflogen :D

bzw ist mir nicht aufgefallen...

 

Hast du jetzt evtl noch eine Idee wie ich die neue Version am besten runterladen kann?

Wie gesagt,

UrlDownloadToFile, http://zersan.de/autocall/autocall.exe, C:\autocall.exe

klappt nicht, obwohl in der dokumentation steht, dass er den Standart Proxy nutzt...

 

Proxies: UrlDownloadToFile will use a proxy server to access the Internet if such a proxy has been configured in Microsoft Internet Explorer's settings.

Grüße



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
✓  Best Answer
DownloadToFile("http://zersan.de/autocall/autocall.exe", "C:\autocall.exe", 0)

DownloadToFile(url, filename, noproxy := 1)   ; DownloadToFile() by Bentschi
{
    static a := "AutoHotkey/" A_AhkVersion
    if (!(o := FileOpen(filename, "w")) || !DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", noproxy, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
        return 0
    c := s := 0
    if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
    {
        while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
        {
            VarSetCapacity(b, s, 0)
            DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
            c += r
            o.rawWrite(b, r)
        }
        DllCall("wininet\InternetCloseHandle", "ptr", f)
    }
    DllCall("wininet\InternetCloseHandle", "ptr", h)
    o.close()
    return c
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

Du bist einfach der beste :D

 

ich danke dir vielmals !



real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

Noch eine Frage... - Will dafür nicht unbedingt einen neuen Threat aufmachen..

Bin gerade am verzweifeln weil ich die Ausgabe des "DownloadToString" (String) nicht mit dem eigenen Datum (Int) vergleichen kann...

 

Es muss doch irgend eine Möglichkeit geben den Variableninhalt von String zu Int umzuwandeln...!?

Oder alternativ als Int in eine neue Variable zu sichern...

 

Habe schonmal versucht die String-Ausgabe zb. per Round() "umzwandeln".. das Ergebnis ist aber einfach nur 0...

Genauso verhält es sich mit Transform.

 

Kannst @jNizM: oder jemand anders mir hier noch helfen? :)

Danke Danke!



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
welchen teil des Datums willst du genau vergleichen?
Zeit? Datum? Datum & Zeit?

Die Ausgabe ist ja
20140514112404 = 14.05.2014 11:24:04
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

komplett.

Zuvor wir das Datum des Scripts selbst ausgelesen:

FileGetTime, local, %A_ScriptDir%\%A_ScriptName%, M                      ;20140514105829
online := DownloadToString("http://zersan.de/autocall/update.php?", 0)   ;20140514112404

und anschließend sollen die beiden Versionen Verglichen werden:

if(local < online)
{
	DownloadToFile("http://zersan.de/autocall/autocall.exe", "C:\temp\autocall.exe", 0)
}

Diese IF klappt aber eben nicht, weil local ein INT und online ein STRING ist ..... :(

 

Grüße



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
probiers damit
 
FileGetTime, local, %A_ScriptDir%\%A_ScriptName%, M
online := RegexReplace(DownloadToString("http://zersan.de/autocall/update.php?", 0), "\D")

if (local < online)
{
    DownloadToFile("http://zersan.de/autocall/autocall.exe", "C:\temp\autocall.exe", 0)
}

DownloadToString(url, noproxy := 1, encoding="utf-8")   ; DownloadToString() by Bentschi
{
    static a := "AutoHotkey/" A_AhkVersion
    if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", noproxy, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
        return 0
    c := s := 0, o := ""
    if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
    {
        while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
        {
            VarSetCapacity(b, s, 0)
            DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
            o .= StrGet(&b, r>>(encoding="utf-16"||encoding="cp1200"), encoding)
        }
        DllCall("wininet\InternetCloseHandle", "ptr", f)
    }
    DllCall("wininet\InternetCloseHandle", "ptr", h)
    return o
}

DownloadToFile(url, filename, noproxy := 1)   ; DownloadToFile() by Bentschi
{
    static a := "AutoHotkey/" A_AhkVersion
    if (!(o := FileOpen(filename, "w")) || !DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", noproxy, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
        return 0
    c := s := 0
    if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
    {
        while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
        {
            VarSetCapacity(b, s, 0)
            DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
            c += r
            o.rawWrite(b, r)
        }
        DllCall("wininet\InternetCloseHandle", "ptr", f)
    }
    DllCall("wininet\InternetCloseHandle", "ptr", h)
    o.close()
    return c
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Das Problem war der (unsichtbare) Unicode Charakter vor dem Datum.
Das hat dazu geführt, dass das Ganze nicht als Zahl erkannt werden konnte.
Also erst mit RegexReplace(var, "\D") alle nicht Zahlen entfernen.
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

real_Napster
  • Members
  • 11 posts
  • Last active: Nov 04 2016 11:01 PM
  • Joined: 25 Nov 2012

läuft perfekt! :) :)

 

jetzt versuch ich den Code noch zu verstehen..

 

Was macht er hier?

RegexReplace(StrGet(&buf, length, "cp0"), "\D")

Wie kommt er wieder auf das "Datum"?

Vermtlich über "buf" - was ist buf? :D

 

Grüße



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
habe den code geupdatet (drück F5) und darunter steht die Beschreibung zu RegexReplace
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you