굳헬로의 스팀 프로그램 일기!! 서른일곱번째 #37 스팀엔진 블록을 검사하여 본인글의 댓글을 텔레그램 알람으로 받아보자!!

in #sct7 years ago

steem.jpg

어느새 이번주도 신나는 불금이 되었네요.

내일은 행사가 있는 관계로 출근!! 이지만... 그래도 오늘 저녁에 술 약속도 있고, 내일도 행사하면서 음주를~ ㅎㅎ

어쨋거나 신나는 금요일 오늘도 프로그램 일기 남겨 봅니다.


2일전에 스팀에서 새글 정보를 텔레그램으로 받아보는 코드를 만들었었죠.

blockchain = Blockchain()
stream = map(Post, blockchain.stream(filter_by=['comment']))

그런데 이 방법은 새 블록을 계속 검사하여 새글과 댓글의 정보를 가져오는 방법인데, 만약 프로그램에 오류가 생겨서 멈췄거나 실행중이 아니라면 블록은 계속 생성되기 때문에 놓치는 블록이 생길 수 있더라구요.

그래서 스팀의 블록을 직접 검사하여 새글과 댓글의 정보를 가져오는 코드를 한번 만들어 보았습니다.

s = Steem()
block = steem.get_block(block_num)

block_num에 블록넘버를 넣어주면 해당 블록의 정보를 가져온답니다.

block_num = 35794185

최근 생성된 35794185의 블록 정보를 한번 출력해 보겠습니다.

.
.
.
 {'block_num': 35794185,
                   'expiration': '2019-08-23T04:39:33',
                   'extensions': [],
                   'operations': [['custom_json',
                                   {'id': 'sm_team_reveal',
                                    'json': '{"trx_id":"9f6908fcc974cb0ab546b57721f6ea67b7a5d3cf","summoner":"C1-49-DYSJ285ZWW","monsters":["C3-82-OTR22WA0XC","C1-51-V7YRFI7XBK","C1-46-9CBLYMN0UO","C2-129-SFVCIMNYF4","C3-91-69LB1T73TS"],"secret":"bZzcBlEk8i","app":"steemmonsters/0.7.0"}',
                                    'required_auths': [],
                                    'required_posting_auths': ['ran.koree']}]],
                   'ref_block_num': 11509,
                   'ref_block_prefix': 3252436670,
                   'signatures': ['1f5b73ded32b1aec7c9c59a52daef46788d45d252011ff20ae06b871abb2dbf5ed7caa3618d0f8c37b713fe1ab3973e4d640869e117c311f676d301970afb6a440'],
                   'transaction_id': 'e7d0ea94d72f922ed63f7b016c33cb50a36b00a4',
                   'transaction_num': 9},
                  {'block_num': 35794185,
                   'expiration': '2019-08-23T04:30:39',
                   'extensions': [],
                   'operations': [['vote',
                                   {'author': 'motoa',
                                    'permlink': 'xoaeacrfsu',
                                    'voter': 'focusga',
                                    'weight': 10000}]],
                   'ref_block_num': 11524,
                   'ref_block_prefix': 3310768045,
                   'signatures': ['207730b039026294ad14181dc314bf96b2785b0639cfd9d75d2de3614f029529d1411b8ccc46098b5f881d8a87f7519d6cc503d04c7f379c277254c84ce7c0e957'],
                   'transaction_id': 'a467decf3c97581ea1e68e816fca0e579c198b92',
                   'transaction_num': 10},
                  {'block_num': 35794185,
                   'expiration': '2019-08-23T04:30:42',
                   'extensions': [],
                   'operations': [['vote',
                                   {'author': 'mattuk',
                                    'permlink': 'actifit-mattuk-20190822t191313479z',
                                    'voter': 'orangeslice',
                                    'weight': 10000}]],
                   'ref_block_num': 11528,
                   'ref_block_prefix': 855755795,
                   'signatures': ['2069019eed3662e07b7f8cca4924f0fac7e3d8099c71bfd2c7bdfdea942fddf19e5a34aa3dceb0a9afe69cefd85687ecc6202e6a3df97d371ae6b950f05b575bd3'],
                   'transaction_id': '020f961062fddd689c19dfbfb3f4ac275da89af2',
                   'transaction_num': 11},
                  {'block_num': 35794185,
                   'expiration': '2019-08-23T04:39:42',
                   'extensions': [],
                   'operations': [['custom_json',
                                   {'id': 'sm_team_reveal',
                                    'json': '{"trx_id":"70175d8c0ec6e6ebdfc4cb9125a30534852a3265","summoner":"C-POCHBLTHKW","monsters":["C-IARK2NYM0W","C-FDJ52RJC28","C-JZPJHH57SG"],"secret":"xl34BV0cRy","app":"steemmonsters/0.7.0"}',
                                    'required_auths': [],
                                    'required_posting_auths': ['hotbit']}]],
                   'ref_block_num': 11512,
                   'ref_block_prefix': 4047903121,
                   'signatures': ['1f7d238901ac20c6546d77da6bccccb823b9352b3806215bdeb18bec2711b2d0a26cc19bed0b9282d8302bf01e19ffb64924a3c0530f00942e52559ea0b19d76ba'],
                   'transaction_id': 'c7b3b3955b2e7f1707a370f7fd06b94e72ce7f37',
                   'transaction_num': 12},
                  {'block_num': 35794185,
                   'expiration': '2019-08-23T04:30:39',
                   'extensions': [],
                   'operations': [['vote',
                                   {'author': 'gardenofeden',
                                    'permlink': '4xnabb-sustainable-breakfast-feast-at-the-garden-of-eden',
                                    'voter': 'alchemaster',
                                    'weight': 10000}]],
                   'ref_block_num': 11524,
                   'ref_block_prefix': 3310768045,
                   'signatures': ['200287640cf026971bff7db994889e472077823fe96e0ce805c7b6cd906a965c8640634d2092b5de3188237ee912f3b9c7efe0ce7fa26538817871862ddb4eeb3f'],
                   'transaction_id': 'ddf89ffaf35b9fd6c394b54a44558a7e24ee93a0',
                   'transaction_num': 13},
.
.
.

블록넘버 35794185 하나에 무수히 많은 정보들이 들어 있네요.

그중 operations을 살펴보면 custom_json도 보이고, vote도 보이고, transfer, comment등 우리가 스팀 블록체인에서 활동하는 모든 정보가 이 블록들에 저장되고 있습니다.

이제 이를 분석하면 할 수 있는 일들이 많을 것 같습니다.

오늘은 comment 정보를 한번 살펴보도록 하겠습니다.

조금전에는 하나의 블록만을 살펴 보았는데 for 반복문을 이용하여 범위를 정해서 여러 블록을 살펴볼수 도 있고, 이것을 계속 가동시키면서 최신의 블록을 계속 살펴본다면, 새글 정보와 댓글정보, 보팅, 송금 등 모든 정보를 빼올수가 있을겁니다.

시작 블록넘버와 마지막 블록넘버를 지정해 주고 블록 검사를 시킨 후 검사 완료가 된 블록을 시작 블록넘버로 지정하고 다시 새로 생긴 블록 넘버를 지정해 준다면 for 문이 계속 반복하면서 새 블록을 검사할 수 있습니다.

while True:     
    last_block_num = steem.last_irreversible_block_num
    for block_num in range(start_block_num, last_block_num):
         block = steem.get_block(block_num)
         block_num 블록의 정보를 이용
    start_block_num = block_num 

last_block_num = steem.last_irreversible_block_num 최신의 블록넘버를 가져오는 코드입니다.

start_block_num 에 시작 블록넘버를 입력해주면, 해당 블록부터 최신 블록까지 블록을 검사한 후 검사가 끝난 블록넘버를 다시 start_block_num에 넣어 시작 블록넘버로 지정하고, 다시 최신 블록넘버를 가져와서 다시 for문을 이용하여 블록 검사를 수행합니다.

with open(filename,'w',encoding="utf-8") as save_block_num: 
    json.dump(block_num_json, save_block_num, ensure_ascii=False, indent="\t") 

with open(filename,'r',encoding="utf-8") as load_block_num: 
    start_block_num = json.load(load_block_num)['block_num'] 

그리고 혹시나 모를 프로그램의 오류나 작동 중지 시간을 고려하여 검사가 끝난 블록 넘버를 파일에 기록해두고 그 넘버부터 다시 작업이 수행되도록 코드를 넣었습니다.

다음으로 블록을 검사하는 코드입니다.

하나의 블록안에 무수히 많은 트랜젝션 transactions들이 존재 하므로 우선 각 트랜잭션을 검사해야 합니다.

그리고 각 트랜잭션이 무슨 일을 수행하는지 operations을 통해 알아 낼 수 있습니다.

for trans in block['transactions']:
    if trans['operations'][0][0] == 'comment':
        `이 트랜잭션은 새글 or 댓글 `

새글과 댓글의 정보를 가져오기 위해서는 operationscomment 인 것을 찾아 내면 됩니다.

마지막으로 새글인지 댓글인지를 검사해 보겠습니다.

if trans['operations'][0][1]['title'] == "" :
   `이 트랜젝션은 댓글`

새글과 댓글의 차이는 title 정보로서 구분할 수 있는데, 댓글은 title의 값이 없습니다.

if trans['operations'][0][1]['parent_author'] == "goodhello" :
    goodhello 글의 댓글

추가로 본인글의 댓글의 정보를 얻어내려면 parent_author 가 누구인지를 검사하면 됩니다.

제 부계정인 goodhello.spt로 제 글에 댓글을 남겨 보았습니다.

{'author': 'goodhello.spt',
 'body': '댓글 테스트!!',
 'json_metadata': '{"tags":["sct"],"app":"steemit/0.1"}',
 'parent_author': 'goodhello',
 'parent_permlink': '36',
 'permlink': 'pwocqy',
 'title': ''}

오~ 댓글의 정보를 바로 가져왔습니다.

이제 이것을 텔레그램 알람으로 받아보면 작업이 마무리 되겠네요.

지금 까지 작업한 최종 코드입니다.

def run(filename):
    while True:         
        steem = Steem()
        last_block_num = steem.last_irreversible_block_num        
        with open(filename,'r',encoding="utf-8") as load_block_num: 
            start_block_num = json.load(load_block_num)['block_num'] 
        try:
            for block_num in range(start_block_num, last_block_num):
                block = steem.get_block(block_num)
                if block == None:
                    break

                for trans in block['transactions']:
                    block_num_json = {"block_num": block_num}
                    with open(filename,'w',encoding="utf-8") as save_block_num: 
                        json.dump(block_num_json, save_block_num, ensure_ascii=False, indent="\t") 

                    if trans['operations'][0][0] == 'comment':
                        if trans['operations'][0][1]['title'] == "" :
                            if trans['operations'][0][1]['parent_author'] == "goodhello" :
                                post = trans['operations'][0][1]
                                pprint.pprint(post)
                                text_send = post['author'] + "님 댓글  : \n " + post['body'] + "\n" + "https://steemit.com/@" + post['author'] + "/" + post['permlink'] 
                                bot.sendMessage(chat_id = chat_id, text = text_send)

        except Exception as e:
            print('오류 발생 : ' + str(e))
            raise
        time.sleep(10)

if __name__ == '__main__':
    my_token = '텔레그램 토큰' 
    bot = telegram.Bot(token = my_token)
    chat_id = '챗 아이디'
    output_file = 'steem.comment.json'
    with suppress(KeyboardInterrupt):
        run(output_file)

코드를 실행하고

다시 댓글을 남겨 보았습니다.

텔레그램으로 알림이 잘 왔네요.

링크를 클릭하면 댓글 페이지로 바로 이동이 됩니다.

이제 실시간으로 댓글을 받아볼 수 있게 되었네요.

앞으로 이 코드를 활용하여, 실시간으로 보팅 알람을 받는 코드도 만들어 보고, 최종적으로는 웹으로 배포하여 누구나 본인 아이디를 등록해서 텔레그램으로 댓글과 보팅 등의 알람을 받아볼 수 있도록 개발해 보겠습니다.

그럼 여러분들 신나는 불금 보내시구요~

행복한 주말 되세요~


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

#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대 조합의 임대내역을 최신으로 저장하기!!

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

#18 굳헬로의 스팀 프로그램 일기!! 열여덟번째 #18 스팀코인판 3대 조합의 임대내역과 실시간 예상 분배 금액을 웹으로 확인해보자!!

#19 굳헬로의 스팀 프로그램 일기!! 열아홉번째 #19 어제 만든 프로그램 업그레이드!! 개별 상세내역보기 기능 추가!!

#20 굳헬로의 스팀 프로그램 일기!! 어느덧 스물번째 #20 시행착오... 그리고 시련... 하지만 원사마님 덕분으로 엄청난 레벨업!! 감사합니다. 더욱 발전하겠습니다.

#21 굳헬로의 스팀 프로그램 일기!! 스물한번째 #21 레벨업을 했지만 또 다시 찾아온 시련!! 프로그램 결과와 블록체인에 기록된 결과가 다르다!! 어떻게 해야 할까...

#22 굳헬로의 스팀 프로그램 일기!! 스물두번째 #22 오늘부터 새로운 도전!! 자동 보팅 만들기!! 그 첫번째 스팀코인판의 소각글에 자동보팅을 해보자!! 첫번째 시간 (1/N)

#23 굳헬로의 스팀 프로그램 일기!! 스물세번째 #23 스팀코인판의 소각글의 정보를 가지고 와서 자동보팅을 해보자!! 그 두번째 시간 (2/N)

#24 굳헬로의 스팀 프로그램 일기!! 스물네번째 #24 스팀코인판 3대조합의 임대내역을 웹으로 확인해보자!! 업그레이드!!

#25 굳헬로의 스팀 프로그램 일기!! 스물다섯번째 #25 스팀코인판 3대조합의 임대내역을 웹으로 확인해보자!! 업그레이드 2!! 그리고 개발 예정 사항 공개!!

#26 굳헬로의 스팀 프로그램 일기!! 스물여섯번째 #26 드디어 첫 실전 가동 준비중... 스팀코인판 유니온 조합의 수익 자동분배 작업 완료중...

#27 굳헬로의 스팀 프로그램 일기!! 스물일곱번째 #27 스팀코인판 유니온 조합 첫 자동 분배 결과!! 그리고 보완!!

#28 굳헬로의 스팀 프로그램 일기!! 스물여덟번째 #28 스팀코인판 유니온 조합 자동 분배 프로그램의 결과를 웹으로 확인해 보자!!

#29 굳헬로의 스팀 프로그램 일기!! 스물아홉번째 #29 스팀코인판 유니온 조합 자동 분배 상황을 텔레그램으로 확인!! 임내 확인 페이지 정렬 기능 추가!!

#30 굳헬로의 스팀 프로그램 일기!! 서른번째 #30 스팀코인판 조합의 임대량 페이지 정렬 기능 업그레이드!! 그리고 임대량 파이 차트 완성!!

#31 굳헬로의 스팀 프로그램 일기!! 서른한번째 #31 스팀코인판 조합의 하루하루 임대량 변화를 차트로 확인해보자!!

#32 굳헬로의 스팀 프로그램 일기!! 서른두번째 #32 트리플A를 이용하면서 그동안 번거로웠던 클레임 스테이킹 전송 작업 이젠 안녕!! 자동으로 AAA를 전송하고 클레임하고 스테이킹을 해보자!!

#33 굳헬로의 스팀 프로그램 일기!! 서른세번째 #33 굳헬로가 만든 스팀코인판 조합 자동 클레임과 자동 분배 프로그램 원피스 조합에도 사용 개시!!

#34 굳헬로의 스팀 프로그램 일기!! 서른네번째 #34 스팀코인판 조합 원피스 자동 클레임과 자동 분배 프로그램 업그레이드!! 텔레그램 봇으로 그룹 메시지를 받아보자!!

#35 굳헬로의 스팀 프로그램 일기!! 서른다섯번째 #35 스팀에서 새글 정보를 텔레그램으로 받아보자!! 함께 정보를 받아보는 텔레그램 그룹방 개설!!

#36 굳헬로의 스팀 프로그램 일기!! 서른여섯번째 #36 스팀엔진 블록 검사 놓치는 블록이 없도록 해보자!! 파일 입출력 기능 활용!!

Sort:  

오늘 저녁에 술 약속도 있고, 내일도 행사하면서 음주를~ ㅎㅎ

술마실 생각만 하면 행복하시죠? ㅋㅋㅋㅋㅋ
즐거운 불금 되세요~ 음주는 적당히^^

ㅋㅋㅋㅋㅋㅋㅋㅋ 신남신남~~

신나는 불금 보내시길 바래요~

행복한 불금 되세요. 텔래그램 댓글 알림 기대됩니다. ㅎㅎ

일단 텔레그램 봇을 각자 사용하는 방법을 찾고 있는데... 아직 방법을 못찾고 있네요..

앗.. 이건 해결했네요.. 이제 봇 서버를 만들면 되겠네요~

빨리 해결되서 다행입니다. ㅎㅎ

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.983 which ranks you at #4068 across all Steem accounts.
Your rank has not changed in the last three days.

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

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

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.083
BTC 62762.14
ETH 1674.04
USDT 1.00
SBD 0.42