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

in #sct5 years ago

steem.jpg

일요일 잘 보내고 계시나요??

저는 아침 일찍 공차러 다녀와서, 이제 여름 휴가를 가려고 준비하고 있는데요.

그전에 잠시 짬을 내서 오늘의 프로그램 일기를 남겨보겠습니다.


스팀엔진 토큰들 임대 많이들 하시고 계시죠.

그런데 스팀엔진 토큰은 임대를 보내고 어디로 얼마를 보냈는지 어디 적어두거나 직접 기억하고 있지 않으면, 어디로 얼마를 보냈는지 확인하기가 쉽지 않더라구요.

특히나 SCT, AAA, SCTM 등 임대를 보냈다 다시 돌려 받았다 하다보면 정말 정신이 없고, 임대 받는 측에서도 많은 혼란이 있을거라 생각합니다.

그래서 임대 현황을 뽑아보려고 이리 저리 뛰어 다녀 보았습니다.

우선 스팀엔진 api에서는 임대나간 수량 혹은 임대 받은 수량 총합만 나오고 누구에게 얼마 임대했는지 자세한 사항을 알아보는 기능을 제공하고 있지 않은것 같습니다. (제가 못찾는건지.. 방법을 모르는건지...)

그래서 직접 한번 만들어 보려고 도전을 해보았습니다.

며칠전 공부했던 steemengine.api.get_history() 에서 내역을 다 보여주면 정말 쉽게 만들 수 있을 것 같은데...

import json
from steemengine.api import Api
api = Api()
print(json.dumps(api.get_history("goodhello", "SCT"), sort_keys=True, indent=2, separators=(',', ': ')))

그래서 먼저 저의 SCT 내역을 한번 살펴 보았습니다.

아쉽게도 이 결과는 스팀엔진에서 보여주는 토큰 내역과 같기에... 토큰을 전송한 기록만 남아 있고, 임대를 주거나 받은 내역은 나오지 않더라구요.

그래서 며칠전 공부했던 스팀엔진 블록을 뒤져서 원하는 정보를 찾는 steemengine.api.get_block_info()를 이용해 보기로 하였습니다.

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

이글에서 사용했던 예제를 뜯어 고쳐 특정 사용자의 임대 내역을 다 가져와 보기로 했습니다.

    api = Api()
    start = time.time()

    username = "team1p"
    scot = "SCT"
    wallet = Wallet(username)
    data = wallet.get_token(scot)

    print("임대 받은 SCT : " + data["delegationsIn"])
    print("임대 나간 SCT : " + data["delegationsOut"])

특정 사용자는 제가 속한 원피스 조합의 team1p 계정으로 정했고 SCT 임대 값은 steemengine.wallet을 사용하여 확인할 수가 있더라구요.

username에 확인하고 싶은 아이디를 넣고 scot에 알고 싶은 토큰명을 넣으면 그 아이디의 임대 정보를 확인할 수 있습니다.

이제 모든 블록을 뒤져서 username team1p에 해당하는 SCT의 정보를 다 뒤져보겠습니다.

    latest_block = api.get_latest_block_info()
    scan_token = ['SCT']
    print("Scanning all blocks from 0 to %d..." % latest_block['blockNumber'])
    steemp_payments = []

    #for block_num in range(latest_block['blockNumber']):
    for block_num in range(latest_block['blockNumber'], 1, -1):
        block = api.get_block_info(block_num)
        if block_num % 200 == 0:
            print("진행시간 : " + str(time.time() - start) + " 블록 넘버 : " + str(block["blockNumber"]) + " 진행률 : %.2f %%" % (100 - block["blockNumber"]/latest_block['blockNumber'] * 100))
        for trx in block["transactions"]:
            
            if trx["contract"] not in ['tokens']:
                continue
            if trx["action"] not in ['delegate']:
                continue
            payload = json.loads(trx["payload"])
            to = payload["to"]
            if to == "team1p" :
                symbol = payload["symbol"]
                if symbol == "SCT" :
                    sender = trx["sender"]                
                    contract = trx["contract"]
                    action = trx["action"]
                    quantity = payload["quantity"]
                    print(sender + "님이 " + to +"님에게 " + symbol + "토큰을 " + quantity + " 임대하였습니다.")

latest_block = api.get_latest_block_info() 최신의 블록정보를 가지고 와서

for block_num in range(latest_block['blockNumber'], 1, -1): 최신 블록부터 하나씩 예전블록들을 for을 통해 반복문을 돌렸습니다.

            if trx["contract"] not in ['tokens']:
                continue
            if trx["action"] not in ['delegate']:
                continue

가져온 블록정보가 "contract"는 tokens 이 아니면 찾는 정보가 아니기에 패스
그리고 "action" 이 delegate 가 아니면 패스

이렇게 임대 정보만을 찾도록 if 조건문을 걸었습니다.

그리고 원하는 정보를 찾으면 출력을 시켜주는데...

아니.. 이 무슨... 0.1% 수행하는데 약 4분이 넘게 걸리더군요...

한 30분 켜뒀다가... 이건 아닌 것 같아서... 일단 멈추었습니다.

코드를 제대로 짜지 않은 상태로 돌리면 다시 수정하고 돌려야 하는데...

아마도 100% 완료하려면 4000분 이상 며칠이 걸리겠더라구요.. ㅠㅠ

그래서 정말 이건 보류해두고 다른 방법을 찾기로 했습니다.

검색에 검색을 반복하던중 흥미로운 정보를 발견하였습니다.

Steem Engine Block Explorer 라고 스팀엔진 블록 정보를 보여주는 사이트가 있더라구요.

https://steem-engine.rocks/

그리고 https://steem-engine.rocks/@goodhello 주소뒤에 계정명을 넣으면

해당 계정의 스팀엔진 블록 내역을 친절하게 보여줍니다.

거기서

delegate를 발견!!!!

이 사이트의 정보를 분석하면 임대 내역을 뽑아낼수 있겠더라구요.

사실 어제 저녁 포기하고 술한잔 마시고 있었는데, Steem Engine Block Explorer를 발견하는 바람에 다시 작업에 착수해 보았습니다.

하지만 이 사이트는 따로 api가 제공되는건 아직 찾지 못해서, 그냥 사이트를 통째로 긁어보기로 했답니다.

그리고 파이썬에서는 사이트를 긁는 기능을 잘 제공하고 있더라구요.

그래서 사이트를 분석하여 원하는 정보를 뽑아보았습니다.

여기에 가장 큰 도움을 준 것은 Beautiful Soup 라는 파이썬 패키지입니다.

커맨드 창에서

pip intall beautifulsoup4

명령을 실행하면 자동으로 설치되는데, 정말 유용한 패키지더라구요.

꼭 설치하시기 바랍니다.

자 그럼 BeautifulSoup를 이용해서 코드를 짜보겠습니다.

이번에도 모델은 team1p로 선정하였습니다.

https://steem-engine.rocks/@team1p

이 사이트를 정보를 긁어보도록 하겠습니다.

import json
import requests
from bs4 import BeautifulSoup

username = "team1p"

url = "https://steem-engine.rocks/@" + username
r = requests.get(url) 
soup = BeautifulSoup(r.text, 'html.parser')    

print(soup)

그리고 실행시키면

이 페이지의 소스코드를 다 긁어 옵니다.

이제 BeautifulSoup를 이용하여 원하는 정보를 빼보도록 하겠습니다.

먼저 원하는 정보를 빼기 위해 Steem Engine Block Explorer 사이트에서 F12 눌러 개발자 모드를 엽니다.

그리고 Elements 부분을 찾아보면

이렇게 원하는 부분을 찾을수 있답니다.

<div class="row">...</div> 가 무수히 반복되죠

우리가 원하는 정보들이 주르륵 리스트로 주르륵 반복되고 있습니다.

하지만 정말 필요한 정보만을 가져오기 위해 더 깊게 들어가보도록 하겠습니다.

<span class="action">...</span> 안에 저에게 필요한 정보가 다 들어 있네요.

for action in soup.select("span[class='action']") :
    print(action.text)

위에선 만든 soup = BeautifulSoup(r.text, 'html.parser')를 for 문으로 반복하면서 span[class='action']를 찾아서 출력하는 코드입니다.

와우~ 멋지게 출력이 되었습니다.

이제 이 부분을 입맛에 맞게 요리하면 원하는 정보를 다 빼낼수 있겠군요.

이제 무엇이든 할 수 있는 무기를 얻은 것 같습니다.

이제 거의 80% 목표 달성한 것 같네요.

그런데 오늘의 일기는 여기서 마무리 하기로 하고, 이 정보를 가공하여 필요한 임대 정보만을 빼와서 누가 누구에게 얼마만큼 임대했는지 확인하는 코드는 내일 다시 설명하도록 하겠습니다.

내일 멋진 결과물을 보여드릴테니, 기대해 주시기 바랍니다.


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

#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 토큰 전송내역을 검사하고, 토큰을 전송 받으면 텔레그램으로 알림을 받아보기!!

Sort:  

gfriend96님이 goodhello님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
gfriend96님의 [Steemmonsters] Tounament STEEM prize Rank - 2019.07.29 09:00 KST(GMT+9)

...le="text-align:right">178 goodhello/td> 21 <td style="text-al...

멋집니다. 임대 정보를 볼수 있는 api도 앱도 없군요. 불편하네요.

그래서 제가 한번....도전중입니다...

저도 한번 도전해보겠습니다. 누구한테 임대줬는지 모르니 불편하네요.

알고싶었던 기능인데 자세하게 알려주셨군요. Beautifulsoup 재미있네요.

Posted using Partiko Android

Beautifulsoup 완전 사랑합니다~

4분 0.1%에 껄껄껄 웃었네요. 데이터가 무쟈게 엄청났나봅니다. ㄷㄷ

ㅎㅎㅎ 100% 채우려 했는데... 못 참았네요 ㅎㅎ

우선 스팀엔진 api에서는 임대나간 수량 혹은 임대 받은 수량 총합만 나오고 누구에게 얼마 임대했는지 자세한 사항을 알아보는 기능을 제공하고 있지 않은것 같습니다. (제가 못찾는건지.. 방법을 모르는건지...)

진짜 없는 것 같습니다. ㅎㅎㅎ 진짜 데이터양이 많긴 한가보군요.

갈수록 실력이 늘어나고 있는 것이 느껴지네요.

union.sct님이 goodhello님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
union.sct님의 [공지] 스판유니언 조합원 대상 12차 큐레이션 수익배분 완료 안내

...% 6 30 2차 추가 goodhello/td> 1000 1.21% 6 ...

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.950 which ranks you at #4233 across all Steem accounts.
Your rank has improved 14 places in the last three days (old rank 4247).

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

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

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.

naha님이 goodhello님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
naha님의 나풀나풀 나하풀 주간 결산 + 신규 조합원 가입 잠시 중단 + 우대정책 공지

...100
feelsogood.cur 550
fur2002ks 100
garamee21 100
goodhello 3000
hyokhyok 3000
iieeiieeii 400
influencer07 4...

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 64176.22
ETH 2624.19
USDT 1.00
SBD 2.78