Steem-python na przykładach #2: automatyzacja

in #polish6 years ago (edited)

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.
image.png

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_balanceczyli 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ę skrypt
  • ACTIVE_KEY = os.getenv('ACTIVE_KEY') - klucz active (sam posting nie wystarcza, ze wzgledu na wykonywanie operacji POWER_UP), tutaj jest on wczytywany ze zmiennej środowiskowej
  • nodes = ['https://api.steemit.com'] - lista węzłów Steem
  • steem = 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.

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 60061.12
ETH 3196.84
USDT 1.00
SBD 2.45