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. Możemy np. uzyskać interesujące nas informacje odnośnie danego posta czy użytkownika. Poniższy artykuł ma na celu pokazać jak w prosty sposób można przeprowadzić analizę bloga danego użytkownika. W przykładach użyte zostanie konto @glodniwiedzy.
Zestawienie tagów
Poniższy kod pobiera wszystkie posty (bez komentarzy) wybranego użytkownika, a następnie zlicza użyte tagi. Co ciekawe pobranie analogicznych informacji z bazy danych (np SteemSQL) jest bardziej skomplikowane.
from steem.blog import Blog
from collections import Counter
tags_counter = Counter()
account = 'glodniwiedzy'
for post in Blog(account).all():
tags_counter.update(post['tags'])
for tag, c in tags_counter.most_common(20):
print('{0}|{1}'.format(tag, c))
Tag | Liczba użyć |
---|---|
pl-technologia | 16 |
pl-artykuly | 16 |
polish | 16 |
pl-kosmos | 13 |
pl-samochodyelektryczne | 9 |
pl-nauka | 8 |
pl-motoryzacja | 3 |
pl-spacex | 1 |
pl-tesla | 1 |
Najczęściej głosujący użytkownicy
Kod jest bardzo podobny do poprzedniego, jedyna różnica to zliczanie użytkowników zamiast tagów.
from steem.blog import Blog
from collections import Counter
votes_counter = Counter()
account = 'glodniwiedzy'
for post in Blog(account).all():
votes = [v['voter'] for v in post['active_votes']]
votes_counter.update(votes)
for vote, c in votes_counter.most_common(20):
print('{0}|{1}'.format(vote, c))
Osoba | Liczba głosów |
---|---|
ocisly | 16 |
fervi | 16 |
nicniezgrublem | 16 |
glodniwiedzy | 16 |
lukmarcus | 15 |
astromaniak | 15 |
rafaka | 15 |
bazimir | 13 |
jacekw | 13 |
koltci | 12 |
diosbot | 12 |
mys | 11 |
mustermark | 10 |
pattttti | 10 |
runningt | 9 |
hellobot | 9 |
aditor | 8 |
albakerki | 8 |
rafalski | 8 |
hsx12 | 7 |
Najczęściej resteemujący użytkownicy
W bardzo podobny sposób możemy uzyskać informację o tym, którzy użytkownicy najczęściej wykonali resteem.
from steem.blog import Blog
from steem.steem import Steem
from collections import Counter
steem = Steem()
resteemed_counter = Counter()
account = 'glodniwiedzy'
for post in Blog(account).all():
resteemed = steem.get_reblogged_by(account, post['permlink'])
resteemed_counter.update(resteemed)
del resteemed_counter[account]
for tag, c in resteemed_counter.most_common(20):
print('{0}|{1}'.format(tag, c))
Osoba | Liczba resteem |
---|---|
nicniezgrublem | 15 |
ocisly | 13 |
martwykotek | 2 |
informator | 1 |
Suma wartości głosów użytkowników
Tutaj sytuacja jest już nieco bardziej skomplikowana. Każdy post posiada wartość rshares
na podstawie którego należy wyliczyć nagrodę. Do tego potrzebne są nam dodatkowe informacje tj:
reward_balance = 708456.791 STEEM
recent_claims = 432050845965919642
base_price = 3.424 SBD
Czyli innymi słowy wyznaczamy stosunek rshares
danego posta do całkowitego rshares
wszystkich postów, następnie mnożymy przez liczbę STEEM przeznaczonych na nagrody. I na koniec mnożymy przez cenę STEEM, żeby uwzględnić kurs.
Trzeba tylko pamiętać, że poniższe wyliczenia są przybliżone, gdyż biorą pod uwagę aktualne wartości (a nie dokładne wartości w momencie wypłaty).
from steem.amount import Amount
from steem.blog import Blog
from steem.steem import Steem
from collections import Counter
steem = Steem()
votes_counter = Counter()
account = 'glodniwiedzy'
reward_fund = steem.get_reward_fund()
reward_balance = reward_fund['reward_balance']
recent_claims = reward_fund['recent_claims']
base_price = steem.get_current_median_history_price()['base']
def get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price):
fund_per_share = Amount(reward_balance).amount / float(recent_claims)
payout = float(rshares) * fund_per_share * Amount(base_price).amount
return payout
for post in Blog(account).all():
votes = [v for v in post['active_votes']]
for v in post['active_votes']:
rshares = float(v['rshares'])
votes_counter[v['voter']] += get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price)
for vote, c in votes_counter.most_common(20):
print('{0}|{1:.3f}'.format(vote, c))
Osoba | Wartość głosów |
---|---|
albakerki | 71.313 |
noisy | 48.027 |
gtg | 19.876 |
nicniezgrublem | 6.285 |
lukmarcus | 3.620 |
ocisly | 2.677 |
diosbot | 2.222 |
fervi | 1.242 |
openart | 1.107 |
rafalski | 0.925 |
jacekw | 0.890 |
mys | 0.790 |
andzi76 | 0.502 |
alcik | 0.498 |
sisters | 0.444 |
astromaniak | 0.424 |
koltci | 0.327 |
hr1 | 0.293 |
bithubpl | 0.277 |
informator | 0.268 |
Suma wartości głosów użytkowników + wykres
Jeśli chcemy przedstawić wcześniejsze dane w graficznej formie, możemy użyć biblioteki matplotlib
, za pomocą której można w prosty sposób wygenerować wykres (tutaj kołowy).
from steem.amount import Amount
from steem.blog import Blog
from steem.steem import Steem
from collections import Counter
import matplotlib.pyplot as plt
from operator import itemgetter
steem = Steem()
votes_counter = Counter()
account = 'glodniwiedzy'
reward_fund = steem.get_reward_fund()
reward_balance = reward_fund['reward_balance']
recent_claims = reward_fund['recent_claims']
base_price = steem.get_current_median_history_price()['base']
def get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price):
fund_per_share = Amount(reward_balance).amount / float(recent_claims)
payout = float(rshares) * fund_per_share * Amount(base_price).amount
return payout
for post in Blog(account).all():
votes = [v for v in post['active_votes']]
for v in post['active_votes']:
rshares = float(v['rshares'])
votes_counter[v['voter']] += get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price)
labels = []
sizes = []
explode = []
other = 0
i = 0
n = 12
for i, (acc, value) in enumerate(sorted(votes_counter.items(), key=itemgetter(1), reverse=True)):
if i < n:
labels.append(acc)
sizes.append(value)
explode.append(0)
else:
other += value
labels.append('Pozostali')
sizes.append(other)
explode.append(0.1)
fig, ax = plt.subplots()
fig.set_size_inches(12, 12)
ax.pie(sizes, labels=labels, explode=explode, autopct='%1.1f%%', startangle=30)
fig.savefig('fig.png')
To taki szybki pokaz możliwości biblioteki steem-python
. Ale oczywiście można za jej pomocą osiągnąć o wiele więcej:
- głosować, dodawać posty i komentarze
- wykonywać transfery
- automatycznie handlować na wewnętrznym markecie
- wykrywać spam :)
Proponuję byś dodał te przykłady do:
https://steemprojects.com/projects/p/steemsnippets/
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ok, dobry pomysł, dodam.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Bardzo ciekawe, w prosty i przejrzysty sposób, pokazanie możliwości biblioteki Steem-python.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit