Hinweis: Dieser Beitrag enthält viele technische Ausführungen, die vermutlich für manche Leser nicht allzu interessant seien könnten. Ich habe mir Mühe gegeben, den Beitrag dennoch recht ansprechend zu schreiben. Lasst mich via Kommentar wissen, wie gut oder schlecht mir das gelungen ist. Danke! ;)
Beruflich habe ich bereits von Elasticsearch und Kibana gehört und war nach dem ersten Eindruck hell auf begeistert, was man alles mit diesen Tools bewerkstelligen kann. Nun will ich euch mit dieser Begeisterung anstecken. Dazu habe ich ein Beispiel vorbereiten, dass zeigt, was an der Spitze des Eisbergs auf uns wartet. Viel Spaß! ;)

1. Motivation
In @chriddi's Beitrag "Stalking-Tools" - Ich bin platt... #4 hat sie sich bereits über die Stalking-Möglichkeiten ausgelassen, die durch Steemit offen stehen. Sie schreibt darin:
Obwohl eine Lobeshymne auf das geniale Tool SteemWorld von @steemchiller angebracht wäre, bevor ich auf den provokanten Titel dieses Artikels eingehe, werde ich es ob der Arbeitsweise unseres Denkorgans doch lieber zum Abschluss noch einmal freundlich erwähnen.
An der Stelle war mein Interesse schon geweckt. Beinah zeitgleich verfolgte ich die Beitragsreihe JS Tutorial: Wie man einen Zufallsgenerator programmiert von @snackaholic. Darin erklärt er Schritt für Schritt, wie man einen Zufallsgenerator programmiert. Ein Hinweis an ihn meinerseits: "Nutze die Steemit API." Nun will ich aber auch meinen Beitrag zur Nutzung der Steemit API leisten.
Das war mein erster Gedanke, als ich die Datenmasse gesehen habe, die man mit der Steemit API aus der Blockchain ziehen kann. Statistiken fand ich schon immer super interessant. An der Stelle schoß mir Elasticsearch und Kibana in den Kopf. Aber was steckt eigentlich hinter diesen beiden Begriffen?
2. Allgemeines
2.1 Was ist Elasticsearch?
Auf der Webseite elastic.co wird Elasticsearch damit beschrieben, dass es eine verteilte Such- und Analytik-Engine ist, die für eine wachsende Zahl von Anwendungsfällen verwendet werden kann. Es ist das Herzstück das Elastic Stacks, das deine Daten speichert und unfassbare Analyse-Möglichkeiten bietet.

Oder ganz plump gesagt: Eine Eier-legende-Wohl-Milch-Sau im Bereich der Suche und Analyse von Daten.
Aber das dauert doch ultra lange, bis die Daten gefunden und/oder eruiert wurden
Tatsächlich nicht. Elasticsearch ist super schnell. Hier das Kauderwelsch (für die Nerds unter euch) mit dem Elastic selber beschreibt, wie das funktionieren kann:
Wir haben invertierte Indizes mit finiten Transduktoren implementiert, um Volltext-Queries, BKD-Bäume zur Speicherung numerischer und geographischer Daten sowie eine spaltenorientierte Datenstruktur für die Analytik zu ermöglichen.
Da ich aber an dieser Stelle noch nicht eure Aufmerksamkeit verlieren will, reicht das als kurze Einführung. Mehr findet ihr hier.
2.2 Was ist Kibana?
Kibana ist ebenfalls von Elastic (wer hätte es gedacht) und ist ein Tool, mit dem die Daten aus Elasticsearch in großer Vielfalt visualisiert werden können. Analysen wie
"Warum werde ich um zwei Uhr morgens benachrichtigt?"
oder
"Warum hat der Regen Auswirkungen auf die Quartalszahlen?"
sind für Kibana eine leichte Aufgabe. Die Lernkurve des Tools ist sehr angenehm. Das hängt auch mit der intuitiven Oberfläche zusammen. Nach anfänglichen Schwierigkeiten, konnte ich recht fix die ersten Daten in Kibana auswerten.

Somit lässt sich sagen, dass Kibana "dein Fenster in den Elastic Stack" ist, wie es von den Entwickler absolut passend beschrieben wird. Die Interessierten unter euch finden hier mehr Informationen zu dem Thema.
3. Die Steemit API
Anfangs von der Nutzung doch recht abgeschreckt, durfte ich schnell feststellen, dass die Verwendung der API von Steemit super einfach ist. Schnell erzielt man Ergebnisse und kann mit diesen weiter arbeiten. Ich habe mich für den Aufruf per JavaScript entschieden. Vor allem, weil @snackaholic in der Richtung bereits den Weg geebnet hat ;)
3.1 Account auslesen
Fix eine HTML-Datei erstellt und die API-JS-Datei eingebunden und schon konnte es losgehen. Wie sieht denn mein Account aus?
3.1.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var namen = ["cuby"];
steem.api.getAccounts(namen, function(err, result) {
if(result != null && result.length == 1){
document.getElementById("result").textContent += JSON.stringify(result);
}
});
</script>
</head>
<body>
<div id="result"></div>
</body>
</html>
3.1.2 Ausgabe
{"id":582214,"name":"cuby","owner":{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5qdFRyTfJAaFtcXsXhJwcujxkn7h8xYGzDQCyPsjhybq25Cwt6",1]]},"active":{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5dCBqfxw1MxCRhMEUgprjjzcE2asxGbXVvAuL6MDHe6tLGZtmi",1]]},"posting":{"weight_threshold":1,"account_auths":[["dtube.app",1],["steem-plus-app",1]],"key_auths":[["STM8dWSXZDPQufjVtUxsRiscQKVN95HGHKm4nCUVM2UPituvjw9EU",1]]},"memo_key":"STM6swgbwRhKyYMZuhHN27rdounifr8Eij8gWAUbPvFJxhwQdTryA","json_metadata":"{\"profile\":{\"profile_image\":\"
,"proxy":"","last_owner_update":"1970-01-01T00:00:00","last_account_update":"2018-01-12T23:59:36"
[...]
"average_bandwidth":"43083706393","lifetime_bandwidth":"265849000000","last_bandwidth_update":"2018-02-09T10:32:00","average_market_bandwidth":"17363637148","lifetime_market_bandwidth":"76070000000","last_market_bandwidth_update":"2018-02-04T08:04:06","last_post":"2018-02-09T10:30:54","last_root_post":"2018-02-03T10:53:39","vesting_balance":"0.000 STEEM","reputation":"131843759610","transfer_history":[],"market_history":[],"post_history":[],"vote_history":[],"other_history":[],"witness_votes":["felixxx","good-karma","stoodkev"],"tags_usage":[],"guest_bloggers":[]}
Wow! Das sind ganz schön viele Daten. Wie sieht es denn mit dem Auslesen der Votes eines Users aus?
3.2 Votes
3.2.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var name = "cuby";
steem.api.getAccountVotes(name, function(err, result) {
if(result != null && result.length > 0){
for (var i = 0; i < result.length; i++) {
document.getElementById("result").textContent += JSON.stringify(result[i]) + "\n";
}
}
});
</script>
</head>
<body>
<div style="white-space: pre;" id="result"></div>
</body>
</html>
3.2.2 Ausgabe
{"authorperm":"scrooger/how-to-post-with-html-markdown-super-simple-with-copy-paste-cheat-sheet-make-your-posts-looks-so-much-better","weight":0,"rshares":0,"percent":10000,"time":"2018-01-09T22:22:36"}
{"authorperm":"scrooger/steemit-notifications-where-or-how-or-why","weight":0,"rshares":0,"percent":10000,"time":"2018-01-09T22:24:00"}
{"authorperm":"epico/convert-sbd-to-steem-and-steem-power-guide-2017625t103821622z","weight":0,"rshares":0,"percent":10000,"time":"2018-01-16T23:28:30"}
{"authorperm":"sempervideo/otl4dzhh","weight":282,"rshares":589920000,"percent":10000,"time":"2018-01-09T21:31:39"}
[...]
Das läuft ja gut! Dann wollen wir mal die Daten für Elasticsearch aufbereiten, dazu habe ich das Script um folgende Zeile in der for-Schleife ergänzt:
document.getElementById("result").textContent += "{\"index\":{\"_id\":\"" + i + "\"}}\n";
Das war nötig um das Format zu erreichen, das Elasticsearch für die Eingabe der Daten benötigt. Dann wollen wir doch mal schauen, wie das ganze in Kibana aussieht.
3.3 Votes Statistik
Für die Auswertung habe ich mir die Votes von @felixxx, @theaustrianguy, @chriddi und die meinen genommen. Der Zeitraum ist seit Beginn, bis zum Ausführen des Scripts (ca. 06.02.2018 um 14 Uhr herum). Wie groß der Zeitraum ist, steht in der Überschrift und im Bild rechts oben.
@felixxx (ca. 19 Monate)

@theaustrianguy (ca. 7 Monate)

@chriddi (ca. 2 Monate)

@cuby (ca. 1 Monat)

3.3.1 Ergebnis
Erschreckend! Wie in dem bereits erwähnten Beitrag von @chriddi kann man buchstäblichen jeden "stalken", der sich auf der Blockchain auslässt. Onlinezeit, Aktivität, Nutzerverhalten. Quasi: alles! Für Statistik-Fanatiker: Perfekt! Für alle anderen User: "Was soll's" bis "Holy sh*t".
Klar, jeder sollte sich darüber im klaren sein, dass sein/ihr Handeln festgehalten wird und damit nachgehalten werden kann.
"With great power goes great responsible." - Richard Nixon, 1972
Wie wahr, wie wahr.
3.4 Die Grenzen der API
Ich habe ebenfalls versucht das Script für @good-karma laufen zu lassen. Da ging die API in die Knie. Die Antwortzeit war viel zu hoch. Könnte damit zusammenhängen, dass man nicht die Masse an Votes, die er getätigt hat, mit einem Aufruf ermitteln kann. Schade :-D
4. Was könnte man damit noch anstellen? - Rekursive Witnesses!
Als ich die Daten für meinen Account ermittelt habe, wurden auch meine Witnesses aufgelistet. Da dachte ich mir:
Hey, warum schmeiße ich die Accounts nicht erneut in das Script!
Gedacht, getan. Schnell eine rekursive Funktion drumherum gebaut und ausgeführt. Zum Glück habe ich die maximale Anzahl der zu ermittelnden User auf 100 begrenzt und alle ausgegebenen Benutzer in einer Liste vermerkt. Soll ja keiner doppelt vorkommen.
4.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var glb_counter = 0;
var glb_userlist = [];
var MAX = 100;
function rek_acc(namen){
steem.api.getAccounts(namen, function(err, result) {
if(result != null && result.length > 0){
for (var i = 0; i < result.length; i++) {
if(!glb_userlist.includes(result[i]["name"]) && glb_counter < MAX){
glb_userlist.push(result[i]["name"]);
document.getElementById("result").textContent += "{\"index\":{\"_id\":\"" + result[i]["id"] + "\"}}\n";
document.getElementById("result").textContent += JSON.stringify(result[i]) + "\n";
glb_counter++;
test(result[i]["witness_votes"]);
}
}
}
});
}
var names = ["cuby"];
rek_acc(names);
</script>
</head>
<body>
<div style="white-space: pre;" id="result"></div>
</body>
</html>
4.2 Ausgabe

Ähnlich wie bei den Votes wollte ich die Daten in Elasticsearch eingeben, doch trotz der korrekten Formatierung, konnten die (public) Authentifizierungsschlüssel nicht erfasst werden. Da werde ich nochmal ans Klemmbrett müssen.
5. Fazit
Alles in allem war es super interessant mit der API rumzuspielen. Kurze Einarbeitung und vielversprechende Ergebnisse. Wer im Informatik- oder Statistik-Bereich unterwegs ist, der sollte sich das unbedingt mal anschauen. Wie zu Anfang schon erklärt, war das nur die Spitze des Eisberges. Prinzipiell kann man sich mit der API auch eine eigene Webseite oder App bauen, die jede Funktionalität von Steemit.com beinhaltet und noch mehr! Es wird für mich und damit auch für euch sicherlich nicht das letzte Mal gewesen sein, dass ich die API von Steemit verwendet habe.
Danke fürs Lesen
CuBy
PS: Fehler bei der Rechtschreibung und Grammatik sind stilistische Mittel und vom Autor bewusst platziert worden. :-D
 geht es zur Quelle!](https://images.ecency.com/p/Zskj9C56UondJxcjVaienfhVaNb7LJVWG6e787gZyu8kBPrbmu9KNNe7XJUs4uTzPimxHjgqEzaQ9K9QqanHL3C5nKy6kWmrqCoh8PGvLpuxU5KotfoB.png?format=match&mode=fit)
Do-It-Yourself
Du willst das Script auch mal ausführen? So geht es:
- Eines der Scripts kopieren
- In einen Texteditor deiner Wahl einfügen
- Statt "cuby" den Namen eines anderen Steemit-Users angeben
- Die Datei mit der Endung ".html" an einem beliebigen Ort auf dem Computer speichern
- Zu dem Speicherort navigieren
- Die Datei z.B. durch Doppelklick in einem Browser deiner Wahl öffnen.
Schon hast du das Script für jenen angegebenen User ausgeführt. :)