# Wstęp
Biblioteka [steem-python](http://steem.readthedocs.io/en/latest/index.html) 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](https://steemsql.com/)) 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')
```
![fig.png](https://steemitimages.com/DQmXyVP8JSzaPZpk1Xi7w96h8J1VFyt4hgb8xd8BsBut7Y6/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 :)