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

in sct •  11 months 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 스팀엔진 블록 검사 놓치는 블록이 없도록 해보자!! 파일 입출력 기능 활용!!

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.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