[IMAGE: https://steemitimages.com/DQmckD7JDnwwJ6VHhDggRsj3X9BeZ9ex5HF8h3oxcDJJYSS/goldhand.png]
길었던 실시간 준비편들이 끝났습니다. 오늘 다뤄볼 것은 실시간 준비편을 통해 마련한 코드를 이용하여 개인 봇을 만들...지는 않습니다. 이번 편은 @dailypro님의 사연(?)을 바탕으로 작성하였습니다. 코딩몰라여 시리즈에서 본인의 아이디어를 다룰 수 있도록 허락해주신 @dailypro님께 감사드립니다. 아래의 미해결 사항이 반영된 봇을 만드는 과정을 바탕으로 이야기를 풀어나갈거에요.
[IMAGE: https://steemitimages.com/DQmeapE2Sij1gPgPZxmZqu85H3G3wkTZyUoskNBrp6MxBYY/01.PNG]
# 만들고자 하는 봇의 활동 범위
자신만의 봇을 만들기 위해 아이디어를 떠올린 분이 개발에 착수하기 전에 고려할 사항은 '봇이 반응할 대상과 위치' 입니다.
어떤 의미냐면... 가이드독(@krguidedog)이나 마아냐봇(@maanyabot)같은 경우에는 불특정 다수의 댓글을 읽어야합니다. 그리고 그 댓글이 어디에서 나타날지도 모르는 상황에 대해 대처해야하는 봇입니다.
이 경우에는 스팀의 블록 정보를 모두 읽어야만 기능을 수행할 수 있습니다.
@dailypro님의 만들고자하시는 봇(이하 금손봇)은 불특정 다수의 댓글을 읽어야하는 상황은 동일하지만, 처리할 댓글이 어디에서 나타날지는 명확합니다. @dailypro님의 금손 포스트에 달리는 댓글만 처리하면 됩니다.
이 경우에는 스팀의 블록 정보를 모두 읽을 필요가 없습니다. 그럼 어떻게 해야할까요? :) 슬슬 감이 오셔야할텐데...!
@dailypro님의 포스팅에 달린 댓글은 모두 @dailypro님의 계정 활동 기록(account_history)에 저장됩니다. 해당 기능은 스팀 체인을 전부 읽는 것이 아니라 특정 인물의 account_history를 계속 읽는 것으로 범위를 좁힐 수 있습니다. 따라서 코딩몰라여 시리즈의 댓글 알람 만들기 1편, 댓글 알람 만들기 2편에서 다룬 내용으로도 충분히 만들 수 있습니다! 이번 편은 댓글 알람 만들기편의 연장선으로 볼 수 있겠네요.
이제 금손봇의 틀만 같이 만들어볼까요?
[IMAGE: https://steemitimages.com/DQmX2djsggXiV2UQSJzdZLpDYdczzcEC72eYaLB8KvGF1L4/5251937E4F514F002F.jpg]
# 내 포스트에 달린 댓글 가져오기
[IMAGE: https://steemitimages.com/DQmY6L7hfcpV8DFufzQ746A29V9xdFrLwA2gVzsV795rxwP/02.PNG]
댓글 알람 편의 코드를 조금 수정했습니다. 댓글을 달고 보팅하는 기능을 요구하기 때문에 포스팅키를 코드에 올려줬습니다. past_seq_num 의 선언부터 봇의 기능이 시작하는 부분이라고 보시면 됩니다. voted_permlink는 한 번 보팅한 댓글을 저장해뒀다가 두 번 반응하지 않도록 하기 위한 저장소입니다.
프로그램이 시작되었을 때 확인되는 계정 기록 번호를 past_seq_num에 저장하고, 주기적으로 최근에 새로운 기록(recent_seq_num)이 있는지 확인하면서 처리하는 틀입니다. 새로운 기록 중에서 댓글(comment 면서 title이 없음) 기록을 찾고, 다른 사람이 작성한 댓글들(replies)을 처리하면 되겠죠? ^^*
[IMAGE: https://steemitimages.com/DQmYkQV9jqRmVegKnrwKvbQwubnSYQZJLp4QXKxrz2E7yBs/5251937F4F60B50029.jpg]
~~뭔 말이야...~~
내 글에 다른 사람이 단 댓글을 가져오는 코드라고 한 줄 요약 가능합니다. 그냥 그렇다 생각하고 사용합시다. 이제 대댓글을 달고, 보팅하는 기능을 추가해볼게요. 그리고 한 번 반응한 댓글에는 반응하지 않도록 댓글을 저장하는 기능도 추가하겠습니다. 어디에 추가하면 되는지 위의 코드를 보면 바로 보이죠? 그렇죠!? ~~마아냐 인성 논란 / 독자 바보 취급~~
# 대댓글 달기
댓글을 달거나 보팅을 하기 위해선 댓글의 정보를 갖고 있는 Post 객체를 소환해야합니다. 목적을 이룰 수 있는 가장 간단한 방법이며 그 외에 다른 방법이 있는지 저는 모르겠네요.
Post 객체로 변환하는 방법은 두 가지가 있는데, 하나는 블록체인의 스트림에서 comment로 필터링 된 dictionary를 이용하는 것이고 또 하나는 작성자(author)와 고유링크(permlink)를 조합한 문자열을 이용하는 것입니다. 우리는 후자의 방법을 사용하는 것이 간단합니다.
[IMAGE: https://steemitimages.com/DQmT2Tt1HyFQbbDYKACbcyyJLzMtJVDeP725mFy2A9NCuxy/03.PNG]
Post 객체를 만들어내기 위한 문자열은 @작성자/고유링크 입니다. 예를 들면 @maanya/c-c-06 같은 모양입니다. 올바른 문자열인지 판단하는 방법은 인터넷 주소창에 https://steemit.com/ 을 적고 그 다음에 이어붙여보면 됩니다. 잘못된 문자열이면 오류 화면이 나와요. :)
예시)
https://steemit.com/@maanya/c-c-06
만약 봇이 확인하기 전에 댓글이 삭제되어버리면 오류가 생기기 때문에 예외처리(try-except)를 해줬습니다. 삭제되거나 Post 객체로 변환하는 것을 실패한 댓글은 무시합니다. Post 객체로 변환하는 과정이 올바르게 수행되면 대댓글을 답니다. 대댓글을 다는 함수 reply가 Post 클래스의 함수라서 이러한 변환과정이 필요해요. 보팅도 마찬가지입니다.
# 댓글에 보팅하고 보팅한 댓글을 저장하기
[IMAGE: https://steemitimages.com/DQmcysXmWoMJfVF6rWDUSRvcHrbxvhB8KsWeW6wHKaeng1G/04.PNG]
...네, 놀랍게도 딸랑 두 줄이면 끝납니다. 어려운게 있으면 쉬운 것도 있어야죠. 보팅은 upvote 함수를 쓰면 됩니다. 보팅 퍼센트와 보팅하는 계정(본인) 이름을 주면 보팅이 쾅! 하고 찍힙니다.
> 500 스파가 넘어야 보팅 퍼센트를 조절할 수 있는거 아닌가요!?
네, 아닙니다. 0.0001 스파도 코드로 보팅을 하면 보팅 퍼센트를 조절할 수 있습니다. 스팀잇 사이트에서 지원을 안해주는 것뿐이에요 :) 물론 200퍼센트 같은건 안됩니다. 500 스파가 아니라도 조절 가능하게 만들어주는 써드파티 사이트도 있어요. 저는 안써서... 모르지만요...
보팅한 댓글을 저장하는 것으로 끝납니다. 두 번 반응하지 않기 위해서요! 대댓글을 달고 보팅을 하는 일련의 과정이 시작되기 전에 이미 반응한 댓글인지 아닌지 확인하는 과정만 추가하면 됩니다. 포스트에서 따로 다루지는 않고 GitHub에 올린 코드에서는 추가해놓았습니다.
# 완성! 그리고 장단점 이야기
[IMAGE: https://steemitimages.com/DQmYoFjP95n9yuXELGS3SZttvXbogXqMCV3pFxSpHiBXFA9/05.PNG]
이렇게 @dailypro님의 금손봇을 위한 틀을 만들어봤습니다. 가장 강조하고 싶은 점은 초반에 말씀드렸듯이 특정 유저의 기록만 관찰하면 되는 봇은 굳이 블록체인을 계속 읽어들일 이유가 없습니다.
블록을 읽어들이는 과정에서 발생할 수 있는 각종 오류들, 트래픽, 개발 난이도 등을 감당해야하기 때문입니다. 이러한 문제점들에서 자유로울 수 있다는 것이 오늘 소개드린 틀의 장점입니다. 단점은 get_account_history 함수만의 특징인데, 기록이 반영되는데 1분의 지연 시간이 있습니다. 누군가 저에게 댓글을 달면, 댓글이 달린 시간으로부터 1분 후에 get_account_history를 통해 확인할 수 있습니다.
나의 포스트에 방문해주신 분들에 대해 반응해줄 봇을 만들 때, 높은 안정성을 추구하고 1분의 지연 시간이 그다지 중요하지 않다면 이렇게 만들어보시는 것도 괜찮지 않을까요? :) 그래서 이번 편의 제목은 '방문자를 위한 봇' 으로 가장 마지막에 붙였습니다.
개인적으로는 명령어 기능을 붙여서 최근에 작성한 포스트에만 반응하도록 할 수 있으면, 껐다 켰다하실 필요없이 관리가 가능해져서 편하게 사용하실 수 있을 것 같습니다. @dailypro님께서 @금손시작 이라고 댓글을 달면 봇이 해당 포스트의 permlink를 저장하고, 저장된 포스트에 달린 댓글에만 댓글 보팅을 하게끔 만드는거죠! @금손끝 명령어를 만들어서 저장해뒀던 포스트의 permlink와 voted_permlink를 삭제하는 기능도 만들고요. 어떠신가요? :D
본인의 아이디어를 다루는 것에 선뜻 허락해주신 @dailypro님께 다시 한 번 감사드리며, 이번에도 본인에겐 외계어나 다름 없으면서 꾸준히 읽으러 와주실 문과 여러분들께 리스펙트(경의, Respect)를 보냅니다. ~~벌써 누군가가 '마아냐!! 마아냐!!' 라고 부르는 댓글이 보이는 것 같기도...~~
- @dailypro님의 금손봇이 활동하는 포스트에 방문해보세요!
- 이번 편에서 작성된 코드는 아래의 링크에서 다운로드 가능합니다.
https://github.com/maaanya/codingmolayo-steempy - 코딩몰라여 시리즈는 아래의 사이트에서 모아볼 수 있습니다. ~~업데이트 해야함~~
https://codingmola.herokuapp.com/