Ich lerne programmieren und Du kannst das auch [Teil 2] - (Erster Steem-Bot mit Python)
Nun sind bereits zwei Wochen vergangen seit ich angefangen habe mir Python beizubringen. Jetzt habe ich mein erstes sinnvolles Programm für Steem entwickelt, auf das ich nun auch etwas stolz bin :)
Mein Ziel war es, automatisch Posts mit dem Tag #deutsch upvoten zu können. Aber natürlich nicht irgendwelche Posts, sondern gute Posts, die vollautomatisch als solche erkannt werden. Dieses Ziel habe ich nun erreicht. Bis dahin war es teilweise ein frustrierender Weg. Dazu nun mehr.
Installieren des Steem Moduls auf einem Windows Rechner (eine Qual)
Fast der schwierigste Teil war es erst mal das Steem Modul in mein Python zu integrieren. Das Ganze hat mich 5 Stunden gekostet. Immer wieder kamen Fehlermeldungen. Ich habe Microsoft Visual Studios installiert, da es mir in der Fehlermeldung geraten wurde. Das hat allerdings nichts geholfen. Ich will nicht zu viel dazu schreiben, allerdings habe ich mit den Posts von @holger80 rausgefunden, dass das mit Windows scheinbar tatsächlich nicht so einfach ist und ich nicht der einzige mit solchen Problemen bin. Mit dieser Anleitung habe ich es dann ganz schnell hinbekommen.
Auf die Posts in der Steem Blockchain zugreifen
Nun konnte es endlich losgehen. Ich habe erstmal alle möglichen Befehle durchsucht um mir eine passende Vorgehensweise zu erarbeiten.
Als erstes bin ich auf die Möglichkeit gekommen neu erstellte Posts als Stream ausgeben zu lassen. Das hat grundsätzlich sehr gut funktioniert, bis irgendwann immer ein Fehler aufgetreten ist. Das Programm hat rumgemeckert, dass ein Post der gerade gestreamt wird eigentlich gar nicht existiert. Das passiert wohl, wenn jemand einen Post sofort wieder löscht. Leider habe ich zu dem Zeitpunkt nicht rausgefunden wie sich das Problem lösen lässt und habe es dann mit einer anderen Vorgehensweise gelöst. Mittlerweile weiß ich, dass ich wohl mit Exceptions hätte arbeiten können, welche aber in meinem Kurs erst Teil der nächsten Lektion waren.
Bedanken will ich mich an dieser Stelle bei @isnochys der mir sofort in Discord meine Fragen zu Python in Bezug auf Steem beantwortet hat, obwohl wir uns davor noch nicht kennengelernt hatten.
Das war der Code der bei mir nicht ganz funktioniert hat:
from steem import Steem
s = Steem()
tags = ["deutsch", "german"]
for p in s.stream_comments():
for tag in tags:
if p.is_main_post() and tag in p["tags"]:
print (p)
Deshalb habe ich es dann mit get_discussions_by_created gemacht. Mit diesem Befehl kann ich auf die neuesten Posts in der Steem Blockchain zugreifen. Ich habe die Möglichkeit ein Tag mitzugeben, in meinem Fall "deutsch". Der Guide "Steem Python for Dummies" von @emrebeyler hat mir dabei auch sehr geholfen.
query = {
"limit": 10,
"tag": "deutsch"
}
for p in s.get_discussions_by_created(query):
Das limit lässt sich auf maximal 100 setzen. Soviele Posts werden dann auf einmal abgefragt. Wer mehr Posts braucht, führt einfach eine Schleife durch und wiederholt die Anfrage immer wieder in Kombination zweier weiterer Parameter. start_author und start_permlink.
query = {
"limit": 11,
"tag": "deutsch",
"start_author": letzter_author,
"start_permlink": letzter_permlink
}
for p in s.get_discussions_by_created(query):
Ich merke gerade, dass ich schon sehr detailreich schreibe und jemand ohne Python Erfahrungen wohl nicht weiß, was ich hier erkäre. Vor zwei Wochen wusste ich übrigens noch überhaupt nichts über Python, wer will kann das also in ähnlicher Zeit lernen.
Gefundene Posts in Datei speichern
Mein Script läuft in einer Dauerschleife und prüft so die ganze Zeit ob neue deutsche Posts erstellt wurden. Falls dies der Fall ist, speichere ich die Posts in ein Textdokument mit den Werten:
- Autor
- Permalink
- Erstellungszeitpunkt
So habe ich stets eine aktuelle Datei, mit der ich nun weiter arbeiten kann.
Content der Posts analysieren
In einem weiteren Programm greife ich nun auf meine Textdatei zu und lasse mir dann zu jedem Post den gesamten Content ausgeben. Den Content zerlege ich dann in alle Abschnitte. Ich zähle Sachen wie Bilder, Überschriften usw. Ich prüfe ob die Abschnitte auch wirklich in deutscher Sprache sind mit dem Modul langdetect (https://pypi.org/project/langdetect/) und wenn das der Fall ist, zähle ich die Wörter um später zu wissen, wieviele deutsche Wörter der Text insgesamt hat.
All das sind Qualitätsmerkmale für einen kleinen Algorithmus, den ich noch stets verbessern werde. Grob gesagt, umso besser ein Text ist, desto mehr Punkte weist ihm der Algorithmus zu.
Dieser Teil hat am meisten Zeit benötigt, da der Content viele Sonderzeichen und HTML-Tags in sich trägt und ich den ganzen String auseinander nehmen musste. Sicher kann an der Stelle mein Code auch noch eleganter geschrieben werden, für mich zählt aber erstmal, dass er ohne Probleme funktioniert!
Gute Posts nach 14 Minuten upvoten
Der finale Teil - ein Upvote für alle guten Posts nach exakt 14 Minuten. Dazu musste ich erstmal lernen wie man mit dem Modul timedate (https://docs.python.org/3.6/library/datetime.html#module-datetime) arbeitet.
Zum Glück gibt es Google und so auch immer viele Beispiele im Internet zu finden. Mein Gespür wie bestimmte Dinge in Python funktionieren werden durch das ewige Durchforsten von Beispielen immer besser.
Mein Upvote Script läuft auch in einer Dauerschleife und fragt alle paar Minuten die Datei mit den aktuellsten deutschen Posts ab. Diese Posts werden dann auf Qualität hin geprüft. Wenn die Qualität ausreichend ist, wird der Erstellungszeitpunkt des Posts abgefragt und entsprechend bereitet sich der Bot vor genau bei Minute 14 zu voten. Umso besser ein Post desto mehr % Upvote gibt es auch.
So sieht die Ausgabe meines Programmes derzeit aus "------" bedeutet, dass gerade kein guter Post gefunden wurde. Nach ein paar Durchläufen hat er dann zwei Posts gefunden, die der Bot dann entsprechend gevotet hat. (Die hier dargestellten Posts sind ein schlechtes Beispiel, damit ich es aber schnell zeigen konnte, habe ich die Anforderungen kurz runtergestellt.)
Fazit
Ich habe nun ein Programm, das permanent laufen kann und qualitativ hochwertige deutsche Posts upvotet. Ich verspreche mir davon zwei Sachen.
- Gute deutsche Posts werden besser belohnt
- Ich erhalte höhere Curation Rewards
Noch läuft das Programm mit einem Testaccount um noch mögliche kritische Fehler zu finden (falls es noch welche gibt). Wenn sich herausstellt, dass schon alles passt, werde ich das ganze Mal mit meinem Hauptaccount thebluewin laufen lassen. Zurzeit läuft das Programm schon seit 8 Stunden ohne Unterbrechnungen.
Optimierungsmöglichkeiten
Es gibt noch ein paar Möglichkeiten der Verbesserung.
- User von den Upvotes ausschließen
- Bestimmte Tags ausschließen - ich will nichts mit Politik zu tun haben und nicht zufällig Dinge upvoten die etwas mit einer politischen Richtung zu tun haben. Mein Bot erkennt dort den Unterschied nicht, deshalb werde ich bestimmte Tags einfach ausschließen.
- Automatische Upvote Anpassung wenn meine Voting Power mehr sinkt als sie sich regeneriert
Ich hoffe euch gefällt mein kleines Projekt. Wenn jemand Lust hat ebenfalls Python zu lernen, ich beantworte gerne sämtliche Fragen in den Kommentaren. Ein bisschen was dazu weiß ich ja nun schon und es wird stets mehr :)
Hier der erste Teil meiner Programmier-Serie:
/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-1
moin. hast du mal meinen deutschbot angeschaut :) ?
Ne noch nicht, hab schon mehrere Bots im deutschen Bereich gesehen, die wohl etwas ähnliches machen, aber hab noch keinen genauer angeschaut. Ich werd mir deinen deutschbot mal genauer anschauen, bestimmt kann ich ein paar Dinge lernen. Hast du einen Beitrag zu dem Bot, der näher auf die Mechaniken eingeht?
https://github.com/fxnormaluser/deutschbot
Das finde ich toll. Poste noch mehr davon. Will mir das auch beibringen. Bekommst einen 100% Upvote und einen Resteem.
Werde ich machen! Wenn ich dir irgendwo helfen kann, versuche ich gerne zu helfen.
Danke für den Upvote und den Resteem.
Cooles Projekt!
Kann bestimmt einigen Python und damit auch Steem näher bringen.
Trotzdem geht nichts über manuelles Kuratieren.
Posted using Partiko Android
Danke und ich stimme dir zu, dass manuelles Kuratieren am besten ist.
Ich sehe es auch eher als Ergänzung. 50% Upvotes durch den Bot und 50% durch die eigene Hand.
Habe auch schon drüber nachgedacht mir einfach eine Liste der Posts ausgeben zu lassen, die der Bot gut findet um danach selber nochmal drüber zu schauen und entsprechend Upvotes zu verteilen. So würde der Bot für mich nur vorselektieren.
Super :)
Kann auch verstehen, dass man nicht immer die Zeit findet um manuell zu kuratieren und dann Automatismen statt verschwendeter VP bevorzugt.. ^^
Posted using Partiko Android
Eigentlich suche ich nach einer Lösung in C# um einen Bot zu erstellen. Wennich nicht fündig werde, werde ich mir deins mal näher anschauen. Aber graust mir schon vor wenn du schreibst es ist auf Windows nicht so einfach...
Ja das war schon echt nervig mit Windows, aber wenn man weiß, dass es da Probleme gibt und eine Anleitung kennt, die genau das Problem löst, ist es doch recht simpel. Falls du dich für den Python Weg entscheidest, nutze unbedingt diese Anleitung: https://steemit.com/python/@holger80/how-to-install-steem-python-on-windows
Das erspart dir Stunden voller Ärger.
Oder noch besser verwende beem - die einfach bessere python library für steem
https://github.com/holgern/beem
das würde ich @thebluewin übrigens auch empfehlen...
auf windows vmware installieren und dann linux benutzen ; so hast du gleich eine gekapselte entwicklungsumgebung.
Sehr guter Beitrag. Danke.
Posted using Partiko Android
Thank you so much for participating the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.00% upvote! Together, let’s change the world!
Hey, Du wurdest von @altobot gevotet!
Hi, @thebluewin!
You just got a 20.44% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.
Hi @thebluewin!
Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 1.755 which ranks you at #31190 across all Steem accounts.
Your rank has dropped 45 places in the last three days (old rank 31145).
In our last Algorithmic Curation Round, consisting of 220 contributions, your post is ranked at #28.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server