[AD]MCO VISA 암호화폐로 결제하자

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

in sct •  8 months ago 

steem.jpg

저는 오늘부터 여름 휴가가 시작되었답니다.

휴가 첫날부터 날씨가 흐릿흐릿하고 이런 저런 일로 일정에 차질이 생겼네요.

사실 이번 휴가는 시골에 놀러가서 푹 쉬다 올 예정인데, 아직 준비가 덜 된 탓에 내일이나 출발하려고 합니다.

그리고 휴가 가서도 틈틈히 프로그램 일기를 작성하려고 생각중이니, 많은 관심과 사랑 부탁드립니다.


어느덧 저의 프로그램 일기도 10일째가 되었네요.

어제는 토큰의 잔고를 확인하고, 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보는 코드를 짜보았는데요.

오늘은 토큰을 전송 받으면 그 내역을 텔레그램으로 받아볼 수 있는 기능을 코드를 짜보려고 합니다.

토큰을 보내는 것은 제가 직접 토큰을 전송하여 블록체인에 기록하고 그것을 텔레그램으로 전송하는 코드까지 실행하면 되지만, 토큰을 전송 받는것은 언제 일어날지도 모르고, 그 내역이 무엇인지 확인해야 하는 작업이 필요합니다.

그래서 블록을 계속 감시하면서 토큰 전송 내역을 받아오는 코드가 필요하겠네요.

그리고 이전까진 다른 능력자분이 만든 알람 봇을 이용해 보팅, 댓글 알람등을 텔레그램으로 받아 보았는데 이제는 이 기능을 활용하여 앞으로 직접 보팅 알람이나 댓글 알람을 만들어 보고 싶네요.

그럼 토큰 전송 내역을 확인하기 위하여 차근차근 방법을 찾아보도록 하겠습니다.

며칠전 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보는 에제를 알아보았는데요.

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

steemengine.api.get_latest_block_info() 를 이용해서 최근 블럭을 알아내고 steemengine.api.get_block_info() 를 이용하여 블록들을 하나씩 검사해서 원하는 정보를 찾아볼 수 있습니다.

이 방법을 이용해도 되겠지만 이렇게 한다면 필요한 정보를 얻기 위해 모든 블락을 뒤져야 하기에 시간도 오래 걸리고 효율도 많이 떨어지겠지요.

그래서 저는 특정한 사용자의 블록 정보를 가져올 수 있는 기능을 제공하는 steemengine.api.get_history()를 이용해서 코인 전송 내역을 받아보도록 하겠습니다.

이 명령어를 사용하는 예제는

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

steemengine.api.get_history()는 1주일 전에 살펴 보았는데요.

이 기능을 활용하여 토큰 전송 내역을 뽑아보도록 하겠습니다.

from steemengine.api import Api
api = Api()
print(api.get_history("goodhello", "SCT"))

앞전에는 api.get_history("goodhello", "SCT") 이런식으로 goodhello와 SCT를 넣어 저의 SCT 내역만을 가져왔는데요.

이 부분을 api.get_history("goodhello", "")이런식으로 수정을 하면 SCT 뿐만 아니라 모든 토큰의 내역을 가지고 올 수 있더라구요.

import json
from steemengine.api import Api
api = Api()

token_history = api.get_history("goodhello", "")
print(json.dumps(token_history, sort_keys=True, indent=2, separators=(',', ': ')))

앞전의 코드를 수정하고 json.dumps를 이용하여 보기 쉽게 출력이 되도록 바꾸었습니다.

SCT 내역뿐만 아니라 다른 토큰들의 내역도 잘 출력되고 있습니다.

조금전 splinterlands 로부터 123.537개의 DEC가 Daily Earnings - 123.537 DEC. Thank you! 메모를 넣어서 오늘의 배당을 보내왔네요.

그리고 triplea.bot 으로부터 AAA가 302.942개 Daily Earnings - 302.942 AAA. Thank you! 메모를 가지고 배당을 보내왔습니다.

이런한 토큰 전송 정보를 검색하여 새로운 토큰 전송 내역이 있으면 이를 발견하고 정보를 추출하면 될 것 같네요.

제가 생각한것은

  1. 최신의 블록 넘버를 기록 : 이는 이전에 지나간 내역은 알림으로 받을 필요가 없다고 생각하기에, 프로그램이 실행되고 난 뒤의 정보를 찾아내면 될 것 같습니다.
  2. 새로운 내역이 있었을때 이 정보가 어떤 정보인지 검사 : 토큰 전송 내역만 뽑아내면 되기에, 다른 내역은 무시하면 될 것 같습니다.
  3. 토큰 전송 내역 발견 : 텔레그램으로 알림 발송

이렇게 3단계에 걸쳐서 프로그램을 만들어 나가면 될 것 같네요.

먼저 최신의 블록 넘버를 기록 해 보겠습니다.

my_latest_block_num = 0

if __name__ == '__main__':
    token_history = api.get_history("goodhello", "")
    my_latest_block_num = token_history[0]["block"]
    print("my_latest_block_num : ", my_latest_block_num )

my_latest_block_num 변수에 api.get_history("goodhello", "") 를 이용하여 저의 최근 블록 넘버 token_history[0]["block"]를 담았습니다.

이 코드는 if __name__ == '__main__': 안에서 프로그램이 실행될때 한번만 실행됩니다.

이제 새로운 내역이 있는지 검사하는 코드를 만들어 보겠습니다.

60초마다 새로운 내역이 있는지 검사하도록

def run():
    while True:
        print(time.strftime('%Y-%m-%d %HH:%MM:%SS', time.localtime(time.time())))
        token_transfer_find()
        print("무한 반복 작업중...")
        print("my_latest_block_num : ", my_latest_block_num )
        time.sleep(60)

run() 함수를 만들고 60초마다 한번씩 새로운 내역이 있는지 확인하기 위하여 token_transfer_find() 함수를 호출합니다.

def token_transfer_find():    
    token_history = api.get_history("goodhello", "", limit=20)
    global my_latest_block_num
    for token in token_history:    
        if int(token["block"]) > int(my_latest_block_num):
            print(json.dumps(token, sort_keys=True, indent=2, separators=(',', ': ')))
    my_latest_block_num = token_history[0]["block"]

def token_transfer_find() 함수는 60초마다 한번씩 run() 함수로부터 호출되어 새로운 토큰 내역을 찾게 됩니다.

api.get_history("goodhello", "", limit=20) limit=20으로 둔것은 1분마다 내역을 검사하는데, 그 내역이 20은 넘지 않을거라 생각했기에 20으로 두었는데, 더 작은 값을 두어도 될 것 같네요.

그리고 블록의 정보를 가져와서 my_latest_block_num 값과 비교하여 더 최신의 블록인지 여부를 검사하여 출력해보았습니다.

최신의 블록이 아니라면 그냥 지나가는거죠.

새로운 블록을 발견하지 못하고 계속 블록을 주기적으로 검사하고 있습니다.

마침 스팀엔진에

클레임 할 토큰이 있어 이 토큰을 클레임 하여 새로운 블록을 추가해 보겠습니다.

방금 클레임한 블록이 출력되었네요.

하지만 이 블록을 찾는게 목적이 아니죠.

토큰 전송 내역을 찾아야겠죠.

이번에는 부계정에서 SPT 토큰을 goodhello로 전송해 보았습니다.

새로운 블록의 내역이 잘 출력되었네요.

이제 이 정보를 분석하여 토큰 전송 내역을 뽑아 내면 되겠습니다.

클레임 내역과 토큰 전송 내역 모두 토큰이 전송된 내역이다보니 비슷한데, 자세히 보니 차이점이 있더라구요.

from_type 이 다르더라구요. 토큰 클레임은 contract토큰 전송은 user라고 나옵니다.

이제 from_type 을 검사해서 토큰 전송 내역을 검사할 수 있겠습니다.

for token in token_history:    
        if int(token["block"]) > int(my_latest_block_num):
            if token["from_type"] == "user" :
                print("토큰 클레임 블록 : ")
                print(json.dumps(token, sort_keys=True, indent=2, separators=(',', ': ')))
            elif token["from_type"] == "contract" :
                print("토큰 클레임 블록 : ")
                print(json.dumps(token, sort_keys=True, indent=2, separators=(',', ': ')))  

이제 새로운 내역을 검사하는 코드를 이렇게 수정하고 실행해 보겠습니다.

스팀엔진에서 SPT 토큰을 클레임 하고

goodhello.spt에서 SPT 20개를 goodhello로 전송해 보았습니다.

기대했던 대로 결과가 잘 나왔네요.

이제 마지막으로 토큰 전송 블록이라면 텔레그램으로 메시지를 보내는 코드를 넣어보도록 하겠습니다.

telegram_send = token["from"] + "님이 " + token["symbol"] + " 토큰을 " + token["quantity"] + "개를 " + token["to"] + "님에게 전송하였습니다."
bot.sendMessage(chat_id = chat_id, text = telegram_send)       

telegram_send 메시지를 만들어서 bot.sendMessage()를 통해 텔레그램으로 메시지를 전송하였습니다.

그리고 goodhello.spt 로부터 goodhello로 토큰을 30개 전송을 해보았습니다.

그 결과 텔레그램으로 메시지가 잘 도착하였네요.

import time
import json
import telegram
from steemengine.api import Api
api = Api()

my_latest_block_num = 0
my_token = '텔레그램 토큰'
bot = telegram.Bot(token = my_token)
chat_id = '테레그램 챗 아이디'

def token_transfer_find():    
    token_history = api.get_history("goodhello", "", limit=20)
    global my_latest_block_num
    for token in token_history:    
        if int(token["block"]) > int(my_latest_block_num):
            if token["from_type"] == "user" :
                print(token["block"] + "은 토큰 전송 블록 텔레그램 메시지 전송")
                telegram_send = token["from"] + "님이 " + token["symbol"] + " 토큰을 " + token["quantity"] + "개를 " + token["to"] + "님에게 전송하였습니다."
                bot.sendMessage(chat_id = chat_id, text = telegram_send)                       
            elif token["from_type"] == "contract" :
                print(token["block"] + "은 토큰 클레임 블록")
                  
    my_latest_block_num = token_history[0]["block"]
       
def run():
    while True:
        print(time.strftime('%Y-%m-%d %HH:%MM:%SS', time.localtime(time.time())))
        token_transfer_find()
        print("새로운 블록 검사중... 최신 블록 넘버 : ", my_latest_block_num)        
        time.sleep(60)

if __name__ == '__main__':
    token_history = api.get_history("goodhello", "")
    my_latest_block_num = token_history[0]["block"]
    print("my_latest_block_num : ", my_latest_block_num )
    run()

전체 코드는 위와 같습니다.

이전에 배웠던 내용들을 활용하여 그런대로 잘 만들어 진 것 같습니다.

이 코드를 활용한다면 앞으로 더욱 다양한 기능을 보탤 수 있을것 같네요.


오늘은 토큰 전송 내역을 텔레그램으로 받아보는 코드를 작성해 보았습니다.

이제 저도 보팅 내역이나 댓글 정보까지 텔레그램으로 받아볼 수 있는 코드까지 만들수 있을 것 같다는 생각이 드는군요.

프로그램 일기 시작한지 이제 10일이 되었는데, 그간 정말 많이 발전한 것 같습니다.

앞으로도 계속 공부하여 실력을 키워나가 보도록 하겠습니다.

그럼 여러분들 행복한 주말 연휴 혹은 휴가 되시길 바래요.


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

#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 무한 반복 자동 클레임 업그레이드!! && 토큰 잔고 확인 && 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보기!!

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:  

벌써 10일이 지났군요. 조만간 스팀엔진 전문 개발자가 되실 듯.

Posted using Partiko Android

하하.. 아직 고수님들 따라가려면 너무 너무 먼것 같아요.

그래도 열심히 해보겠습니다.

감사합니다.

굿헬로님 그런데 이런 건 무슨 교재로 배울 수 있나요?

교재는 따로 없구요.

파이썬 프로그래밍은 https://wikidocs.net/43 이곳에서 배울수 있구요.

저는 보통은 다른 사람이 만든 코드 보면서 직접 부딪히며 익히고 있습니다.

그러다 어려운 문법 만나면 차근차근 동작과정을 하나씩 분석해 나가는 위주로 하고 있네요.

궁금하신점 있으면 질문주세요.. 능력되는대로 도움드리겠습니다.

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.

볼수록 놀라운 시리즈입니다~ 이제 뽀로로와 막걸리가 거의 덮혔어요..ㅋㅋ

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

...% 4 31 2차 추가 goodhello/td> 1000 1.19% 4 ...

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

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

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

앗 딱 정말 필요한 기능인 것 같네요. 저도 지금 토큰 임대내역을 찾아헤매고 있습니다 ㅎㅎㅎ