[코딩몰라여] steem-python으로 내가 받은 모든 보상 확인하기

in #kr-dev6 years ago

대문.png

  시리즈를 시작하기 전에, 코딩몰라여 시리즈와는 관계가 지금 당장은 없는 건에 대해 의견 제시를 하나 부탁드리고 싶습니다. 최근 유행하는 특정 유형의 댓글을 스팸으로 간주할 것인지, 그리고 대응은 어떻게 하는 것이 좋을 지에 대한 의견을 듣고 싶습니다. 부디 댓글로 의견을 말씀해주시어 제가 멋대로 설정했다는 지적도 막고, 다수의 kr 커뮤니티 유저들의 생각이 어떠한지 그들에게 전달할 수 있는 증거를 만드는 것을 도와주세요. # @steemitag에 대한 의견을 부탁드립니다.


  금요일에 '내일은 꼭 코딩몰라여 시리즈를 쓸겁니다!' 라고 했는데 지금 12시가 지나서 토요일이네요. 자고로 하루란 눈을 뜨고 잠드는 시간까지가 하루인 것입니다. 그러니 요일은 다르지만 거짓말은 하지 않은 것으로... (멍멍) 죄송합니다.

  라고 적고 새벽에 포스팅 쓰다가 어쩌다보니 잠들어서 이제 완성해서 올립니다 ' -'b 흑흑.. 미안합니다.. /사죄 x 2

  드디어 오늘은 자신이 받은 보상들의 총합을 구하는 프로그램을 만들어봅시다. 이번 포스트의 주제를 몇 번이나 말씀드리면서 쉬울거라는 말에 의심해주신 분들, 진짜 어려운지 한 번 봅시다 -ㅅ-++ 렛츠고!

01 하지마루요.png


# 보상이란 무엇인가!


02 보상.png

  먼저 스팀잇에서 보상이라는 것에 대해 코딩하는 입장의 시각으로 바라볼 필요가 있습니다. 보상은 STEEM(스팀), STEEM DOLLAR(스달), STEEM POWER(스파)로 나눠진다는 것은 모두 알고 계시겠지요? 주로 스달과 스파를 보상으로 받으셨을텐데, 최근 스달의 시가총액이 높아져 종종 스팀 또한 보상으로 들어오게 되었습니다.

  그런데 스팀 파워는 좀 특이합니다. 사실 우리가 흔히 쓰는 SP의 숫자가 스팀 파워의 본질이 아니고, Vest라는 단위가 있습니다. 이지스팀잇의 저자 중 한 분이신 @twinbraid님의 한결같이 재미난 스타일의 9개월 전 설명을 보시면 이해하실 수 있습니다. 스토킹해보면 저 땐 킹갓이라고 불리셨던 것 같은데 최근 포스트에선 그냥 샌드백이신 이유가 무엇인지...

# VEST와 스팀파워를 심심풀이로 알아보자

  또한, 시간이 갈 수록 vest 대 스팀의 가격 중에 스팀이 떡락을 하게 시스템이 만들어져있습니다. 이 글을 작성하는 현재 mvest 대 스팀의 가격 비율(steem_per_mvests)은 1:490입니다. 1: 490 스파를 보유하면 1,000,000 vests를 소유하게 됩니다. @hkmoon님의 포스트에선 1년 반 전에는 1:240이었다고 하네요.

  이런 설명을 드린 이유는, 아래와 같이 코드에서 스팀과 스달은 그대로 설정되어있지만 스팀 파워는 vest 단위로 들어오기 때문입니다.

'op': ['claim_reward_balance', {'account': 'maanya', 'reward_steem': '0.000 STEEM', 'reward_sbd': '2.333 SBD', 'reward_vests': '2316.120314 VESTS'}]}]


# 받은 보상 조회하기


구조.png

  지난 시간에 댓글 알람을 만들 땐 op가 'comment' 였던 것을 기억하시나요? 지갑에서 보상을 얻는 행동은 op가 'claim_reward_balance'로 기록됩니다. 따라서 op가 'claim_reward_balance' 로 기록된 것들을 가져오는 코드를 작성하면 됩니다. 최근 500번의 행동 중에 보상을 얻은 행동들을 조회해볼게요.

[ 코드 1 ]

from steem import Steem  
from steem.account import Account  
from steem.converter import Converter  
import re  
  
username = 'maanya'
s = Steem(nodes=["https://api.steemit.com"])  
converter = Converter(steemd_instance=s)  
  
a = Account(username)  
histories = list(a.get_account_history(index = -1, limit = 500, filter_by='claim_reward_balance', raw_output=True))

for history in histories:
    print('행동 번호: %d / 스팀: %s / 스달: %s / 스파: %s' %
          (history[0], history[1]['op'][1]['reward_steem'], history[1]['op'][1]['reward_sbd'], history[1]['op'][1]['reward_vests']))


[ 결과 1 ]

행동 번호: 5304 / 스팀: 0.069 STEEM / 스달: 13.261 SBD / 스파: 13787.281334 VESTS
행동 번호: 5115 / 스팀: 0.000 STEEM / 스달: 2.333 SBD / 스파: 2316.120314 VESTS
행동 번호: 4903 / 스팀: 0.000 STEEM / 스달: 1.611 SBD / 스파: 1563.147655 VESTS
행동 번호: 4878 / 스팀: 0.001 STEEM / 스달: 0.029 SBD / 스파: 138.771895 VESTS

# 받은 보상 모두 더하기



  최근에 내부거래소 비율이 망해서 스파로 전환 못하고 존버해야하지만 13스달 보상이라니 하루 아침에 아주 부우우자아아ㅏㅏ 가 되었군요 (뿌듯). 눈여겨 보셔야 할 점은 스팀, 스달, 스파의 값이 숫자만 저장되있는 것이 아니라 STEEM, SBD, VESTS 라는 수식어가 같이 저장되어있다는 점입니다. 즉, 값이 문자열로 저장되어있어요. 그래서 뒤의 수식어를 떼내어줘야 총합을 계산할 수 있습니다. 이 작업을 이전에도 했었는데 기억하시는 분 계실까요?

  제 마스터키를 잃어버리게 된 원인이라 꼴도 보기 싫은 ^^ 코딩몰라여 2편에서 정규식(Regular Expression)을 이용해 수식어를 떼낸 적이 있습니다. 같은 방법으로 수식어를 떼어내고 숫자로 만들어줍니다. [ 결과 1 ] 에서 최근 행동 번호가 5304로 나오니 get_account_history에서 결과를 5300개 가져오도록 limit도 수정해줄게요.

[ 코드 2 ]

histories = list(a.get_account_history(index = -1, limit = 5300, filter_by='claim_reward_balance', raw_output=True))

# 누적 값을 저장할 변수
sum_steem = 0
sum_sbd = 0
sum_sp = 0

for history in histories:
    # 스팀 수식어 떼어내기
    steem = history[1]['op'][1]['reward_steem']
    steem = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", steem)[0])

    # 스달 수식어 떼어내기
    sbd = history[1]['op'][1]['reward_sbd']
    sbd = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sbd)[0])

    # 스파 수식어 떼어내기
    sp = history[1]['op'][1]['reward_vests']
    sp = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sp)[0])

    # 계속 더해주기
    sum_steem += steem
    sum_sbd += sbd
    sum_sp += sp
    
# 과자값 출력 
print('%s가 이웃들에게 받은 과자 값!' % username)
print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' %
      (sum_steem, sum_sbd, sum_sp))


[ 결과 2 ]

maanya가 이웃들에게 받은 과자 값!
스팀: 0.199 STEEM / 스달: 68.848 SBD / 스파: 57885.482 VESTS

# VEST를 SP로 바꾸자!



  마지막으로 VEST를 우리가 잘 아는 SP로 변경해주도록 합니다. 현재 steem_per_mvests가 1:490이라고 했으니 [ 결과 2 ]의 57885의 VESTS를 SP로 환산하면 490 * 57885 / 1000000 = 28.364 SP 가 됩니다. steem_per_mvests는 계속 바뀌기 때문에 패키지를 이용해서 변경하게 코드를 만들어주어야 합니다. 이 작업을 해줄 패키지 이름이 steem.converter 의 Converter 입니다. 이미 [ 코드 1 ]에서 추가를 해두었죠. ㅅConverter는 VEST를 SP로 환산해주고, 반대로 SP를 VEST로 환산해주는 기능도 있습니다.

  코드 단 한 줄로 환산 과정을 날로 먹을 수 있습니다. 스파 수식어를 떼어난 부분의 바로 다음에 추가해주시면 됩니다.

sp = converter.vests_to_sp(sp)

출력 부분도 살짝 수정해줍니다.

print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' % (sum_steem, sum_sbd, sum_sp))

[ 결과 3 ]

maanya가 이웃들에게 받은 과자 값!
스팀: 0.199 STEEM / 스달: 68.848 SBD / 스파: 28.370 SP

# 끝!



어그로.png

  어떠셨나요? 이번엔 진짜 간단했죠?! 그렇죠? 아니면 죄송합니당... 코드도 중복된 부분이 자주 올라가서 그렇지 포스트 아래에 올릴 전체 코드를 보시면 짧습니다.

  오늘 알려드린 것에서 다시 생각해보면 좋은 것들을 짚어드리면

  • 스팀잇에서 스팀 파워(SP)는 VEST의 환산 값에 불가하다. 실제로 스파를 이용한 활동(e.g 보팅)의 영향은 VEST를 기준으로 계산합니다.
  • 상호 변환이 가능한 값들은 Converter 패키지를 이용해서 쉽게 변환할 수 있다.
  • 마아냐는 여러분들이 과자 값을 많이 주신걸 알아서 기분이 좋다. 항상 감사드리고 싶다.

입니다.

  다음 시간엔 여태까지 알려드린 기능들을 steem-python을 다루기 어려운 분들이 사용해보실 수 있도록 웹페이지 또는 상용 봇을 만들어보고 그 과정을 소개할 것입니다. 코딩 알려드리는 포스트에 굳이 행차하시어, 쓰지도 못하고 쓸데 없는거 알려준다며 깽판 부리시는 평행세계의 뱀파이어(@hsuhouse0907)도 나타나시고 있고요. 제령의식(?)을 해야겠습니다. 그리고 포스트를 읽기 쉽게하고, 소스코드를 편하게 이용하실 수 있도록 다음 포스팅엔 무조건 GitHub 같은걸 등록해서 가져오겠습니다. =ㅁ=)...

궁금한 부분은 언제든지 댓글로 말씀해주세요! :)
마아냐(@maanya) 였습니다.

이 글도 같이 보시면 어때요?
@jinuking님의 # [T!p] 스달 신규 발행이 멈춘다?! 언제?


# 전체 코드

from steem import Steem
from steem.account import Account
from steem.converter import Converter
import re

username = 'whoami' # 계정명을 입력해주세요.
s = Steem(nodes=["https://api.steemit.com"])
converter = Converter(steemd_instance=s)

a = Account(username)
histories = list(a.get_account_history(index = -1, limit = 5300, filter_by='claim_reward_balance', raw_output=True))

sum_steem = 0
sum_sbd = 0
sum_sp = 0

for history in histories:
    steem = history[1]['op'][1]['reward_steem']
    steem = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", steem)[0])

    sbd = history[1]['op'][1]['reward_sbd']
    sbd = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sbd)[0])

    sp = history[1]['op'][1]['reward_vests']
    sp = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sp)[0])
    sp = converter.vests_to_sp(sp)

    sum_steem += steem
    sum_sbd += sbd
    sum_sp += sp

print('%s가 이웃들에게 받은 과자 값!' % username)
print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' %
      (sum_steem, sum_sbd, sum_sp))

  • 코딩몰라여 3, 4편 [댓글 알람 기능]에 대한 포스팅 아이디어를 주신 @momoggo님께는 3, 4편 저자보상 스팀달러의 15%를 전달하였습니다. 감사합니다. :)

후문.gif

Sort:  

잘 모르지만, 덕분에 조금씩 눈에라도 익히고 있습니다.
자꾸 보다보면, 좀 더 알아 먹을 날이 오겠지요.
감사.

조만간 직접 사용해보실 수 있도록 하겠습니다 +_+

대단히 감사합니다.
배워서, 직접 수정도 하고, 실행도 하고 해 보고 싶어요..

요즘 Web3 랑 Solidity 보느라 Steem쪽 코드는 못 보고 있었는데, 시간 날 때 들여다 보고 싶게 만드네요^^

좋은 글 감사합니다~

후후후 +_+ 나중에 편하게 보실 수 있게 잘 정리해놓고 있겠습니다.

와....정말 무식하면 손발이 고생한다더니 저라면 하나하나 다 더했을텐데 ㅠㅠ
마아냐님 감사합니다! :) 멋져용👍

사실 제가 궁금해서 보상 목록을 갔다가... 이건 안되겠다 싶어서 만든 것이기 때문입니다 -ㅅ-b

히힛 그러셨군용!! 유용한 정보라 많이들 보셨으면 좋겠어요. :) 리스팀 합니다!

고마워요 송블리님 +_+//

그냥 편하게 살래요~

스트레스 안받는게 제일 입니다 -ㅅ-b

언젠가는!! 언젠가는!!!!

언젠가는...?! ' -'?! 언젠가는 어떤...!?

파이썬 배우고 싶어요. php 개발자는 오늘도 웁니다. ㅠㅠ

저는 php를 모르니 언젠가 php를 배우겠습니다... ㅋㅋㅋㅋ

마야나님 저거 꼭 파이썬으로 해야되요? 웹사이트 하나 만들어 주시면 안돼요? ㅋㅋㅋ +_+

다음 시간에...!! 투 비 컨티뉴...!!! 꼭 사용해보실 수 있도록 하겠습니다. ㅋㅋㅋ +_+

프로그래밍을 모르는 관점에서 어렵네요 ㅎㅎ
나중에 볼 수 있는 사이트나 툴이 있으면 멋질 것 같습니다^^

꼭 만들겠습니다 -0- 댓글 감사합니다.

드디어 오늘은 자신이 받은 보상들의 총합을 구하는 프로그램을 만들어봅시다. 이번 포스트의 주제를 몇 번이나 말씀드리면서 쉬울거라는 말에 의심해주신 분들, 진짜 어려운지 한 번 봅시다 -ㅅ-++ 렛츠고!

라는 말에 용기를 얻어 스크롤 하였으나..

코알못인 관계로 보팅만 누르고 도망갑니다...

파이썬 배워보려고 하는데

이왕이면 스팀잇과 관련된 뭔가를 만들어 보면

더 쉽게 습득(?)하게 되지 않을까 기대되네요..

아, 참고로 댓글 알람 기능으로 저는 텔레그램봇을

사용하고 있는데 제법 편하더라구요..ㅎㅎ

즐거운 일요일...(쓰다보니 월요일이네요)되세요.

멋진 글 감사합니다^^

말씀 감사합니다 +_+ 저도 코딩 실력이 엄청 뛰어나고 그런게 아니며, 기초서적 수준에서 벗어나질 않았습니다. 파이썬을 배우신다면 쉽게 만들어보실 수 있을거에요! 말씀하신 텔레그램 봇은 @otac님이 만드신 봇이겠죠? 저는 아직 안써봤는데...!! (메시지 알림에 스트레스가 있음) 많은 분들께 호평을 듣고 있습니다.

차,,,, 차암 쉽죠??
네.. 밥로스 아저씨의 얼굴이 오늘따라 반갑게 보이는 이유는 무엇인지 모르겠습니다 ㅠㅠ

그냥 마아냐님이 올리신 (뭔가 멋지다고 판단되는) 글이라 웃으면서 보팅하고 응원하고 갑니다!! :D
(아마도 이제야 시리즈를 쓰시는데 저도 단단히 한몫 했다는 자부심 -_-;;;; 때문이겠지요!)

마아냐봇이 파악한 thinky님의 심리에 맞는 짤

1600b553b1a484f84.jpg

ㅋ >_<;;;;

제가 애정하는 Python이네요!

파이썬 넘나 편리한 것... 댓글 감사합니다 :D

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 64029.44
ETH 3157.04
USDT 1.00
SBD 4.02