Flugschwein avatar

de-STEM Coder Challenge - Meine Teilnahme

flugschwein

Published: 10 Jun 2018 › Updated: 10 Jun 2018de-STEM Coder Challenge - Meine Teilnahme

de-STEM Coder Challenge - Meine Teilnahme

Was ist die "Coder Challenge"?

Vor einer gefühlten Ewigkeit hat sco@sco, der zuständige für de-stem@de-stem, die deutsche Abteilung von steemstem@steemstem die Coder Challenge ins Leben gerufen. Bei dieser Challenge ging es darum, sco@sco ein Tool zu basteln, mit dem er auf Knopfdruck eine kleine Statistik für einen bestimmten Zeitraum zu bekommen. Der zweite Teil der Challenge war, ein Tutorial zur Benutzung des Tools zu erstellen (dieser Post).

Wie installiere ich das Tool?

Um das Tool nutzen zu können, muss man zuerst einige andere Sachen installieren. Als erstes sollte man Anaconda, eine Art modifiziertes Python, (das normale Python 3 sollte auch gehen, aber mir ist Anaconda lieber) installieren. Das ist nötig, weil ich das Tool in Python geschrieben habe.
Danach muss man beem, ein Python Modul für die Interaktion mit der Steem API, installieren. Ich gehe davon aus dass es mit den Links möglich ist, beides zu Installieren. Sollte es dennoch Probleme geben, bitte in den Kommentaren oder bei Discord bei mir melden.
Als letzten Schritt muss man das Tool selber herunterladen. Es besteht im Endeffekt aus einer einzigen Datei: de-stem-report.py. Diese kann man hier herunterladen.

Wie verwende ich das Tool?

Um das Tool zu verwenden, muss man es per Doppelklick ausführen. (sofern man .pyDateien auf seinem PC Standardmäßig mit der passenden Python Version ausführt.) Nach kurzem Warten, sollte man gefragt werden "Von wann?". Darauf kann man entweder eine Datum/Zeit Kombination (ich verwende das Format 2018-06-06 23:15:48), oder "post" eingeben. Wenn man "post" eingibt, wird automatisch der letzte Main Post von dem de-stem@de-stem account gesucht, und der Zeitpunkt der Erstellung gespeichert, als wäre dieser eingegeben worden.
Dann wird man gefragt "Bis wann?". Da gibt es wieder die Möglichkeit einen genauen Zeitpunkt einzugeben, und es geht auch nichts einzugeben. Dann wird die aktuelle Zeit genommen.
Danach muss man nur noch einige Zeit warten, und dann sollte eine report.txt Datei in dem selben Ordner wie das Skript erstellt worden sein. Wenn sich schon eine gleichnamige Datei in dem Ordner befunden hat, wird alles aus der Datei gelöscht und durch den neuen Inhalt ersetzt. In der Textdatei befinden sich dann Daten im folgenden Format:

Accounts:
@lauch3d
@lesshorrible
@egotheist
@astrophoto.kevin
@derbesserwisser
@lulafleur
@understando
@elektr1ker
@lianaakobian
@serylt
@drtobi18
@sco
@zest
@naturicia
@isarmoewe
@stayoutoftherz
@security101
@lichtcatchtoby
@paaddor
@drookyn
@tufeau
@chriddi
@steemzeiger
@crypto-bird
@dennis.bacchus
@remotehorst23
@flurgx
@mountain.phil28
@oendertuerk
@luegenbaron
@meluni
@misomaniac
@yu-stem
@vladimir-simovic
@vieanna
@antikesdenken
@reconnectnature
@humanduck
@m3thyl
@marlasworld
@theodora.austria
@happy.food.life
@halloworld
@anth0rx
@variola
@thepe
@berndpfeiffer
@altobee
@greenrun
@chloroform
@deepculture
@valth
@katerinaramm
@cryptowani
@alexs1320
@trumpman
@alekau
@john-borchert
@martinwinkler
@infinitelearning
@scienceangel
@spederson
@heutegelernt
@numbo
Insgesamt Votes:
208
Votes/Tag:
1.6507936507936507
Unique Authors:
64

Das sind die Werte für de-stem@de-stem seit der Account Erstellung bis heute ;)

Wie funktioniert das Tool?

Der Tutorial Part von dem Post ist jetzt vorbei. Ich erkläre nur noch Schritt für Schritt was das Skript macht.

from beem.account import Account
from beem.comment import Comment
import datetime
from dateutil import parser

Die zwei beem Imports, brauche ich um die account history zu sehen und um zu überprüfen ob steemstem@steemstem auf einen von de-stem@de-stem gevoteten Artikel gevotet hat. Datetime brauche ich für die verschiedenen zeitbezogenen Funktionen und den parser von dateutil verwende ich um die Eingaben zu parsen.

print('Looking for the best nodes')
acc = Account("fullnodeupdate")
latest_post = acc.get_blog(limit=1, raw_data=False)[0]
nodes = latest_post.json_metadata["nodes"]
acc.steem.set_default_nodes(nodes)
print('Done!')

Hier suche ich nach den aktuell besten Fullnodes, indem ich in den täglichen Posts von fullnodeupdate@fullnodeupdate nach den aktuell besten Nodes suche. Das hat sich bis jetzt als sehr zuversichtlich herausgestellt.

de_stem = Account('de-stem')
accounts = {}
von = input('Von wann?\n')
if von != 'post':
    von = parser.parse(von)
else:
    for i in de_stem.history_reverse(only_ops='comment'):
        if i['author'] == 'de-stem' and not i['parent_author']:
            von = parser.parse(i['timestamp'])
            break

bis = input('Bis wann?\n')
if not bis:
    bis = datetime.datetime.now()
else:
    bis = parser.parse(bis)

In diesem Teil suche ich den de-stem@de-stem und nehme die inputs von dem User auf. Wenn der User bei "Von wann?" post eingibt, durchsuche ich die history von de-stem@de-stem nach dem letzten Post bei dem de-stem@de-stem der Autor war und der ein main Post war. Dann wird dieser als variable gemerkt. Wenn bei "Bis wann?" nichts eingegeben wird, nehme ich mit datetime.datetime.now() den aktuellen Zeitpunkt.

for v in de_stem.history_reverse(only_ops='vote', start=bis, stop=von):
    if v['weight'] == 10000 and v['author'] != 'de-stem' and v['author'] != 'steemstem':
        post = Comment(v['author'] + '/' + v['permlink'])
        for voter in post['active_votes']:
            if voter['voter'] == 'steemstem' and v['timestamp'] < voter['time']:
                if v['author'] not in accounts.keys():
                    accounts[v['author']] = 0
                accounts[v['author']] += 1

In dem Bereich gehe ich alle Votes in dem vorher festgelegten Zeitraum durch, und suche die 100% Votes, bei denen de-stem@de-stem auf einen Post gevotet hat der nicht von de-stem@de-stem oder steemstem@steemstem ist. Dann überprüft das Skript ob steemstem@steemstem auch auf den Post gevotet hat, und ob der Vote später als der de-stem@de-stem vote erfolgt ist. Wenn alle Faktoren zutreffen, wird der Vote-Count für den gevoteten Account um 1 erhöht.

if (bis-von).days == 0:
    days = 1
else:
    days = (bis-von).days

with open('report.txt', 'w') as f:
    string = 'Accounts:\n'
    for i in accounts.keys():
        string += ('@' + i + '\n')
    string += 'Insgesamt Votes:\n' + str(sum(accounts.values()))
    string += '\nVotes/Tag:\n' + str(sum(accounts.values())/days)
    string += '\nUnique Authors:\n' + str(len(accounts))
    print(string)
    f.write(string)

Hier verwerte ich die gesammelten Daten zu einem String und schreibe sie in eine report.txt.

Leave de-STEM Coder Challenge - Meine Teilnahme to:

Written by

Austrian Teenager & Musician

Read more #de-stem posts


Best Posts From Flugschwein

We have not curated any of flugschwein's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From Flugschwein