Tx 0aec4d8581222c864c874481e579f67f02cac148@43646575

Included in block 43,646,575 at 2020-05-24 11:40:45 (UTC)


Raw transaction

ref_block_num65,134
ref_block_prefix3,486,486,169
expiration2020-05-24 11:41:12
operations
0.
0.comment
1.
parent_author""
parent_permlinkdeutsch
authorthebluewin
permlinkich-lerne-programmieren-und-du-kannst-das-auch-teil-3-python-steem-bot-mit-neuer-curation-bewertung
title"Ich lerne programmieren und Du kannst das auch [Teil 3] (Python-Steem-Bot mit neuer Curation Bewertung)"
body"Seit meinem [letzten Update](/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-2-erster-bot-mit-python) sind 13 Tage vergangen und mittlerweile hat sich wieder viel getan, von dem ich nun berichten will. Eigentlich sollte dieser Post schon bisschen früher entsehen, hatte aber aufgrund einer kurzen Erkältung keine große Lust.
Der letzte Stand meines Steem-Bots war ja, dass er deutsche Posts nach genau 14 Minuten upvotet, wenn diese bestimmte Mindeststandards erfüllen. Umso besser einige Kriterien wie Wortanzahl, Bilder usw. erfüllt sind, desto mehr % Upvote erhält so ein Post. Diese Kriterien sind natürlich nicht 100% sicher Garant für Qualität, aber sie sind ein Indiz. Manuelles Upvoten ist nach wie vor am besten und der Bot eine super Ergänzung.
Mit folgenden Funktionen wurde der Bot nun erweitert.
![code1839406_1280.jpg](https://files.steempeak.com/file/steempeak/thebluewin/KdVC9P7J-code-1839406_1280.jpg)
## 1. Bestimmte Tags ausschließen
Es gibt Themenbereiche die will ich nicht einfach so von einer Maschine upvoten lassen, deshalb habe ich eine Liste erstellt, die geprüft wird, bevor der Bot den Vote vergibt. Ganz besonders betrifft das den Tag #politik, welcher definitiv keinen vollautomatschen ungeprüften Upvote erhalten soll. Aber auch #giveaway und #contest wollte ich nicht einfach so upvoten. Diese und einige andere Tags sind momentan auf einer Blacklist, die sich jederzeit ohne Probleme erweitern lässt
```language
blacklist_tags = ["politik", "giveaway", "contest"]
s = Steem()
post_info = s.get_content(author, permlink)
tags_post = ast.literal_eval(post_info["json_metadata"])
for blacktag in blacklist_tags:
if blacktag in tags_post["tags"]:
title = "Ein Tag steht auf der Blacklist"
break
```
Momentan nutze ich für die Blacklist eine kleine Liste, werde diese aber bei Bedarf auf ein eigenes Textdokument auslagern. Ich habe noch mehr Tags auf der Blacklist und bin auch stets am Analysieren, welche Tags ich ebenfalls ausschließen will.
## 2. User ausschließen
Ebenso wie mit den Tags gibt es immer bestimmte User, die nicht gevotet werden sollen.
```language
ausnahmen = ["thebluewin", "auminda"]
if author in ausnahmen:
title = "User steht auf der Ausnahmenliste"
```
Selber möchte ich mich nicht aus Versehen durch den Bot upvoten lassen, ebenso stehen hier User, bei denen mir meine eigenen Curation Rewards egal sind.
## 3. Mit mehreren Accounts nacheinander voten
Erst habe ich den Bot nur für mich entwickelt, damit er mit @thebluewin gute Posts upvotet. Allerdings kam schnell der Wunsch das mit weiteren Accounts gleichzeitig machen zu können. Dazu musste ich mein Programm nur etwas umschreiben und kann nun x beliebige Accounts den gleichen Post upvoten lassen - mit individueller Voting Weight!
Account1 votet beispielsweise immer mit dem Standardwert (1), was wohl etwa einem Durchschnittsvote von 33% entspricht. Account zwei votet mit deinem Wert von (2), was einen Durchschnittsvote von 66% ergeben würde.
Hier ein kurzer Einblick, wie ein einzelner Vote funktioniert.
```language
voters= ["thebluewin", "PrivatePostingKey", "1"]
identifier = ('@'+author+'/'+permlink)
try:
s = Steem(keys=[voters[1]])
real_weight = round(post_bewertung * voters[2] / 3 * autoren_bewertung, 0)
if real_weight > 100:
real_weight = 100
s.commit.vote(identifier, float(real_weight), voters[0])
print("Erfolgreich gevotet: " + voters[0] + " mit " + str(real_weight) + "%")
except (RPCErrorRecoverable, RPCError) as err:
print("Exception encountered. Unable to vote")
continue
```
## 4. Autorenbewertung nach Curation Effizienz
Das größte und beste Update, das mein Bot bekommen hat, ist die Autorenbewertung. Ein Programm analysiert die Effizienz der durch den Bot geleisteten Upvotes, was die Curation Rewards betrifft. Wenn mir ein Upvote besonders viel Curation Rewards gebracht hat, erhält der Autor des Posts eine bessere Bewertung. Beim nächsten mal wenn dieser einen Post schreibt, bekommt der Post einen besseren Upvote, oder eben einen schlechteren, wenn der Curation Reward schlecht war. So hat jeder Autor einen eigenen Wert, der jederzeit verbessert oder verschlechtert werden kann.
Dieser Teil zielt natürlich fast nur darauf ab meine Curation Rewards zu verbessern. Autoren die noch ganz neu sind und trotz sehr guter Posts kaum Upvotes in Steem erhalten, werden an dieser Stelle auch von meinem Bot benachteiligt, da sie mir logischwerweise keine guten Curation Rewards eingebracht haben. Allerdings schaue ich mir immer nochmal persönlich alle Posts an und wenn wirklich richtig gute dabei sind, passe ich die Autorenbewertung manuell an.
### So ist der Ablauf der automatischen Bewertung:
1. Gevotete Posts werden in einem Dokument gespeichert
2. Ein Skript prüft das Dokument
3. Alle Posts in dem Dokument zwischen 7 und 14 Tage Alter werden analysiert
4. Es wird ein Durchschnittwert für die Curation Effizienz gebildet
5. Jeder einzelne Post der noch nie verarbeitet wurde wird analysiert und mit dem Durchschnittwert verglichen
6. Der Autor erhält eine neue Bewertung welche in ein eigenes Dokument gespeichert wird
Der schwerste Teil war es für mich zu berechnen, wie hoch die Curation Rewards bei einem Post für mich sind. Leider wird das nicht einfach so in der Blockchain gespeichert, sondern nur alle einzelnen Votes für einen Post. Ich habe es dann hinbekommen, bin mir aber nicht 100% sicher, ob das Programm die komplett richtigen Werte berechnet. Sie sind aber soweit richtig, dass sie für mein Programm reichen.
```language
for vote in sorted(votes[0:], key=lambda x: float(x["zeit"]), reverse=False):
reward = (vote["zeit"] / 900)
if reward > 1:
reward = 1

if vote["voter"] == "thebluewin":
change = 1
verlust = 1 - reward
eigener_wert = int(vote["rshares"])

if change != 1:
vor_mir_shares = vor_mir_shares + int(vote["rshares"])
else:
nach_mir_shares = nach_mir_shares + int(vote["rshares"])

komplette_shares = vor_mir_shares + nach_mir_shares
verlust = verlust * 0.25
vor_mir_shares = vor_mir_shares * 0.25
eigener_wert = eigener_wert * 0.25
komplette_shares = komplette_shares * 0.25
gesamtreward = (math.sqrt((vor_mir_shares + eigener_wert)) - math.sqrt(vor_mir_shares)) * math.sqrt(komplette_shares)* (1 - verlust)
effizienz = gesamtreward / eigener_wert
```
## Fazit
Mein Bot läuft jetzt bereits so lange, dass sich schon eine relativ gute Liste mit Autoren und deren Bewertung angesammelt hat. Ich werde nun beobachten wie sich meine Curation Rewards auf diese Art und Weise über die nächsten Wochen verändern und dann davon berichten.
Ansonsten möchte ich mich als nächstes auf die Contentbewertung eines Posts konzentrieren um diese hoffentlich noch stark verbessern zu können.
<hr/>
**Hier die ersten beiden Teile meiner Programmier-Serie:**
- /deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-1
- /deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-2-erster-bot-mit-python
"
json_metadata"{"community": "steempeak", "app": "steempeak/1.7.2b", "format": "markdown", "tags": ["deutsch", "python", "steemit-deutsch", "programmieren", "blog"], "users": ["thebluewin"], "links": ["/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-2-erster-bot-mit-python", "/trending/politik", "/trending/giveaway", "/trending/contest", "/@thebluewin", "/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-1", "/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-2-erster-bot-mit-python"], "image": ["https://files.steempeak.com/file/steempeak/thebluewin/KdVC9P7J-code-1839406_1280.jpg"], "canonical_url": "https://peakd.com/deutsch/@thebluewin/ich-lerne-programmieren-und-du-kannst-das-auch-teil-3-python-steem-bot-mit-neuer-curation-bewertung"}"
extensions[]
signatures
0.202cdc7da43151e981b6cf382e8d291b43dd278c8679d21d580ccedf61fe20ae6c6569d04c6fc21dbcd8813ab227fdc2bdc313860ce8e1e2af037e553af19641fd
transaction_id0aec4d8581222c864c874481e579f67f02cac148
block_num43,646,575
transaction_num12