Steem-python na przykładach #2: automatyzacja
Wstęp
Biblioteka steem-python pozwala na komunikację z blockchain Steem za pomocą języka Python. Oznacza to, że możemy za jej pomocą wykonywać wszystkie operacje jakie można wykonać bezpośrednio z interfejsu webowego (np Steemit), a nawet więcej. Poniższy artykuł ma celu pokazać jak można zautomatyzować pewne powtarzające się czynności: odbieranie nagród (claim rewards) oraz przeprowadzanie operacji POWER UP.
Odbieranie nagród
Za każdym razem kiedy otrzymamy nagrodę autorską albo kuratorską musimy dodatkowo kliknąć w przycisk Odbierz nagrody, żeby środki fizycznie znalazły się na naszym koncie. Niby nie jest to żaden problem, ale można sprawić, żeby wszystko odbywało się automatycznie. Myślę, że jest to szczególnie przydatne jeśli posiadamy np dwa konta (do różnej tematyki albo polskie / angielskie) albo jeśli ma być to wdrożone na koncie jakiegoś bota.
Poniżej przestawiona jest funkcja sprawdzająca czy dostępne są nagrody (zarówno w SBD jak i w VESTS (które będzie przeliczone na STEEM POWER)).
def reward_available(account):
reward_sbd_balance = Decimal(account['reward_sbd_balance'].split(' ')[0])
reward_vesting_balance = Decimal(account['reward_vesting_balance'].split(' ')[0])
if any([reward_sbd_balance, reward_vesting_balance]):
return { 'sbd': reward_sbd_balance, 'vesting': reward_vesting_balance }
else:
return False
Kolejna funkcja realizuje już samą operację odbierania nagród. Najpierw oczywiście sprawdzamy czy nagrody są dostępne (korzystając z wcześniejszej funkcji). Potem wykonujemy commit.claim_reward_balance
czyli fizyczne odebranie nagród. Aby wypisać ile dokładnie uzyskaliśmy SBD i STEEM POWER musimy jeszcze przeliczyć VESTS na właśnie STEEM POWER.
def claim_rewards(steem, account):
try:
rewards = reward_available(steem.get_account(account))
if rewards:
commit = Commit(steem)
commit.claim_reward_balance(account=account)
sbd = float(rewards['sbd'])
sp = Converter().vests_to_sp(float(rewards['vesting']))
print('Claimed rewards: %0.3f SBD, %0.3f STEEM POWER' % (sbd, sp))
except Exception as ex:
print(ex)
Najlepiej jeśli takie sprawdzanie wykonywałoby się automatycznie co jakiś czas (np co godzinę albo raz dziennie). Można to osiągnąć za pomocą poniższej funkcji albo programu takiego jak cron
.
def check_operations_every_hour(steem, account):
claim_rewards(steem, account)
t = Timer(3600.0, lambda: check_operations_every_hour(steem, account))
t.daemon=True
t.start()
Przykładowy wynik w konsoli:
POWER UP
POWER UP to proces zamiany STEEM na STEEM POWER. Jeśli komuś zależy na sile konta to prawdopodobnie będzie większość lub nawet całość środków przeznaczał właśnie na zwiększanie STEEM POWER. Poniższy kod najpierw sprawdza czy są dostępne STEEM, jeśli tak to wykonuje funkcję transfer_to_vesting
. Na koniec wypisuje na ekran liczbę zamienionych STEEM.
def powerup(steem, account_name):
available_steem = Amount(Account(account_name)['balance'])
if available_steem.amount > 0:
steem.commit.transfer_to_vesting(available_steem, account=account_name)
print('Powered up: %s' % available_steem)
Cały kod uzględniający dwie powyższe operacje znajduje się poniżej. Warto zwrócić uwagę na poniższe parametry:
account = 'nazwa_konta'
- nazwa konta, którym będzie posługiwał się skryptACTIVE_KEY = os.getenv('ACTIVE_KEY')
- klucz active (sam posting nie wystarcza, ze wzgledu na wykonywanie operacji POWER_UP), tutaj jest on wczytywany ze zmiennej środowiskowejnodes = ['https://api.steemit.com']
- lista węzłów Steemsteem = Steem(nodes=nodes, keys=[ACTIVE_KEY, ])
- obiekt steem z przekazaną listą węzłów oraz kluczy
import os
from threading import Timer
from decimal import Decimal
from steem import Steem
from steem.account import Account
from steem.amount import Amount
def reward_available(account):
reward_sbd_balance = Decimal(account['reward_sbd_balance'].split(' ')[0])
reward_vesting_balance = Decimal(account['reward_vesting_balance'].split(' ')[0])
if any([reward_sbd_balance, reward_vesting_balance]):
return { 'sbd': reward_sbd_balance, 'vesting': reward_vesting_balance }
else:
return False
def claim_rewards(steem, account):
try:
rewards = reward_available(steem.get_account(account))
if rewards:
commit = Commit(steem)
commit.claim_reward_balance(account=account)
sbd = float(rewards['sbd'])
sp = Converter().vests_to_sp(float(rewards['vesting']))
print('Claimed rewards: %0.3f SBD, %0.3f STEEM POWER' % (sbd, sp))
except Exception as ex:
print(ex)
def check_operations_every_hour(steem, account):
claim_rewards(steem, account)
powerup(steem, account)
t = Timer(3600.0, lambda: check_operations_every_hour(steem, account))
t.daemon=True
t.start()
def powerup(steem, account_name):
available_steem = Amount(Account(account_name)['balance'])
if available_steem.amount > 0:
steem.commit.transfer_to_vesting(available_steem, account=account_name)
print('Powered up: %s' % available_steem)
account = 'nazwa_konta'
ACTIVE_KEY = os.getenv('ACTIVE_KEY')
nodes = ['https://api.steemit.com']
steem = Steem(nodes=nodes, keys=[ACTIVE_KEY, ])
def main():
check_operations_every_hour(steem, account)
if __name__ == '__main__':
main()
Pozostaje jeszcze kwestia automatycznej zamiany SBD na STEEM. Jest to jednak proces nieco bardziej skomplikowany ze wzgledu na konieczność użycia węwnętrznego marketu. Będzie to tematem kolejnego posta.