1편의 내용이 좀 많았나요? 어려워하시는 분들이 좀 계셨습니다. 파이썬이 안익숙한 것도 한 몫 했겠죠!? 메모장에서 바로 코딩할 수 있으면 좋을텐데... 안타깝게도 간단한 웹 프로그래밍말고는 불가능합니다. 그래도 설정에 관련된건 다 알려드렸으니! 계속 진행해보려고 합니다.
1편에서 다루었던 steem-python을 이용한 기능 개발과 텔레그램 봇에 반영하는 방법을 파악하실 수 있다면 이후에 올릴 모든 기능들을 여러분은 혼자서 봇에 반영하실 수 있습니다. :D
오늘은 쉽게 따라해볼 수 있는 '자동으로 보상 받는 기능'에 대해서 다뤄보겠습니다.
보상(rewards)
스팀잇에선 글 써서 보팅을 받거나 다른 사람들의 포스트에 보팅하면 활동에 따른 보상을 받는건 다들 아시죠? 모르면 큰 일인데..
대부분의 경우엔 확인할 때 마다 바로바로 입금을 하지 않을 이유가 없죠. 스파가 조금이라도 높아야 보팅 가중치가 강해지니까요.
그런데 보상이 바로 지갑에 들어오는게 아니라 여러분들의 지갑을 확인해서 '내 지갑으로 입금하기'를 눌러야 보상이 여러분들의 지갑으로 들어오게 됩니다. 상시 돌아가는 봇이 자동으로 보상을 받아준다면 편하지 않을까요?
▲ 보상을 줍는 플랑크톤
자동으로 보상 받기
steemd.com에선 여러분들의 계정에 대한 다양한 정보를 알 수 있습니다. 그 중에는 아직 받지 않은 보상 정보도 포함되어있습니다. 보상을 받기 위해선 키가 필요합니다. 키가 필요할 땐 우선 포스팅키를 사용하는 습관을 반드시 가집시다.
계정명과 포스팅키를 입력하여 계정 정보를 얻어오는 코드를 작성합니다.
import re
from steem.steem import Steem
acc = '여러분들의 계정명'
pkey = '여러분들의 포스팅 키(5로 시작)'
def claim_rewards():
steem = Steem(keys = pkey)
acc_info = steem.get_account(acc)
Steem 생성자 파라미터에 포스팅 키를 입력하 여, 권한이 부여된 객체를 얻을 수 있습니다. get_account는 계정 정보를 불러옵니다.
rvb = acc_info['reward_vesting_balance'] # Vests
rvs = acc_info['reward_vesting_steem'] # Steem Power
rvd = acc_info['reward_sbd_balance'] # Steem Dollar
위의 코드를 통해 아직 받지 않은 보상에 대한 Vests, SP, SBD의 양을 확인 할 수 있습니다. 이제 보상을 청구해야 하는데 보상이 0일 땐 청구할 필요가 없겠죠? 또한, 보상이 있는 경우엔 항상 Vests 가 0보다 큰 값으로 나타납니다. 따라서 Vests가 0보다 클 때 보상을 청구하면 되는데 문제는...
print(rvb, rvs, rvd)
> 10.210896 VESTS 0.005 STEEM 0.000 SBD
결과 값에 VESTS, STEEM, SBD 표기가 남아있어 rvb, rvs, rvd가 숫자가 아닌 문자열입니다. 그러므로 숫자만 남도록 해야합니다. 단순하게 뒤에서 몇 글자를 자르는 식의 코드를 작성할 수도 있지만 범용성이 높은 코드가 되도록 정규식(Regular Expression)를 사용하도록 하겠습니다. 코드 첫 줄의 import re는 정규식 모듈을 불러온 것입니다. 정규식 모듈에 대한 설명은 여기선 다루지 않을게요.
rvb = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvb)[0]
rvs = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvs)[0]
rvd = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvd)[0]
주어진 문자열에서 소숫값 형태를 가지는 문자열을 찾고, 첫 번째로 탐색된 문자열을 가져오는 정규식입니다.
예를 들어 mb91.232asdf4723.1123 라는 문자열이 있으면 91.232만 가져옵니다.
이제 보상이 존재하는 것으로 확인되면 보상 받기를 대신 눌러주는 코드를 작성합니다.
if float(rvb) > 0:
steem.claim_reward_balance(account = acc)
print('와! %s의 SP와 %s의 SBD의 과자 값이 들어왔어요.' % (rvs, rvd))
claim_reward_balance가 보상 받기 버튼을 눌러주는 코드입니다. 간단하죠?
결과
와! 0.005의 SP와 0.000의 SBD의 과자 값이 들어왔어요.
여러분의 보팅으로 더 큰 과자 값을 받ㅇ... 읍읍
어제 만들었다가 내용이 너무 짧은가... 싶어서 다른걸 만들고 있었는데 짧은 것도 괜찮은 것 같아서 오늘 올리게 되었습니다. 오늘은 간단했죠!? 그쵸!?
코딩몰라여 시리즈가 5번 정도 작성되면 그 기능들을 모아서 여러분들만의 텔레그램 봇을 구글 앱 엔진을 이용해서 상시 돌아갈 수 있게끔 안내를 해드릴 계획이 있고... 제가 작성한 코드를 GitHub를 통해 공유할 수 있도록 준비 중이니 계속해서 코딩몰라여 시리즈를 기대해주셨으면 좋겠습니다. 'ㅂ'b
전체 코드
import re
from steem.steem import Steem
acc = '여러분들의 계정명'
pkey = '여러분들의 포스팅 키(5로 시작)'
def claim_rewards():
steem = Steem(keys = pkey)
acc_info = steem.get_account(acc)
rvb = acc_info['reward_vesting_balance']
rvs = acc_info['reward_vesting_steem']
rvd = acc_info['reward_sbd_balance']
rvb = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvb)[0]
rvs = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvs)[0]
rvd = re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", rvd)[0]
if float(rvb) > 0:
steem.claim_reward_balance(account = acc)
print('와! %s의 SP와 %s의 SBD의 과자 값이 들어왔어요.' % (rvs, rvd))
claim_rewards()