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