어느새 이번주도 신나는 불금이 되었네요.
내일은 행사가 있는 관계로 출근!! 이지만... 그래도 오늘 저녁에 술 약속도 있고, 내일도 행사하면서 음주를~ ㅎㅎ
어쨋거나 신나는 금요일 오늘도 프로그램 일기 남겨 봅니다.
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 댓글 `
새글과 댓글의 정보를 가져오기 위해서는 operations
가 comment
인 것을 찾아 내면 됩니다.
마지막으로 새글인지 댓글인지를 검사해 보겠습니다.
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 예제
#5 굳헬로의 스팀 프로그램 일기!! 다섯번째 #5 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제
#6 굳헬로의 스팀 프로그램 일기!! 여섯번째 #6 파이썬으로 스팀엔진 토큰들을 클레임 해보자.
#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 스팀코인판 조합의 하루하루 임대량 변화를 차트로 확인해보자!!
#33 굳헬로의 스팀 프로그램 일기!! 서른세번째 #33 굳헬로가 만든 스팀코인판 조합 자동 클레임과 자동 분배 프로그램 원피스 조합에도 사용 개시!!
#34 굳헬로의 스팀 프로그램 일기!! 서른네번째 #34 스팀코인판 조합 원피스 자동 클레임과 자동 분배 프로그램 업그레이드!! 텔레그램 봇으로 그룹 메시지를 받아보자!!
#35 굳헬로의 스팀 프로그램 일기!! 서른다섯번째 #35 스팀에서 새글 정보를 텔레그램으로 받아보자!! 함께 정보를 받아보는 텔레그램 그룹방 개설!!
#36 굳헬로의 스팀 프로그램 일기!! 서른여섯번째 #36 스팀엔진 블록 검사 놓치는 블록이 없도록 해보자!! 파일 입출력 기능 활용!!
술마실 생각만 하면 행복하시죠? ㅋㅋㅋㅋㅋ
즐거운 불금 되세요~ 음주는 적당히^^
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
ㅋㅋㅋㅋㅋㅋㅋㅋ 신남신남~~
신나는 불금 보내시길 바래요~
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
행복한 불금 되세요. 텔래그램 댓글 알림 기대됩니다. ㅎㅎ
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
일단 텔레그램 봇을 각자 사용하는 방법을 찾고 있는데... 아직 방법을 못찾고 있네요..
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
앗.. 이건 해결했네요.. 이제 봇 서버를 만들면 되겠네요~
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
빨리 해결되서 다행입니다. ㅎㅎ
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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:
Feel free to join our @steem-ua Discord server
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit