de-STEM Coder Challenge - Meine Teilnahme

in #de-stem7 years ago

Was ist die "Coder Challenge"?

Vor einer gefühlten Ewigkeit hat @sco, der zuständige für @de-stem, die deutsche Abteilung von @steemstem die Coder Challenge ins Leben gerufen. Bei dieser Challenge ging es darum, @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 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 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 auf einen von @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 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 und nehme die inputs von dem User auf. Wenn der User bei "Von wann?" post eingibt, durchsuche ich die history von @de-stem nach dem letzten Post bei dem @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 auf einen Post gevotet hat der nicht von @de-stem oder @steemstem ist. Dann überprüft das Skript ob @steemstem auch auf den Post gevotet hat, und ob der Vote später als der @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.

Sort:  

Jetzt noch ein bißchen Django lernen und du kannst es in ein web Tool verwandeln
:)

hust

"Wenn du das in python machst, kann ich gerne den Webservice dazu liefern" - @isnochys, hier sein Kommentar

Jetzt warten wir gespannt auf deinen Teil. :P

Hehe!

Du hast Ansprüche xD
Ich finde eigentlich ich habe das ganz gut gelöst...
Django steht aber eh auf meiner (viel zu langen) to-do Liste

Whohooo

Hi @flugschwein!

Your post was upvoted by utopian.io in cooperation with steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

Contribute to Open Source with utopian.io

Learn how to contribute on our website and join the new open source economy.

Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV

Congratulations @flugschwein! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!