[코딩몰라여] steem-python의 시작과 보팅파워 확인
하이 미나상 도-모, 버츄얼 스티미언 마아냐 입니다 (표절) . 앞으로 python을 이용하여 steem과 관련된 프로그램을 만들고, 만드는 과정을 소개해보려고 합니다. 또한, 앞으로 작성할 코딩 포스트 시리즈를 '코딩몰라여' 로 이름 붙이기로 했습니다. 원래 일은 쳐다보기 싫은 법이니까요. 'ㅂ'b
▲ 이런 느낌.
그럼 힘이 잔뜩 들어간 첫 편! 빠르게 시작해보겠습니다.
먼저 환경 설정은 이 포스트를 참조해주세요.
[ steem-python 패키지 설치 ]
이제 Anaconda Prompt를 열고, 만들어둔 가상 환경을 activate하고, 패키지를 설치하는 법은 익숙해지셨으려나요? ^^ steem-python의 설치는 얼마 전까지 고통스러웠지만 최근에 간단해졌습니다. Anaconda Prompt에서 아래의 명령어를 입력해주세요.
conda install -c conda-forge steem
y
첫 명령어를 입력하면 설치할건지 물어보는 메세지가 나오는데 y는 그 때 적어주시면 됩니다. 설치에는 몇 분 정도 걸리니 기다려주세요. 이게 끝입니다. 간단하죠?
[ steem-python 시작! ]
pycharm을 실행해서 자신이 스팀 달러를 얼마나 가지고 있는지 출력하는 것으로 패키지가 잘 설치되었는지 확인해봅시다.
코드
from steem import Steem
s = Steem()
print(s.get_account('maanya')['sbd_balance'])
결과
12.039 SBD
저는 12.039 SBD를 가지고 있네요. maanya 대신에 여러분들의 계정명을 입력하면 여러분들의 스팀 달러가 얼마나 있는지 확인할 수 있습니다. get_account를 통해 가져올 수 있는 정보가 무엇이 있는지 확인하려면 ['sbd_balance'] 를 빼고 실행해보면 됩니다. 그럼 모든 정보를 얻어올 수 있습니다.
- name (계정명)
- 포스팅, 오너, 메모, 액티브 공개키
- 지갑 사정 등등
- steemd.com에서 확인할 수 있는 것들은 전부 다 <=== ※이게 젤 중요
스팀잇 세상은 무서운 세상입니다. 모든 활동을 다아아아 볼 수 있습니다. 현실의 자신과 연결점이 없도록 조심합시다. 그래서 제가 버츄얼 스티미언을 지향 중입니다.
[ 내 Voting Power 확인 ]
일전에 @wanabe 님께서 보팅 파워가 99.5% 이상이 되었을 때 알려주는 챗봇을 구현하는건 어떨지 이야기해주셨습니다. 감사합니다. :D
간단히도 get_account의 정보 안엔 voting_power 가 있습니다. 정수 값으로 되어있기 때문에 100으로 나눠주면 구할 수 있습니다. 다른 클래스인 steem.account에도 같은 방법으로 값을 산출합니다.
print(float(s.get_account('maanya')['voting_power']) / 100.0)
결과를 steemd.com 에서 확인해보면... 값이 다릅니다. busy와 steemd에서 확인되는 내 Voting Power는 같은데 API를 통해 구해보니 값이 다릅니다. 혹시나 해서 Voting Power가 100%인 계정에서 정보를 가져오니 최대 값이 9,800입니다. 단순히 생각하면 10,000이어야하는데요. 그래서 9,800으로 나누어봐도 값이 차이가 납니다.
그래서 다른 계산 공식을 찾아다니던 중, 아래의 코드를 발견했습니다.
from dateutil.parser import parse
from datetime import datetime
def get_voting_power(account_data):
last_vote_time = parse(account_data["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff_in_seconds * 10000 / 86400 / 5
total_vp = (account_data["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
갑자기 코드가 복잡하게 보이나요? 천천히 같이 살펴봅시다. 먼저 가장 최근에 보팅한 시간을 가져옵니다 (last_vote_time). 그리고 현재 시간과 최근에 보팅한 시간의 차이를 초 단위로 계산합니다 (diff_in_seconds). 이를 이용하여 시간에 따라 회복된 보팅 파워를 계산합니다 (regenerated_vp). 보팅 파워는 하루에 2,000씩 충전되는 모양이네요. 계정에 기록된 보팅 파워에 생성된 보팅 파워를 더해서 현재 보팅 파워 (total_vp) 를 계산합니다. 만약 100% 가 넘는 경우엔 100% 라고 표기해주기 위해 조건문으로 조정해주었네요.
아하! 이로써 모든 수수께끼가 풀렸습니다. 보팅 파워는 최대 10,000까지 충전되는게 맞습니다. 그러나 우리가 API로 불러온 보팅 파워에 대한 기록은 우리가 보팅을 했을 때의 기준으로 저장되어있는거군요. 우리는 보팅할 때, (풀보팅 기준) 현재 가지고 있는 보팅 파워의 2%를 사용합니다. 그래서 보팅 파워가 100%(10,000)일 때, 보팅을 하는 순간 2%(200)가 소모되면서 98%(9,800)의 값이 보였던 것이군요.
정리해서, 현재 보팅 파워를 구하는 코드는 아래와 같습니다.
코드
from steem import Steem
from dateutil.parser import parse
from datetime import datetime
def get_voting_power(account_data):
last_vote_time = parse(account_datat["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff_in_seconds * 10000 / 86400 / 5
total_vp = (account_data["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
s = Steem()
account = s.get_account('maanya')
print(get_voting_power(account))
결과
74.86
[ 챗봇에 보팅 파워 99.5% 알림 기능을 추가 ]
- 챗봇 만드는 방법은 30분 만에 텔레그램 봇 만들기를 참조해주세요.
현재 보팅 파워를 확인하는 기능을 알아봤으니 챗봇에 기능으로 넣어볼까요? 제 챗봇인 치이에게 틈틈히 제 보팅 파워를 확인하고 보팅 파워가 99.5%를 넘으면 메세지로 알려주는 기능을 추가해보겠습니다.
'틈틈히 보팅 파워를 확인' 하는 기능은 python의 timer를 이용하여 구현해야 합니다. 1초에 보팅파워가 0.23 정도 충전되니, 보팅 파워 1% 충전은 약 430초가 필요합니다. 확인하는 시간과 보팅 파워는 취향에 따라 설정해주세요. 관찰하실 부분은 다음과 같습니다.
- import threading (타이머 사용을 위한 import)
- alarm_vp 함수는 maanya 계정의 보팅 파워를 확인하고 99.5% 이상이면 알려주기 위한 콜백함수입니다. 실행 중인 파이썬 프로그램에 독자적으로 실행되는 것이니 add_handler를 통해 챗봇에 등록해줄 필요가 없습니다.
- 타이머는 threading.timer(지연 시간, 콜백 함수) 로 정의됩니다. 코드에선 600초 후에 alarm_vp 함수를 실행하게 되어있습니다.
- chii.start() 이후에는 코드가 진행되지 않으니 기능을 추가하시려면 그 위에다 작성하셔야합니다.
chatbot.py
import sys
import ChatBotModel
import threading
from steem import Steem
from dateutil.parser import parse
from datetime import datetime
def proc_stop(bot, update):
chii.sendMessage('치이 봇이 잠듭니다.')
chii.stop()
def get_voting_power(account_data):
last_vote_time = parse(account_data\["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff\_in_seconds * 10000 / 86400 / 5
total_vp = (account_data\["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
def alarm_vp():
s = Steem()
account = s.get_account('maanya')
vp = get\_voting\_power(account)
if vp > 99.5:
chii.sendMessage('고슈진사마, 보팅 파워가 %.2f 에요.' % vp)
threading.Timer(5, alarm_vp).start()
threading.Timer(5, alarm_vp).start()
chii = ChatBotModel.BotChii()
chii.add_handler('stop', proc_stop)
chii.start()
[ 완성! ]
이렇게 하여 [코딩몰라여] 의 첫 편! steem-python의 시작과 나의 보팅 파워를 챗봇으로 알려주는 프로그램을 만들어봤습니다. 비전공자라도 따라해볼 수 있도록 안내해드릴테니 겁내지 말고 해보시길 바랍니다. 관련 질문은 언제든 댓글로 달아주세요. :D steem-python으로 이런 것도 가능해요? 하는 궁금증 같은걸 댓글로 남겨주시면 제 능력이 되는한 다뤄보도록 하겠습니다. ^^7
사람이 가장 늙어보인다는 수요일 저녁이네요. 주말까지 이틀 남았으니 모두 힘내시길 바라요 :D
마아냐(@maanya) 였습니다.
아.......................................
코..코딩;;;
저도 대문사진에 키위 맛이나요.. 어?
히야님 뵐 때 마다 포도맛 마이쮸 생각납니다. 우물우물... 어지러우시면 코딩 같은거 쳐다도 보지 마시고 도망가세요...! 제가 다루지만 정신건강엔 안좋습니다.
포도맛 마이쭈?????? ㅋㅋㅋㅋㅋ
아~ 프사가 분홍색이라 그런가봐요 ㅋㅋㅋ
근데 마야나님도 프사처럼 참 소녀소녀해요 ㅋㅋ
파이썬을 주력으로 사용하는데, 앞으로 기대하겠습니다^^
어서오세요 :D 감사합니다~
님... 포스팅에 욕을 잔득 써놓고 뭐하시는..
그냥 봇을 만들어주시오~ ㅋㅋㅋ
족장님.. 욕이라니 무슨 말씀이십니까.. ㅋㅋㅋㅋ 유언비어 안됩니다! 그리고 복사해서 붙여넣으면 그게 봇입니다 ㅎㅎㅎ 다 만든건데요!
어디다가 붙여넣어요? 장롱에??
좀... 구라를 어디서 쳐요 ㅋㅋㅋ
그냥 좀 만들어줘봐요~ 좀 쓰게~
ㅋㅋ고슈진사마ㅋㅋㅋ
파이썬 글은 언제나 환영합니다 :) 처음 설치할 때 노드나 환경변수 등 고칠게 많아서 한참 헤맸었는데, 결국 conda-forge로 하니 에러 없이 잘 설치되더라구요. 앞으로도 스팀 관련 파이썬 실험(?)들 많이 기대할게요!
열시미 하겠습니다. 역시 메이드 로봇에게는 주인님이라고 불려야 즐거움이... 크흠
변태채팅봇 귀엽네요.ㅋㅋㅋㅋㅋㅋㅋ
파이썬 공부하다 관뒀는데 계속해야겠어요.ㅋ
준비 과정도 전부 포스팅 되어있으니 금방 따라하실 수 있습니다 'ㅂ'b
리스팀해서 따라하는중이에요~
오호 세상 신기해요!! 댓글이 오면 댓글 왔다는 알림도 가능한가욧?!
가능합니다. 다뤄볼게요 //ㅅ/
코딩 일자무식인데 함 따라가볼게요. 잘 인도해주실거죠? ;)
물론입니다. 오늘 올린 내용에 필요한 준비 과정도 이미 다 포스팅 되어있습니다! 따라오세요~~ /ㅅ/
네 보다 보니..이전 포스팅..또 이전 포스팅...ㅋ 읽어야 할 게 산더미군요 ㅋ 맨 기초부터 찾아서 차근차근 한걸음씩 따라가보겠습니다!
이 포스트에서 남긴 링크만 보시면 되옵니다. :D
넵!!
스팀잇 참 어렵습니다.
이런거 읽으면 그냥 넘어가는데
관심이 갑니다. 막 컴퓨터에 깔아보고 싶어 집니다.
저 진짜 이런거 까막눈인데
저도 따라만 하묜 되나요?ㅜㅜ
물론입니다.. 따라하시면 다 됩니다..! 이 말을 반복하니 뭔가.. 이상한 종교인이 된 느낌이네요
호오 코딩을 모르신다면서 이미 충분히 코더의
기본이 다 되신거 같습니다! 응원할게요^^
감사합니다 :D 열심히 하겠습니다
이분은 혼.... 혼모노다 ㅎㅎㅎ
드... 들켰군요... 이렇게 된 이상 제 왼손의 암흑을 봉인하겠습니다.