[AD]Travala 암호화폐로 유명호텔 싸게 예약하자

굳헬로의 스팀 프로그램 일기!! 열일곱번째 #17 조합들이 필요한 기능 드디어 완성!! 자동 클레임과 자동 분배 기능!!

in sct •  7 months ago 

steem.jpg

토요일 잘 보내고 계신가요??

전 이제 휴가의 끝을 보내고 있네요.

다행히 주말이라 시골집에 여러 사람들이 놀러와서 아들님과 놀아주는 친구가 생겼기에 전 편하게 휴식을 취하고 있답니다.

휴식이 좋긴 하지만 짬을 내서 프로그램 일기 남겨 봅니다.


오늘은 이제까지 공부한 것들을 활용해 스팀코인판 조합 계정의 자동 클레임과 자동 분배 기능을 만들어 보았습니다.

프로그램이 동작하는 방식은 다음과 같습니다.

  1. 계정명과 토큰을 입력하고 주기적으로 토큰을 클레임

  2. 계정에 일정량 이상의 잔고가 쌓이면 토큰 분배 시작

  3. 토큰 분배는 임대내역이 저장된 데이터베이스로부터 지분율을 계산하여 각 계정으로 토큰 전송

그럼 코드를 살펴보도록 하겠습니다.

def run() :
    while True:
        username = "team1p"
        tokenname = "SCT"
        
        print(time.strftime('%Y-%m-%d %HH:%MM:%SS', time.localtime(time.time())))
        print(username + "의 pending token 검사")   
        pending_token = get_pending_token(username, tokenname)

먼저 주기적으로 토큰을 클레임 하기 위해 run() 함수를 가동시키고 계정명을 username에, 토큰명은 tokenname에 입력한 후 클레임 가능한 토큰이 있는지 검사하기 위하여 get_pending_token() 함수를 호출합니다.

def get_pending_token(username, tokenname):    
    url = "http://scot-api.steem-engine.com/@" + username
    r = requests.get(url)
    result = r.json()
    pending_token = result[tokenname]['pending_token']
    if tokenname == "SCT" :
        pending_token = pending_token / 1000

    return pending_token

get_pending_token() 함수를 이용해 클레임 가능한 토큰의 수량을 확인한 후 필요시 claim_token() 함수를 호출하여 토큰 클레임을 실시합니다.

def claim_token(username, pwd, tokenname, pending_token) :
    nodes = NodeList()
    nodes.update_nodes()
    stm = Steem(nodes.get_nodes())    
    
    try:
        stm.unlock(pwd)
    except:
        stm = Steem(node=nodes.get_nodes(), keys=[pwd])        
    json_data = []
    json_data.append({"symbol": tokenname})
    stm.custom_json("scot_claim_token", json_data, required_posting_auths=[username])
    print("%s has been claimed" % (json_data[0]['symbol']), pending_token)

그렇게 claim_token() 함수가 주기적으로 실행됨으로써, 토큰의 잔고가 계속 쌓이게 됩니다.

얼마나 자주 클레임을 실시하는지는 개인의 취양에 맞도록 하면 되겠습니다.

그리고 토큰의 잔고가 어느정도 쌓이거나, 특정한 시간대 토큰을 분배하는 함수를 호출하면 되겠습니다.

저는 우선 제가 속한 원피스 조합의 토큰 분배하는 함수 team1p_delegate_view()를 만들어 보았습니다.

def team1p_delegate_view(username, tokenname, balance) :
    balance = 300
    host = "localhost"
    user = "root"
    passwd = "passwd"
    db_name = "db_name"

    db = pymysql.connect(host=host, port=3306, user=user, passwd=passwd, db=db_name, charset='utf8')

    delegate_sum = 0

    dict = {}

    try:
        cursor = db.cursor(pymysql.cursors.DictCursor)
        sql = "SELECT * FROM delegate WHERE to_ ='" + username + "' && symbol ='" + tokenname + "'"
        cursor.execute(sql)
        result = cursor.fetchall()
        for row_data in result:
            delegate_sum = delegate_sum + row_data['quantity']
            sender = row_data['sender']
            if sender == "lovelyyeon.sct" or sender == "lovelyyeon.cur" :
                    sender = "lovelyyeon"
            elif sender == "sonki999.sct" :
                sender = "sonki999"
            elif sender == "proof-of-work" :
                sender = "ukk"
            elif sender == "jayplay.cur" :
                sender = "jayplayco"
            elif sender == "photoholic" :
                sender = "oldstone"

            if sender in dict :
                dict[sender] = float(dict[sender]) + float(row_data['quantity'])
            else :
                dict[sender] = float(row_data['quantity'])
    finally:
        db.close()
    print("임대 총합 : ", delegate_sum)

    print("분배금 : ", balance)

    dsum = 0
    divide_sum = 0
    for s in dict :
        dsum = dsum + dict[s]
        ratio = round((float(dict[s]) / (delegate_sum) * 100),2)
        divide = float(balance) / 100 * ratio

        #print(s + " : " + str(dict[s]) + " 지분율 : %.2f %%" % (int(dict[s]) / (delegate_sum) * 100) )
        print(s + " : " + str(dict[s]) + " 지분율 :  ", ratio, "분배량 : ", round(divide,2) )
        print(s + " : " + str(dict[s]) + " 지분율 :  ", ratio, "분배량 : ", int(divide) )
        divide_sum = divide_sum + int(divide)
      
        sender = username
        active_key = "active_key"
        receiver = s
        amount = int(divide)
        token = tokenname
        getday = time.strftime('%Y-%m-%d', time.localtime(time.time()))
        token_memo = getday + " 분배금 : " + str(int(divide))
        token_transfer(sender, active_key, receiver, amount, token, token_memo)
    
    print("분배 후 남은 분배금 to team2p", balance - divide_sum)

    print("임대 총합 : ", dsum)

원피스 조합원의 임대 수량을 데이터베이스로부터 가져와서 지분율을 구하고, 이를 바탕으로 토큰을 전송하는 token_transfer() 함수를 호출하여 토큰을 전송하게 됩니다.

def token_transfer(sender, active_key, receiver, amount, token, token_memo):
    stm = Steem(keys=[active_key])
    wallet = Wallet(sender, steem_instance=stm)    
    print(token_momo)
    wallet.transfer(receiver,amount,token, memo=token_memo)

token_transfer() 함수에서는 스팀엔진의 wallet를 이용하여 토큰을 전송하게 됩니다.

아직 프로그램 개발 초보이다 보니 코드들이 어설프지만, 현재 제가 만든 프로그램 각 기능들이 잘 동작하는지는 테스트를 통해 확인을 하였고, 그런대로 잘 돌아가는 것 같네요.

하지만 앞으로 예상치 못한 오류가 발생할지 모르니, 추가로 테스트를 해보며 더욱 가다듬어야 할 것 같습니다.

그리고 위의 소스를 바탕으로 유니온 조합이나 나하풀 조합 그리고 앞으로 등장할 새로운 조합들도 조금의 코드 수정을 통해, 자동으로 클레임하고 자동으로 분배가 이루어지도록 활용할 수 있을거라 생각합니다.

다만 코드를 직접 돌리기 어려운 경우저에게 포스팅키와 액티브 키를 알려주시면 제가 돌려드릴순 있지만, 아무래도 키 때문에 조합장분들의 선택이 필요할거라 생각됩니다.

그럼 저는 이만 오늘의 일기를 마치고 다시 휴식의 시간으로 돌아가 보겠습니다.

그리고 다음에는 또 재미난 기능을 공부해서 찾아오겠습니다.

그럼 행복한 주말 보내시길 바래요~


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

#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 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제

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

#7 굳헬로의 스팀 프로그램 일기!! 일곱번째 #7 프로그램 일기도 어느덧 1주일!! 드디어 첫 실전!! 무한 반복 작업 수행하기!! 이제 직접 클레임 하는 손맛은 잊자. 무한 반복 자동 클레임!!

#8 굳헬로의 스팀 프로그램 일기!! 여덟번째 #8 텔레그램 봇을 이용해 알림을 받아보자!! && 무한 반복 자동 클레임의 정보를 텔레그램으로 받아보기!!

#9 굳헬로의 스팀 프로그램 일기!! 아홉번째 #9 무한 반복 자동 클레임 업그레이드!! && 토큰 잔고 확인 && 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보기!!

#10 굳헬로의 스팀 프로그램 일기!! 열번째 #10 토큰 전송내역을 검사하고, 토큰을 전송 받으면 텔레그램으로 알림을 받아보기!!

#11 굳헬로의 스팀 프로그램 일기!! 열한번째 #11 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (1/2)

#12 굳헬로의 스팀 프로그램 일기!! 열두번째 #12 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (2/2) 스팀엔진 토큰 임대내역 추적 완료!!

#13 굳헬로의 스팀 프로그램 일기!! 열세번째 #13 웹 프로그래밍의 시작!! 파이썬을 이용하여 정보를 MySQL 데이터 베이스에 저장해보기!!

#14 굳헬로의 스팀 프로그램 일기!! 열네번째 #14 파이썬을 이용하여 데이터베이스로부터 정보를 가져오기 && 스팀코인판 3대풀 임대내역 데이터베이스 작업 완료!!

#15 굳헬로의 스팀 프로그램 일기!! 열다섯번째 #15 웹 프로그래밍을 이용하여 스팀코인판 3대조합의 임대 내역을 웹으로 확인해보자 !!

#16 굳헬로의 스팀 프로그램 일기!! 열여섯번째 #16 스팀엔진 최신 블록을 검사하여 필요한 정보를 데이터베이스에 저장하기!! 3대 조합의 임대내역을 최신으로 저장하기!!

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 4.015 which ranks you at #3887 across all Steem accounts.
Your rank has improved 341 places in the last three days (old rank 4228).

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

Evaluation of your UA score:
  • Some people are already following you, keep going!
  • Try to show your post to more followers, for example via networking on our discord!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server