❗️Das Stalking-Tool schlecht hin! 🧐 Big Data aus der Steemit API inkl. Beispiel und Auswertung 🤩 ❗️

in #deutsch7 years ago (edited)

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ß! ;)

iceberg-1321692_1920.jpg

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.

BIG DATA

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.

elastic-hearth.png

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.

kibana-logo.png

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\":\"http://cteipen.de/images/steem-profil.png\",\"name\":\"CuBy\",\"location\":\"Germany\",\"website\":\"http://cteipen.de\",\"cover_image\":\"http://cteipen.de/images/steem-banner.jpg\",\"about\":\"Don't mute my world, cause music is my life!\"}}","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)

felixxx-vote-last-19-months.png

@theaustrianguy (ca. 7 Monate)

theaustrianguy-votes-last-7-months.png

@chriddi (ca. 2 Monate)

chriddi-votes-last-60-days.png

@cuby (ca. 1 Monat)

cuby-votes-last-4-weeks.png

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

witness-list-rekursiv.png

Ä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


Das Bild konnte nicht geladen werden :( [Hier](https://i.imgur.com/GiapkPg.gif) geht es zur Quelle!


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. :)

Sort:  

Thank you! Feel free to share it with your followers 😉

Oha, mein lieber Christopfer, erlange ich jetzt sogar schon "Berühmtheit" bei den Informatikern?! Das ist schlecht, ich werde mich mit niemanden unterhalten können!
Auch nicht über deinen Artikel - ich verstehe kein Wort! Macht nix, ich bin von der Sonderschule 😉

Dann mal zu etwas, was ich "kann": Ich gebe dir mal ehrliche Anerkennung für diesen ganz prima aufgebauten Artikel. Er ist super gegliedert und durch Bilder und Graphiken aufgelockert, macht Lust auf´s Weiterlesen!

Zugegebenerweise habe ich nur weitergelesen, weil ich ja der Sache auf den Grund gehen musste, was ich wohl bei #steemstem zu suchen habe - Geisteswissenschaften sind da ja eher ausgeschlossen 😉

Tja, Pech gehabt, jetzt bist du in der Pflicht! Was genau sagt denn nun diese gestalkte Statistik über mich aus?! Meine Online-Zeit auf Steemit?! Kann nicht sein. Ich bin zwar täglich mal mehr oder weniger aktiv on, aber definitiv nie einen halben, gar ganzen Tag. Sollte ich mich ausloggen statt das iPad einfach auszuknipsen, wenn ich z.B. arbeite, mit den Hunden spaziere, mich mit Freunden treffe oder Zeit mit meinem Mann verbringe?

Bitte, bitte, kläre mich auf!

Ich gehe jetzt mal davon aus, dass mir die Antwort gefallen wird. Sollte diese Statistik nichts Positives aussagen, hättest du mich ja nie nicht als Beispiel erwähnt. Nein, nein, du willst dich nicht mit mir anlegen.

Insofern denke ich mal, ich sollte bei dir ein Bäumchen pflanzen. Notfalls kann ich ja zurückkommen und das Bein heben... 😉

LG, Chriddi

Loading...

Sehr sehr nice @cuby, ich habe mit derselbigen funktion gestern gespielt :D

LG, Niko

Hallo Christopher, danke dir für diesen Post! Ich habe deinen Post heute mittag gelesen und deinen damaligen Rat aus Teil 3 endlich in die Tat umsetzen können, das aktuelle Ergebnis dazu findest du hier. Freut mich wie das alles zusammengekommen ist, muss mir direkt mal Kibana geben, schaut ja richtig einfach aus! LG

Ich schaue mir den Artikel direkt mal an 😉

Ich nenne mich "Statistik-Fanatiker" und dachte mir einfach nur "... geil".

Freut mich 😁 Besteht die Überlegung das auch selber zu verfolgen? 🤔

Hab's mir in die Favoritenliste gespeichert - das behalte ich definitiv im Blick! ;)

Ist es grundsätzlich möglich, die Daten Stückweise historisch so zu holen, dass man am ende alles zusammen hat? Also z.b. ich lade 500 Mitglieder und dann 501-1000 usw. SG

Hallo, hat mich auch Interessiert! Hab mal recherchiert und im Netz hier was dazu gefunden.

https://github.com/steemit/steem-js/issues/6

Mit dem Custom Query ist das möglich

LG

Da konnte ich auch noch was dazu lernen 👍 gute Frage @halloworld und vorbildliche Antwort @snackaholic

Danke für den Beitrag, ich habe ihn mit großer Interesse durchgelesen.
#onlygoodvibes

Ich freue mich auf weitere Beiträge von dir @cuby

Danke für dein Feedback @oliver19xx. Hoffentlich wird das bei den zukünftigen Beiträgen auch so sein. ;)

@resteem.bot
Resteemed to over 11900 followers and 100% upvoted. Thank you for using my service!

Send 0.200 Steem or 0.200 Steem Dollar and the URL in the memo to use the bot.
Read here how the bot from Berlin works.

We are happy to be part of the APPICS bounty program. APPICS is a new social community based on Steem. The presale was sold in 26 minutes. The ICO will start soon. You can get a account over our invite link: https://ico.appics.com/login?referral=1fRdrJIW

@resteem.bot

Hi,
Nice to read about you and you posts and views. I am into steemit from august 2017, I am interested in photography and I am also into crypto trading and investing,I have followed you so you can also follow me. Let us all join hand and work with one common objective to make steemit reach to great height.
Best Of luck
Teenovision

Sehr interessanter Beitrag @cuby :)
Werde bei Zeit auch mal etwas damit rumspielen :P

Danke! Sehr gut :) Lass mich wissen, wie dein Eindruck dazu ist ;)