Steemit-Bots
Mein Problem waren nach dem HF20 die häufigen Aussetzer der API-Nodes, weshalb die Bots und Programme, die ich davor geschrieben habe, nicht mehr zuverlässig funktionieren. Da ich irgendwie immer Probleme habe, Lösungen im Internet zu finden, habe ich jetzt doch eine Weile dafür gebraucht, sie selbst zu finden.
Immer wenn ich eine längere Zeit von der Blockchain mittels Python lese, tritt das Problem zufälligerweise auf.
from beem.blockchain import Blockchain
b = Blockchain()
def loop():
for op in b.stream(opNames=['transfer']):
print(op)
if __name__ == '__main__':
loop()
Das ist der Grundaufbau, wie ich ihn immer benutzt habe. Er läuft, solang die Nodes antworten. Wenn eine Node einen Timeout verursacht, wechselt die Beem-API zu einer anderen Node. Sobald aber zwei Nodes aufeinanderfolgend versagen, gibt es eine Fehlermeldung und das Programm stürzt ab.
from beem.blockchain import Blockchain
b = Blockchain()
def loop():
for op in b.stream(opNames=['transfer']):
print(op)
if __name__ == '__main__':
while True:
try:
loop()
except Exception:
pass # ignorieren oder eine Fehlermeldung ausgeben
Das wäre meine "Lösung" wenn der Code in der loop()
versagt, wird er automatisch neu gestartet. Das geht so einfach, wenn man Votingbots wie den @germanbot hat, bei denen nichts über Abstürze hinweg speichern muss. Wenn ich allerdings mal @steem-chain-info nehme, muss die ganze Zeit über gezählt werden und die Werte dürfen auf keinen Fall verloren gehen. Mit diesem Aufbau
from beem.blockchain import Blockchain
b = Blockchain()
def loop():
werte = {'blocks': 0}
for op in b.stream(opNames=['transfer']):
werte['blocks'] += 1
if __name__ == '__main__':
while True:
try:
loop()
except Exception:
pass # ignorieren oder eine Fehlermeldung ausgeben
ist das nicht möglich. Mit einer kleinen Anpassung jedoch schon.
from beem.blockchain import Blockchain
b = Blockchain()
werte = {'blocks': 0}
def loop():
global werte
for op in b.stream(opNames=['transfer']):
werte['blocks'] += 1
if __name__ == '__main__':
while True:
try:
loop()
except Exception:
pass # ignorieren oder eine Fehlermeldung ausgeben
Also werde ich jetzt alle Bots mal umschreiben und dann funktionieren sie hoffentlich wieder zuverlässig.
Anmerkung des Autors: Also hey, der Post bring wohl keine neuen Erkenntnisse, aber ich habe etwas geschrieben. Und das ist ja das, was ich will. Schreiben.
Das ist jetzt so ein bisschen wie ein Tagebucheintrag xD