굳헬로의 스팀 프로그램 일기!! 여섯번째 #6 파이썬으로 스팀엔진 토큰들을 클레임 해보자.

in sct •  last year 

steem.jpg

안녕하세요. 굳헬로 @goodhello 입니다.

아침부터 푹푹 찌는 무더운 날씨입니다.

그래도 힘내서 오늘 하루도 파이팅 해봅시다.


어제는 스팀엔진 마켓 거래 내역을 열람하는 예제를 살펴 보았습니다.

예제가 너무 잘 되어 있어 제 실력이 많이 향상된 것 같네요.

오늘은 @holger80 님께서 최근에 올려주신 파이썬으로 스팀엔진 토큰들을 클레임하는 에제를 살펴보도록 하겠습니다.

How to claim all pending token rewards at once - improved claim command

먼저 전체 소스를 대략 살펴보고 주요 기능등을 공부해 보도록 하겠습니다.

from beem import Steem
from beem.nodelist import NodeList
import json
import six
import requests
import getpass

if __name__ == "__main__":

    
    if six.PY2:
        username = raw_input("Username: ")
    else:
        username = input("Username: ")

    url = "http://scot-api.steem-engine.com/@" + username
    r = requests.get(url)
    result = r.json()
    
    json_data = []
    for token in result:
        scot = result[token]
        if int(scot["pending_token"]) > 0:
            json_data.append({"symbol": token})
            print("%s can be claimed" % (token))
    
    if len(json_data) > 0:
        nodes = NodeList()
        nodes.update_nodes()
        stm = Steem(nodes.get_nodes())    
        pwd = getpass.getpass("Enter Walletpassword or posting key for %s" % username) 
        
        try:
            stm.unlock(pwd)
        except:
            stm = Steem(node=nodes.get_nodes(), keys=[pwd])        
        stm.custom_json("scot_claim_token", json_data, required_posting_auths=[username])
    else:
        print("Nothing to claim")

코드를 실행하고 사용자가 유저명을 입력하면 입력된 유저명을 이용하여 scot-api.steem-engine.com에서 pending_token 정보를 가지고 와서 출력해주고, 포스팅 키를 입력하면 모든 토큰을 클레임 해주는 코드로군요.

그러면 이 코드가 어떻게 동작되는지 주요한 부분을 살펴보도록 하겠습니다.

    if six.PY2:
        username = raw_input("Username: ")
    else:
        username = input("Username: ")

six.PY2 는 설치되어 있는 파이썬의 버전에 따라 명령어가 다른것들이 있는데, 버전에 맞는 코드를 실행하기 위해 if 조건문으로 검사를 하고 input() 명령어를 수행하여 사용자의 키보드 입력 값을 받아 들이는 구문입니다.

코드가 실행되면 이렇게 사용자의 입력을 기다리며

값을 입력하고 엔터를 치면 username 변수에 사용자가 입력한 값이 저장되게 됩니다.

사용자에게 값을 입력받기 위한 input() 명령어 앞으로 자주 사용하게 될 것 같군요.

    url = "http://scot-api.steem-engine.com/@" + username
    r = requests.get(url)
    result = r.json()

제가 요즘 주의깊게 보고 있는 코드입니다.

scot-api.steem-engine에 입력된 사용자명을 붙여 http://scot-api.steem-engine.com/@goodhello url을 완성하고 이 url에 있는 정보를 json 형식으로 result에 저장해 줍니다.

http://scot-api.steem-engine.com/@goodhello

위의 url에 접속하면

복잡한 정보들이 출력되고 있네요.

   url = "http://scot-api.steem-engine.com/@goodhello"
    r = requests.get(url)
    result = r.json()
    
    print(json.dumps(result, sort_keys=True, indent=2, separators=(',', ': '),ensure_ascii = False))            

이 정보들을 앞전에 배웠던 json.dumps()로 정리해서 출력해보도록 하겠습니다.

{
  "AAA": {
    "downvote_weight_multiplier": 1.0,
    "downvoting_power": 10000,
    "earned_token": 41473160,
    "last_downvote_time": "2019-01-01T00:00:00",
    "last_post": "Sun, 07 Jul 2019 13:19:24 GMT",
    "last_root_post": "Fri, 12 Jul 2019 03:26:36 GMT",
    "last_vote_time": "2019-07-22T12:55:03",
    "last_won_mining_claim": "Tue, 01 Jan 2019 00:00:00 GMT",
    "last_won_staking_claim": "Tue, 01 Jan 2019 00:00:00 GMT",
    "loki": null,
    "muted": false,
    "name": "goodhello",
    "pending_token": 10,
    "staked_mining_power": 0.0,
    "staked_tokens": 100000,
    "symbol": "AAA",
    "vote_weight_multiplier": 1.0,
    "voting_power": 9800
  },

너무 길어서

...

중략

  "SCT": {
    "downvote_weight_multiplier": 1.0,
    "downvoting_power": 10000,
    "earned_token": 5058340,
    "last_downvote_time": "2019-01-01T00:00:00",
    "last_post": "Tue, 23 Jul 2019 00:16:06 GMT",
    "last_root_post": "Sun, 21 Jul 2019 05:16:42 GMT",
    "last_vote_time": "2019-07-23T00:07:51",
    "last_won_mining_claim": "Sun, 23 Jun 2019 05:05:27 GMT",
    "last_won_staking_claim": "Tue, 01 Jan 2019 00:00:00 GMT",
    "loki": null,
    "muted": false,
    "name": "goodhello",
    "pending_token": 1410,
    "staked_mining_power": 0.0,
    "staked_tokens": 742454,
    "symbol": "SCT",
    "vote_weight_multiplier": 1.0,
    "voting_power": 4210
  },
  "ZZAN": {
    "downvote_weight_multiplier": 1.0,
    "downvoting_power": 10000,
    "earned_token": 12802687,
    "last_downvote_time": "2019-01-01T00:00:00",
    "last_post": "Tue, 23 Jul 2019 00:15:09 GMT",
    "last_root_post": "Sun, 21 Jul 2019 05:16:42 GMT",
    "last_vote_time": "2019-01-01T00:00:00",
    "last_won_mining_claim": "Tue, 01 Jan 2019 00:00:00 GMT",
    "last_won_staking_claim": "Tue, 01 Jan 2019 00:00:00 GMT",
    "loki": null,
    "muted": false,
    "name": "goodhello",
    "pending_token": 0,
    "staked_mining_power": 0.0,
    "staked_tokens": 0,
    "symbol": "ZZAN",
    "vote_weight_multiplier": 1.0,
    "voting_power": 10000
  }
}

저 goodhello의 스팀엔진 토큰들의 정보들이 다 출력이 되고 있네요.

이중에서 스팀코인판 토큰인 SCT로 몇가지 정보를 살펴보겠습니다.

"SCT": {
    "name": "goodhello",
    "pending_token": 1410,
    "staked_tokens": 742454,
    "symbol": "SCT",
    "voting_power": 4210
  },

pending_token 토큰이 1410이라고 나오는데

스팀엔진 토큰 리워드에 들어가보면, 1.41SCT가 클레임 대기중이로군요.

소수점 셋째자리부터 1로 계산하여 보여주는가 봅니다.

스테이크된 토큰 갯수도 나오고, 보팅파워(?)까지 확인 가능합니다.

이 코드를 이용하면, 각 SCOT 별 보팅파워를 확인가능하겠군요.

하지만 오늘 예제는 토큰 클레임 예제입니다.

이제 클레임 가능한 토큰이 있는지 살펴봐야죠.

    json_data = []
    for token in result:
        scot = result[token]
        if int(scot["pending_token"]) > 0:
            json_data.append({"symbol": token})
            print("%s can be claimed" % (token))

클레임 가능한 토큰은 scot["pending_token"] 값이 0 이상인지 검사하여 찾아낼 수 있습니다.

그리고 클레임 가능한 토큰을 json_data에 추가를 시켜줍니다.

이 부분이 실행되면 위와 같이 클레임 가능한 토큰들의 이름들이 출력됩니다.

뭔가 살짝 아쉬워서

출력하는 부분에

print("%s can be claimed" % (token), scot["pending_token"])

클레임 가능한 수량까지 넣어보았습니다.

스팀엔진에 토큰 리워드 내역과 비교해보니 AAA는 1/10000, ENG는 1/100000000 이런식으로 보여지는군요. 각 토큰별로 수치가 많이 다르네요.

    if len(json_data) > 0:
        nodes = NodeList()
        nodes.update_nodes()
        stm = Steem(nodes.get_nodes())    
        pwd = getpass.getpass("Enter Walletpassword or posting key for %s" % username) 
        
        try:
            stm.unlock(pwd)
        except:
            stm = Steem(node=nodes.get_nodes(), keys=[pwd])        
        stm.custom_json("scot_claim_token", json_data, required_posting_auths=[username])
    else:
        print("Nothing to claim")

이제 pending_token을 클레임 하는 코드입니다.

getpass를 이용해 입력값을 감춘 상태로 포스팅 키를 입력 받고

scot_claim_token, 클레임 가능한 토큰 리스트가 들어 있는 json_data, 포스팅 키로 인증을 받기 위한required_posting_auths=[username] 를 이용해 custom_json 으로 만들어 스팀 노드에 전송합니다.

https://steemd.com/@goodhello 에 접속하면 방금 만든 custom_json이 스팀 블록체인에 기록됩니다.

그 결과 모든 토큰이 클레임 되었습니다.

깔끔하네요.

만약 클레임할 토큰이 없다면

Nothing to claim이 출력되게 됩니다.


오늘은 스팀엔진 토큰들을 클레임하는 에제를 살펴 보았는데요.

이 코드를 주기적으로, 예를 들어 1시간에 1번씩 하루에 1번씩 등 실행 시키게 되면 일일이 스팀엔진에 접속하여 토큰 리워드들을 수작업으로 클레임 할 필요가 없게 될 것입니다.

파이썬에서는 threadingTimer 를 이용하여 주기적으로 코드를 실행할 수 있습니다.

이를 이용하면 주기적으로 원하는 시간에 토큰을 자동으로 클레임 시킬수 있게 되겠네요.

그리고 여기에 토큰을 자동으로 분배 해주는 코드를 삽입한다면, 조합에서 수작업으로 토큰을 배분하는 일을 자동으로 처리해 줄 수 있게 될 것입니다.

또 여기다 이러한 작업들이 수행되는것을 텔레그램 알림으로 받을수 있게 하는것도 제 목표 중 하나입니다.

앞으로 이 작업을 완료하는데 목표를 두고 새로운 예제를 살펴보도록 하겠습니다.

혹시 궁금한점이나 요청사항등이 있으시면 언제라도 댓글 부탁드립니다.

그럼 다음 시간에는 또 재미난 예제로 찾아뵙겠습니다.

오늘 하루도 행복하세요.


굳헬로의 스팀 프로그램 일기!! 시리즈

#1 굳헬로의 스팀 프로그램 일기!! 대망의 시작 #1 Python 프로그램 설치 && steemengine 파이썬 api 설치 && 간단한 steemengine 예제

#2 굳헬로의 스팀 프로그램 일기!! 그 두번째 #2 비주얼 스튜디오 코드 프로그램 설치 && 비주얼 스튜디오 코드를 사용하여 파이썬 다루기 && 간단한 steemengine 예제

#3 굳헬로의 스팀 프로그램 일기!! 세번째 #3 스팀엔진 토큰의 정보를 가져오는 findOne() && 누군가의 토큰 사용 내역을 가져오는 get_history() && JSON 데이터 출력

#4 굳헬로의 스팀 프로그램 일기!! 네번째 #4 steemengine Token 클래스 && Token.get_holder() && Token.get_market_info() && Token.get_buy_book() && Token.get_sell_book()

#5 굳헬로의 스팀 프로그램 일기!! 다섯번째 #5 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.

Hi @goodhello!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 3.940 which ranks you at #4278 across all Steem accounts.
Your rank has improved 9 places in the last three days (old rank 4287).

In our last Algorithmic Curation Round, consisting of 132 contributions, your post is ranked at #66.

Evaluation of your UA score:
  • You're on the right track, try to gather more followers.
  • The readers like your work!
  • Good user engagement!

Feel free to join our @steem-ua Discord server

서버는 계속 켜있어야하는거죠 ?
저도 해보고 싶네요 좀더 주의깊게 보고 해봐야겠어요
부럽부럽

서버 운영하려면 항상 켜둬야 하죠.

그냥 공부 삼아 하시는 거라면 개인 컴퓨터에서 조금씩 해보시면 됩니다.

요즘 아이들도 코딩이 필수 교과과정이 될만큼 좋은 요소가 많으니 조금씩 배워가시면 좋을 것 같아요.

요즘 아무리봐도 낯설어요~ 뽀로로 음주일기와 번갈아가면서 하셔도 괜츈할듯요! ㅋㅋ 원클릭에 클레임+보팅+자동분배까지 다되는 그날이 오면 너무 좋을것 같아요~