Post by gregster » 17 Feb 2018, 15:05
Willkommen im Forum, Zand007,
solche API-Daten sind tatsächlich meist im JSON-Format (als Zeichenkette); das Handling/Parsing lässt sich wesentlich vereinfachen, indem man eine entsprechende Hilfsbibliothek verwendet, um den erhaltenen String als Objekt ansprechen und auslesen zu können. Ich empfehle: Cocos JSON Lib (
https://autohotkey.com/boards/viewtopic.php?t=627 ). Die kann dann mit
#include in dein Skript eingebunden und genutzt werden.
Bei den abgerufenen Daten handelt es sich um ein 0-basiertes Array von JSON-Objekten (zumindest in der Browser-Darstellung von
https://www.binance.com/api/v1/ticker/allBookTickers), d. h. wenn wann nur bestimmte Werte auslesen will, muss man schauen, an welcher Stelle das gesuchte Objekt im Array steht (Vorsicht: AHK-Arrays sind 1-basiert, siehe Beispiel unten), vorausgesetzt diese Position ändert sich nicht. Man kann aber auch das gesamte Array durchlaufen, wenn man will.
Hier ein Beispiel, das alle Einträge durchläuft:
Code: Select all
#include JSON.ahk ; https://autohotkey.com/boards/viewtopic.php?t=627
URLDownloadToFile, https://www.binance.com/api/v1/ticker/allBookTickers, apidata.txt ; alternativ eine der URLDownloadToVar-Varianten aus dem Forum nutzen
FileRead, apidata, apidata.txt
arrayOfObjects := JSON.load(apidata) ; verwandle JSON-String in ein Objekt
loop % arrayOfObjects.length() ; durchlaufe das gesamte Array; wenn die interessanten Werte immer an derselben Stelle stehen, könnte man den/die entsprechenden Index(e) jedoch auch gezielt auslesen.
{
item := arrayOfObjects[A_index] ; beachte: das AHK-Array ist 1-basiert: Position 0 im Original ist Position 1 in unserem Array
; Greife auf die einzelnen Elemente des Objekts zu: (`r`n bewirkt einen Zeilenumbruch)
msgbox % "Array-Index: " (A_index-1) "`r`nSymbol: " item.symbol "`r`nBidPrice: " item.bidPrice "`r`nBidQty: " item.bidQty "`r`nAskPrice: " item.askPrice "`r`nAskQty: " item.askQty
}
ExitApp
Esc::ExitApp ; beende Skript vorzeitig
(platziere JSON.ahk im selben Verzeichnis und drücke Escape, um das Skript vorzeitig zu beenden)
Willkommen im Forum, Zand007,
solche API-Daten sind tatsächlich meist im JSON-Format (als Zeichenkette); das Handling/Parsing lässt sich wesentlich vereinfachen, indem man eine entsprechende Hilfsbibliothek verwendet, um den erhaltenen String als Objekt ansprechen und auslesen zu können. Ich empfehle: Cocos JSON Lib ( https://autohotkey.com/boards/viewtopic.php?t=627 ). Die kann dann mit [c]#include[/c] in dein Skript eingebunden und genutzt werden.
Bei den abgerufenen Daten handelt es sich um ein 0-basiertes Array von JSON-Objekten (zumindest in der Browser-Darstellung von https://www.binance.com/api/v1/ticker/allBookTickers), d. h. wenn wann nur bestimmte Werte auslesen will, muss man schauen, an welcher Stelle das gesuchte Objekt im Array steht (Vorsicht: AHK-Arrays sind 1-basiert, siehe Beispiel unten), vorausgesetzt diese Position ändert sich nicht. Man kann aber auch das gesamte Array durchlaufen, wenn man will.
Hier ein Beispiel, das alle Einträge durchläuft:
[code]#include JSON.ahk ; https://autohotkey.com/boards/viewtopic.php?t=627
URLDownloadToFile, https://www.binance.com/api/v1/ticker/allBookTickers, apidata.txt ; alternativ eine der URLDownloadToVar-Varianten aus dem Forum nutzen
FileRead, apidata, apidata.txt
arrayOfObjects := JSON.load(apidata) ; verwandle JSON-String in ein Objekt
loop % arrayOfObjects.length() ; durchlaufe das gesamte Array; wenn die interessanten Werte immer an derselben Stelle stehen, könnte man den/die entsprechenden Index(e) jedoch auch gezielt auslesen.
{
item := arrayOfObjects[A_index] ; beachte: das AHK-Array ist 1-basiert: Position 0 im Original ist Position 1 in unserem Array
; Greife auf die einzelnen Elemente des Objekts zu: (`r`n bewirkt einen Zeilenumbruch)
msgbox % "Array-Index: " (A_index-1) "`r`nSymbol: " item.symbol "`r`nBidPrice: " item.bidPrice "`r`nBidQty: " item.bidQty "`r`nAskPrice: " item.askPrice "`r`nAskQty: " item.askQty
}
ExitApp
Esc::ExitApp ; beende Skript vorzeitig
[/code]
(platziere JSON.ahk im selben Verzeichnis und drücke Escape, um das Skript vorzeitig zu beenden)