Na super,
bin halt Anfänger hab gedacht das muss alles über ein Browser laufen.
Vielen Dank für deine Mühe und noch eine schöne Adventszeit.
Gruß Windi
Na super,
bin halt Anfänger hab gedacht das muss alles über ein Browser laufen.
Vielen Dank für deine Mühe und noch eine schöne Adventszeit.
Gruß Windi
Hi ich muss mich nochmal melden!
Ich habe festgestellt dass ich mit der Json_1.au3 nicht das Script von AspirinJunkie ausführen kann und
mit der Jason_2 nicht den Webdriver.
Hier die Fehlermeldungen:
Was mache ich falsch?
Ich bin absolut kein Json-Mensch aber für mich sieht es aus als ob er die jeweilig übergebenen Strings nicht verarbeiten kann.
Prüfe doch mal deren Inhalt vor der Übergabe an die Funktion (Ausgabe in eine Datei oder Consolewrite).
Was mache ich falsch?
Wie AspirinJunkie bereits schrieb, benötigst Du den Webdriver überhaupt nicht.
Poste bitte mal die #Include Anweisungen, die Du verwendest.
Danke für die Rückmeldung.
Es ist nur seltsam das der Webdrv mit der einen Json läuft und mit der anderen nicht.
Und beim Script ist es umgekehrt.
Deshalb vermute ich es muss an der Json liegen.
Der Webdriver verwendet eine andere JSON-UDF als die von AspirinJunkie .
(siehe : https://www.autoitscript.com/wiki/WebDriver )
Was passiert denn, wenn Du das Skript von AspirinJunkie (Beitrag #20) ohne Änderungen (außer deinem Key) bei Dir laufen lässt ?
Für das Script brauch ich den Webdriver nicht.
Aber wenn die Geokodierung fertig ist muss ich mit dem Webdriver die Datei mit Mydrive an das Navi senden.
Dazu brauch ich ihn, um die iframes zu steuern.
Was passiert denn, wenn Du das Skript von AspirinJunkie (Beitrag #20) ohne Änderungen (außer deinem Key) bei Dir laufen lässt ?
Wie ich geschrieben habe mit der einen Json geht es mit der anderen nicht.
und einmal kommt Fehlermeldung 1 und bei der anderen kommt beim Webdriver Meldung 2.
Der Webdriver verwendet eine andere JSON-UDF
Das habe ich ja festgestellt!
und deshalb habe ich mich gemeldet.
Meine Frage?
Gibt es vielleicht noch eine andere Version der Json für beide.
Sorge einfach dafür das in beiden UDF keine doppelten Namen vorkommen und dann kannst du beide verwenden (natürlich musst du dann auch die entsprechenden Aufrufe abändern).
Die Json vom Webdriver kann man nicht umbennen, die andere schon!
Der Fehler "unknown function" kommt eigentlich nur wenn die Datei in welcher diese Funktion definiert ist nicht richtig inkludiert wurde.
Entweder fehlt die #include-Anweisung, oder sie bezeichnet die falsche Datei oder die einzubindende Datei befindet sich in einem anderen Ordner.
Wenn du die UDF also z.B. in JSON_2.au3 umbenannt hast, aber als include immer noch #include "JSON.au3" dasteht - dann kommt so ein Fehler.
Das wäre meiner Meinung nach der eigentliche Grund für die Fehler.
Nun hast du ja aber noch das zweite Phänomen mit den zwei gleichzeitig zu verwendenden UDFs, welche eine Funktion mit gleichem Namen definieren.
Nun da gibt es eigentlich nur die Lösung, welche Moombas bereits vorschlug:
Schnapp dir die UDF und änder in der Funktionsdefinition den Namen der Funktion _JSON_Get() (das ist soweit ich es überblicke die einzige die doppelt definiert wird)
Anschließend verwendest du im Skript diesen neuen von dir gewählten Namen.
Edit: Sehe gerade, dass die eben nicht doppelt benannt sind. Meine Funktionsnamen haben alle einen Unterstrich am Anfang - die von der anderen UDF nicht.
Es sollte daher also gar keine Probleme von der Bezeichnung her geben.
Hab jetzt gesehen, dass die Funktionen doch nicht doppelt bezeichnet sind - meine haben einen Unterstrich - die anderen nicht.
Es sollte daher eigentlich diesbezüglich keine Probleme geben.
Die zwei Screenshots bringen uns diesbezüglich auch nicht weiter.
Ein winziges Minimalskript welches den Fehler reproduziert wäre angebracht.
Ansonsten zwingt dich keiner meine UDF für die JSON-Weiterverarbeitung zu verwenden.
Du kannst das Skript von oben doch auch einfach so anpassen, dass die Extraktion der Werte über die andere UDF geschieht:
#include "JSON_1.au3"
#include <Array.au3>
; ANPASSEN!
Global CONST $SAPIKEY_TOMTOM = "..."
; Koordinaten zu Adresse abfragen:
$aKoordinaten = _tomtom_geocodeAdress("Wilnsdorf Hohe Roth 6")
If @error Then ; Fehler
MsgBox(48, "Fehler", "@error: " & @error & @CRLF & "@extended: " & @extended)
Else ; Ergebnis anzeigen
_ArrayDisplay($aKoordinaten)
EndIf
; gibt die Koordinaten einer Adresse mit Hilfe der TomTom Geocode-Api zurück
Func _tomtom_geocodeAdress($sAdresse, $sApiKey = $SAPIKEY_TOMTOM)
; URL zusammenbauen
Local $sURL = StringFormat('https://api.tomtom.com/search/2/geocode/%s.json?key=%s', _URIEncode($sAdresse), $sApiKey)
; Abfrage senden und Ergebnis in Variable speichern:
Local $sJSONReturn = InetRead($sURL)
If @error Then Return SetError(1, @error, Null)
$sJSONReturn = BinaryToString($sJSONReturn)
; JSON-String parsen:
Local $oJSON = Json_Decode($sJSONReturn)
; Lat und Lon aus Ergebnis extrahieren
Local $fLat = Json_Get($oJSON, ".results[0].position.lat")
If @error Then Return SetError(3, @error, Null)
Local $fLon = Json_Get($oJSON, ".results[0].position.lon")
If @error Then Return SetError(4, @error, Null)
Local $aRet[2] = [ $fLat, $fLon]
Return $aRet
EndFunc
; Funktion um Adresse innerhalb der URI zu kodieren:
Func _URIEncode($sData)
; Prog@ndy
Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "")
Local $nChar
$sData = ""
For $i = 1 To $aData[0]
$nChar = Asc($aData[$i])
Switch $nChar
Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
$sData &= $aData[$i]
Case 32
$sData &= "+"
Case Else
$sData &= "%" & Hex($nChar, 2)
EndSwitch
Next
Return $sData
EndFunc ;==>_URIEncode
Alles anzeigen
Hi @AspirinJunkie,
Du bist echt der größte, hab gar nicht gewußt was du damit meinst.
Es läuft alles perfekt.
War ja sooo froh das du mir geholfen hast.
Hab mal wieder gemerkt, dass ich noch sehr viel lernen muss.
Aber auf Grund meines alters, wird dass in diesem Leben nichts mehr.
Danke nochmal
auch an die anderen.
Gruß Windi
Aber auf Grund meines alters, wird dass in diesem Leben nichts mehr.
Ich sehe das genau anders^^ Je älter ich werde, desto mehr will ich noch (dazu-) lernen...und in einigen Jährchen, wenn ich dann in Rente bin, habe ich auch endlich genug Zeit dafür!
Ich sehe das genau anders^^ Je älter ich werde, desto mehr will ich noch (dazu-) lernen...und in einigen Jährchen, wenn ich dann in Rente bin, habe ich auch endlich genug Zeit dafür!
ZitatJe älter ich werde, desto mehr will ich noch (dazu-) lernen
Glaube mir ich spreche aus Erfahrung:
Du musst mindestens 40 % mehr dazu lernen.
Denn durch das alter vergisst du wieder 60 % und es wird immer mehr.
Noch mal eine Frage an die Expertenrunde?
Wie baut man so eine Url zusammen?
Ich hatte es so gemacht, geht auch, aber elend langsam, im Verhältnis von dem Script von AspirinJunkie
Local $Geo = "50.77677,7.08529:50.72258,7.37596"
Local $MS = 80
Global CONST $SAPIKEY_TOMTOM = "..."
Global $url = ("https://api.tomtom.com/routing/1/calculateRoute/" & $Geo & "/json?maxAlternatives=3&language=de-DE§ionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=" & $MS & "&key=********")
#include "JSON_1.au3"
#include <Array.au3>
; ANPASSEN!
Global CONST $SAPIKEY_TOMTOM = "..."
; Koordinaten zu Adresse abfragen:
$aKoordinaten = _tomtom_geocodeAdress("Wilnsdorf Hohe Roth 6")
If @error Then ; Fehler
MsgBox(48, "Fehler", "@error: " & @error & @CRLF & "@extended: " & @extended)
Else ; Ergebnis anzeigen
_ArrayDisplay($aKoordinaten)
EndIf
; gibt die Koordinaten einer Adresse mit Hilfe der TomTom Geocode-Api zurück
Func _tomtom_geocodeAdress($sAdresse, $sApiKey = $SAPIKEY_TOMTOM)
; URL zusammenbauen
Local $sURL = StringFormat('https://api.tomtom.com/search/2/geocode/%s.json?key=%s', _URIEncode($sAdresse), $sApiKey)
; Abfrage senden und Ergebnis in Variable speichern:
Local $sJSONReturn = InetRead($sURL)
If @error Then Return SetError(1, @error, Null)
$sJSONReturn = BinaryToString($sJSONReturn)
; JSON-String parsen:
Local $oJSON = Json_Decode($sJSONReturn)
; Lat und Lon aus Ergebnis extrahieren
Local $fLat = Json_Get($oJSON, ".results[0].position.lat")
If @error Then Return SetError(3, @error, Null)
Local $fLon = Json_Get($oJSON, ".results[0].position.lon")
If @error Then Return SetError(4, @error, Null)
Local $aRet[2] = [ $fLat, $fLon]
Return $aRet
EndFunc
; Funktion um Adresse innerhalb der URI zu kodieren:
Func _URIEncode($sData)
; Prog@ndy
Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "")
Local $nChar
$sData = ""
For $i = 1 To $aData[0]
$nChar = Asc($aData[$i])
Switch $nChar
Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
$sData &= $aData[$i]
Case 32
$sData &= "+"
Case Else
$sData &= "%" & Hex($nChar, 2)
EndSwitch
Next
Return $sData
EndFunc ;==>_URIEncode
Alles anzeigen
Viele Grüße vom alten Mann
der schon wieder die Hälfte vergessen hat
Windi
Wie baut man so eine Url zusammen?
Ich hatte es so gemacht, geht auch, aber elend langsam,
Die URL zusammenbauen bedeutet im Prinzip ja nur verschiedene Teilstrings hintereinander zusammen zu kleben.
Die Variante wie du es gemacht hast, ist exakt die Syntax die man hierfür in AutoIt verwendet.
Mir ist nur noch nicht klar was du mit "elend langsam" in diesem Zusammenhang genau meinst.
Die Ausführungsgeschwindigkeit ist es sehr wahrscheinlich nicht - denn das geht flott.
Ich vermute du meinst eher die Zeit die du zum Zusammenschreiben der Zeile benötigst - also die ganzen Anführungszeichen und &-Operatoren - oder?
Nun - ja das kann schon etwas aufwendig werden und zwischendurch auch zu Schreibfehlern führen - insbesondere wenn es sehr viele Bestandteile sind.
Ich werde dir daher mal ein paar Beispiele geben wie du eventuell den String etwas übersichtlicher zusammenbauen kannst.
Ausdrücklich möchte ich aber nochmal darauf hinweisen, dass die Variante die du genommen hast absolut korrekt und erstmal die präferierte Variante ist - du kannst es problemlos so weiter handhaben.
1. Befehlszeilenumbrüche einfügen für mehr Übersicht um nicht ewig lange Zeilen zu erhalten.
Hierzu verwendet man den _-"Operator" am Ende einer Zeile, der signalisiert, dass der Befehl auf der anderen Zeile weitergeht.
Auf diese Weise kann man Befehle in AutoIt auf mehrere Zeilen aufteilen:
Local $Geo = "50.77677,7.08529:50.72258,7.37596"
Local $MS = 80
Global CONST $SAPIKEY_TOMTOM = "..."
Global $url = "https://api.tomtom.com/routing/1/calculateRoute/" & _
$Geo & _
"/json?maxAlternatives=3&language=de-DE§ionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=" & _
$MS & _
"&key=" & _
$SAPIKEY_TOMTOM
ConsoleWrite($url & @CRLF)
Alles anzeigen
2. Option "ExpandVarStrings" setzen.
Wenn man diese Option setzt, dann kann man Variablen direkt in Strings verwenden indem man den Variablennamen in Dollarzeichen einschließt. (Makros in @-Zeichen).
Man muss nur bisschen aufpassen wenn man Dollar- oder @-Zeichen im String erhalten möchte - die muss man dann durch Dopplung vor einer Interpretation bewahren:
Opt("ExpandVarStrings", 1)
Local $Geo = "50.77677,7.08529:50.72258,7.37596"
Local $MS = 80
Global CONST $SAPIKEY_TOMTOM = "..."
Global $url = "https://api.tomtom.com/routing/1/calculateRoute/$Geo$/json?maxAlternatives=3&language=de-DE§ionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=$MS$&key=$SAPIKEY_TOMTOM$"
ConsoleWrite($url & @CRLF)
3. StringFormat verwenden.
StringFormat ist eigentlich nur die Umsetzung der guten alten C-Funktion "printf()" für AutoIt.
Hier definiert man seinen String und setzt darin Platzhalter, welche man auch noch für verschiedene Datentypen anpassen kann.
Die Werte die dann für die Platzhalter eingesetzt werden sollen, werden dann einfach in der selben Reihenfolge als folgende Parameter der Funktion eingetragen.
Im einfachsten Fall wäre der Platzhalter ein %s welches angibt, dass dort ein String eingefügt werden soll.
Local $Geo = "50.77677,7.08529:50.72258,7.37596"
Local $MS = 80
Global CONST $SAPIKEY_TOMTOM = "..."
Global $url = StringFormat( _
"https://api.tomtom.com/routing/1/calculateRoute/%s/json?maxAlternatives=3&language=de-DE§ionType=traffic&routeType=fastest&traffic=true&avoid=unpavedRoads&travelMode=car&vehicleMaxSpeed=%s&key=%s", _
$Geo, $MS, $SAPIKEY_TOMTOM)
ConsoleWrite($url & @CRLF)
4. Für jeweiligen Anwendungsfall Helfer schreiben.
Da wir es hier mit einer URL und GET-Parametern zu tun haben kann man sich das ganze eventuell übersichtlicher gestalten, wenn man die Parameter einzeln als Liste behandelt und sich die URL dann automatisiert zusammenbauen lässt.
Die GET-Parameter einer URL sind im Grunde nur Schlüssel-Wert-Paare und damit eignet sich eine AutoIt-Map wunderbar um diese strukturiert zu halten.
Auf die Art kann man sich eine kleine Helferfunktion schreiben und bekommt so evtl. etwas mehr Übersicht in sein Skript:
Local $Geo = "50.77677,7.08529:50.72258,7.37596"
Local $MS = 80
Global CONST $SAPIKEY_TOMTOM = "..."
; neue leere Map für die URL-Paramter erstellen:
Global $mParameter[]
; Parameter einzeln hinzufügen:
$mParameter["maxAlternatives"] = "3"
$mParameter["language"] = "de-DE"
$mParameter["sectionType"] = "traffic"
$mParameter["routeType"] = "fastest"
$mParameter["traffic"] = "true"
$mParameter["avoid"] = "unpavedRoads"
$mParameter["travelMode"] = "car"
$mParameter["vehicleMaxSpeed"] = $MS
$mParameter["key"] = $SAPIKEY_TOMTOM
; URL zusammenbauen lassen:
$url = _createURLString("https://api.tomtom.com/routing/1/calculateRoute/" & $Geo & "/json", $mParameter)
ConsoleWrite($url & @CRLF)
; nimmt eine Basis-URL und die GET-Parameter als Map und erstellt daraus die Gesamt-URL
Func _createURLString($sBaseURL, $mParameter)
Local $sRet = $sBaseURL & "?"
For $sKey In MapKeys($mParameter)
$sRet &= _URIEncode($sKey) & "=" & _URIEncode($mParameter[$sKey]) & "&"
Next
Return StringTrimRight($sRet, 1)
EndFunc
; Funktion um Adresse innerhalb der URI zu kodieren:
Func _URIEncode($sData)
; Prog@ndy
Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "")
Local $nChar
$sData = ""
For $i = 1 To $aData[0]
$nChar = Asc($aData[$i])
Switch $nChar
Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
$sData &= $aData[$i]
Case 32
$sData &= "+"
Case Else
$sData &= "%" & Hex($nChar, 2)
EndSwitch
Next
Return $sData
EndFunc ;==>_URIEncode
Alles anzeigen
Glaube mir ich spreche aus Erfahrung:
Du musst mindestens 40 % mehr dazu lernen.
Denn durch das alter vergisst du wieder 60 % und es wird immer mehr
Hmm, kann ich eigentlich nicht bestätigen. Als Post-Sixty habe ich eher den Eindruck, dass das Lernen mit jedem neuen Lebensjahr leichter fällt. Die richtigen Lerntechniken hat man in den vergangenen Jahrzehnten immer weiter verfeinert und da die Basis immer größer wird, sind es immer nur recht wenige wirklich neue Lerninhalte.
OK, das Erinnerungsvermögen nimmt manchmal unerwartet eine kleine Auszeit - aber nicht wirklich dramatisch.
Vielen Dank für die ausführliche erläuterung.
Dachte meine Version wäre eine stümperhafte.
Bin jetzt aber ganz Stolz.
Hab Stunden damit verbracht, mit den Befehlszeilenumbrüchen.
Jetzt weiß ich was ich immer vergessen habe es waren die " am Ende jeder Zeile. ( _ ) das wusste ich!
Zitat
Ich hatte es so gemacht, geht auch, aber elend langsam,
Hab es mit Stringsplit auseinander genommen und Zeilenweise in Excel eingefügt.
Deine Funtionen sind der Hammer (weiß zwar nicht was das ganze Zeug bedeutet).
Im Array fluschtschen sie in null Komma nix durch.
Arbeite erst seit 2 Monaten mit Arrays.
Nochmals Vielen Vielen Dank