[코딩몰라여] steem-python으로 방문자를 위한 봇 만들기 편

in #kr-dev6 years ago (edited)

goldhand.png

  길었던 실시간 준비편들이 끝났습니다. 오늘 다뤄볼 것은 실시간 준비편을 통해 마련한 코드를 이용하여 개인 봇을 만들...지는 않습니다. 이번 편은 @dailypro님의 사연(?)을 바탕으로 작성하였습니다. 코딩몰라여 시리즈에서 본인의 아이디어를 다룰 수 있도록 허락해주신 @dailypro님께 감사드립니다. 아래의 미해결 사항이 반영된 봇을 만드는 과정을 바탕으로 이야기를 풀어나갈거에요.

01.PNG

# 만들고자 하는 봇의 활동 범위


  자신만의 봇을 만들기 위해 아이디어를 떠올린 분이 개발에 착수하기 전에 고려할 사항은 '봇이 반응할 대상과 위치' 입니다.

어떤 의미냐면... 가이드독(@krguidedog)이나 마아냐봇(@maanyabot)같은 경우에는 불특정 다수의 댓글을 읽어야합니다. 그리고 그 댓글이 어디에서 나타날지도 모르는 상황에 대해 대처해야하는 봇입니다.

이 경우에는 스팀의 블록 정보를 모두 읽어야만 기능을 수행할 수 있습니다.

@dailypro님의 만들고자하시는 봇(이하 금손봇)은 불특정 다수의 댓글을 읽어야하는 상황은 동일하지만, 처리할 댓글이 어디에서 나타날지는 명확합니다. @dailypro님의 금손 포스트에 달리는 댓글만 처리하면 됩니다.

이 경우에는 스팀의 블록 정보를 모두 읽을 필요가 없습니다. 그럼 어떻게 해야할까요? :) 슬슬 감이 오셔야할텐데...!

@dailypro님의 포스팅에 달린 댓글은 모두 @dailypro님의 계정 활동 기록(account_history)에 저장됩니다. 해당 기능은 스팀 체인을 전부 읽는 것이 아니라 특정 인물의 account_history를 계속 읽는 것으로 범위를 좁힐 수 있습니다. 따라서 코딩몰라여 시리즈의 댓글 알람 만들기 1편, 댓글 알람 만들기 2편에서 다룬 내용으로도 충분히 만들 수 있습니다! 이번 편은 댓글 알람 만들기편의 연장선으로 볼 수 있겠네요.

이제 금손봇의 틀만 같이 만들어볼까요?

5251937E4F514F002F.jpg


# 내 포스트에 달린 댓글 가져오기


02.PNG

  댓글 알람 편의 코드를 조금 수정했습니다. 댓글을 달고 보팅하는 기능을 요구하기 때문에 포스팅키를 코드에 올려줬습니다. past_seq_num 의 선언부터 봇의 기능이 시작하는 부분이라고 보시면 됩니다. voted_permlink는 한 번 보팅한 댓글을 저장해뒀다가 두 번 반응하지 않도록 하기 위한 저장소입니다.

프로그램이 시작되었을 때 확인되는 계정 기록 번호를 past_seq_num에 저장하고, 주기적으로 최근에 새로운 기록(recent_seq_num)이 있는지 확인하면서 처리하는 틀입니다. 새로운 기록 중에서 댓글(comment 면서 title이 없음) 기록을 찾고, 다른 사람이 작성한 댓글들(replies)을 처리하면 되겠죠? ^^*

5251937F4F60B50029.jpg
뭔 말이야...

내 글에 다른 사람이 단 댓글을 가져오는 코드라고 한 줄 요약 가능합니다. 그냥 그렇다 생각하고 사용합시다. 이제 대댓글을 달고, 보팅하는 기능을 추가해볼게요. 그리고 한 번 반응한 댓글에는 반응하지 않도록 댓글을 저장하는 기능도 추가하겠습니다. 어디에 추가하면 되는지 위의 코드를 보면 바로 보이죠? 그렇죠!? 마아냐 인성 논란 / 독자 바보 취급

# 대댓글 달기


  댓글을 달거나 보팅을 하기 위해선 댓글의 정보를 갖고 있는 Post 객체를 소환해야합니다. 목적을 이룰 수 있는 가장 간단한 방법이며 그 외에 다른 방법이 있는지 저는 모르겠네요.

Post 객체로 변환하는 방법은 두 가지가 있는데, 하나는 블록체인의 스트림에서 comment로 필터링 된 dictionary를 이용하는 것이고 또 하나는 작성자(author)와 고유링크(permlink)를 조합한 문자열을 이용하는 것입니다. 우리는 후자의 방법을 사용하는 것이 간단합니다.

03.PNG

Post 객체를 만들어내기 위한 문자열은 @작성자/고유링크 입니다. 예를 들면 @maanya/c-c-06 같은 모양입니다. 올바른 문자열인지 판단하는 방법은 인터넷 주소창에 https://steemit.com/ 을 적고 그 다음에 이어붙여보면 됩니다. 잘못된 문자열이면 오류 화면이 나와요. :)

예시)
https://steemit.com/@maanya/c-c-06

만약 봇이 확인하기 전에 댓글이 삭제되어버리면 오류가 생기기 때문에 예외처리(try-except)를 해줬습니다. 삭제되거나 Post 객체로 변환하는 것을 실패한 댓글은 무시합니다. Post 객체로 변환하는 과정이 올바르게 수행되면 대댓글을 답니다. 대댓글을 다는 함수 reply가 Post 클래스의 함수라서 이러한 변환과정이 필요해요. 보팅도 마찬가지입니다.

# 댓글에 보팅하고 보팅한 댓글을 저장하기

04.PNG

  ...네, 놀랍게도 딸랑 두 줄이면 끝납니다. 어려운게 있으면 쉬운 것도 있어야죠. 보팅은 upvote 함수를 쓰면 됩니다. 보팅 퍼센트와 보팅하는 계정(본인) 이름을 주면 보팅이 쾅! 하고 찍힙니다.

500 스파가 넘어야 보팅 퍼센트를 조절할 수 있는거 아닌가요!?

네, 아닙니다. 0.0001 스파도 코드로 보팅을 하면 보팅 퍼센트를 조절할 수 있습니다. 스팀잇 사이트에서 지원을 안해주는 것뿐이에요 :) 물론 200퍼센트 같은건 안됩니다. 500 스파가 아니라도 조절 가능하게 만들어주는 써드파티 사이트도 있어요. 저는 안써서... 모르지만요...

보팅한 댓글을 저장하는 것으로 끝납니다. 두 번 반응하지 않기 위해서요! 대댓글을 달고 보팅을 하는 일련의 과정이 시작되기 전에 이미 반응한 댓글인지 아닌지 확인하는 과정만 추가하면 됩니다. 포스트에서 따로 다루지는 않고 GitHub에 올린 코드에서는 추가해놓았습니다.

# 완성! 그리고 장단점 이야기


05.PNG

  이렇게 @dailypro님의 금손봇을 위한 틀을 만들어봤습니다. 가장 강조하고 싶은 점은 초반에 말씀드렸듯이 특정 유저의 기록만 관찰하면 되는 봇은 굳이 블록체인을 계속 읽어들일 이유가 없습니다.

블록을 읽어들이는 과정에서 발생할 수 있는 각종 오류들, 트래픽, 개발 난이도 등을 감당해야하기 때문입니다. 이러한 문제점들에서 자유로울 수 있다는 것이 오늘 소개드린 틀의 장점입니다. 단점은 get_account_history 함수만의 특징인데, 기록이 반영되는데 1분의 지연 시간이 있습니다. 누군가 저에게 댓글을 달면, 댓글이 달린 시간으로부터 1분 후에 get_account_history를 통해 확인할 수 있습니다.

나의 포스트에 방문해주신 분들에 대해 반응해줄 봇을 만들 때, 높은 안정성을 추구하고 1분의 지연 시간이 그다지 중요하지 않다면 이렇게 만들어보시는 것도 괜찮지 않을까요? :) 그래서 이번 편의 제목은 '방문자를 위한 봇' 으로 가장 마지막에 붙였습니다.

개인적으로는 명령어 기능을 붙여서 최근에 작성한 포스트에만 반응하도록 할 수 있으면, 껐다 켰다하실 필요없이 관리가 가능해져서 편하게 사용하실 수 있을 것 같습니다. @dailypro님께서 @금손시작 이라고 댓글을 달면 봇이 해당 포스트의 permlink를 저장하고, 저장된 포스트에 달린 댓글에만 댓글 보팅을 하게끔 만드는거죠! @금손끝 명령어를 만들어서 저장해뒀던 포스트의 permlink와 voted_permlink를 삭제하는 기능도 만들고요. 어떠신가요? :D

본인의 아이디어를 다루는 것에 선뜻 허락해주신 @dailypro님께 다시 한 번 감사드리며, 이번에도 본인에겐 외계어나 다름 없으면서 꾸준히 읽으러 와주실 문과 여러분들께 리스펙트(경의, Respect)를 보냅니다. 벌써 누군가가 '마아냐!! 마아냐!!' 라고 부르는 댓글이 보이는 것 같기도...



Sort:  

본문 읽기전에 감사인사부터 드립니다.

이미 만드신 부분이 있으니 기존에 만드신 봇을 그대로 사용하신다면 # 대댓글 달기 파트에서 Post 객체로 변환하는 부분만 반영하시면 사용하실 수 있어요!

어쩜 이렇게 글을 잘쓰시나요
정독 했습니다.
정말 소중한 글과 시간과 노력에 어떻게 감사를 드려야할지.
숙제는 감이 옵니다. 할 수 있을 것 같습니다.

이미 작성한 것은 지난 코딩몰라여 시리즈 전편이죠. 약간의 수정이죠.
전편에서는 스캔이 어머무시합니다. 한20초도 안걸립니다. 조건 찾고 바로 송금하고.
거기다 업그레이드를 내일 시도해 보겠습니다

일단은 다시 정독하고 전편을 실행해 보겠습니다.
감사합니다.

py를 실행하면 댓글이 두번 달리는데요(참고로 구글플래폼입니다.)
대댓글 달고
보팅하고
검은색 화면에 저장되는 주소가 나옵니다.
그리고 대댓글이 또 달립니다.

보팅된 주소하고 비교하면서 같다고 인식을 못한거 같다는 느낌이네요.. ㅠ

비교 부분이 잘 동작하는지는 비교하는 부분에서 print를 하나 만들어보는게 좋겠습니다. 저는 완성 전에 두 번 달리는 현상을 한 번 목격했었는데 그 후로는 겪은 적이 없어서 정확히 알 수가 없네요. 다시 살펴보니 past_seq_num 갱신을 좀 더 위로 올리는게 나을 것 같습니다. 낮에 수정할게요! 제게 코드를 보여주시면 가장 빠르게 해결 가능하십니다 ;ㅂ; 프로필에 오픈카톡이 있으니 해결이 안되면 말씀 부탁드려요.

제가 사용하던 (이전 게시물 코딩몰라여시리즈) 곳에 포스트객체화 성공해서
지금 팽팽잘도 돌고 있습니다.
get history 보단 무척이나 빠릅니다. 사용자 분들이 실시간 댓글 올라오는 줄 알았다는 반응입니다. 헬로크립토 님의 랜덤을 이용한 댓글 다양화에 성공했습니다.
time sleeep 시간을 약 20초 간격을 두어서 봇1봇2를 동시에 돌립니다.
이렇게 되면 댓글을 두번쓰진 않습니다. 먼저 읽은 봇의 댓글내용으로 대댓글이 달립니다.
보팅은 봇1,봇2에 같은 숫자를 넣어두면 두번 보팅하지는 않는 것인지는 모르겠지만... 보팅파워는 어떤 일인지 모르겠습니다.

현재까지는 놓치는 댓글 없이 모조리 대댓글을 잘달고 있습니다. 피크때가 놓치는게 있는지 2라운드때 파악할려고 합니다.

본문 게실물과 같이 vote 목록 구성을 해보려고 합니다.

포스트 객체화 감사합니다. !!!!! 대박입니다.

무슨 이유로 봇을 두 개 돌리시는지 궁금합니다 ~_~;; 하나만 돌려도 잘 작동할텐데요..!

  1. 댓글폭발때 놓치지 않으려고 하는것과
  2. 댓글 내용 랜덤 선택하게 하는데요 아직 좀더 연구를 해야할 것 같습니다.

연구 좀더 해서 오픈카톡에 한 번 올려 보겠습니다 ^^

넘나 어렵네요..ㅠㅠ

톡까놓고 다시 읽어보니 개... 매우 어렵습니다. 이걸 사람이 보라고 만든건가 싶네요.

불러도 안오는 마신봇...

지금은 잘 찾아갈거에요... 속도 매우 빠름...

오옷 +_+
외계어가;;

print('리안은 혼란에 빠졌다!')

방문자를 위한 봇까정 만냐님은 진정한 능력자시네요...

감사합니다 +_+;// 알파고님에게 충성을...

경배합니다

엣헴 엣헴... ㅋㅋㅋ 농담입니다. 감사합니다. +_+

문송합니다만, 보다보면 언젠가 이해가 되겠지요?
그래도 재밌게 설명해주시는 것 같아 좋네요 ㅎㅎ

문송하실게 어딨습니까, 편수가 어느정도 진행되서 많이 어려워졌지만 보다보면 이해가 되도록 난이도를 조절하며 글을 쓰도록 하겠습니다... ㅋㅋㅋ 감사합니다 :)

최고 👍
한번 더 주의깊게.읽어 보겠습니다
즐거운 하루되세요🍀

글이 너무 어려워서 죄송합니다. /큰절 /큰절
즐거운 연휴 되세요!

코딩을 배워야겠다는 생각을 하면서도 시간을 잘 못내고 있네요 ㅜㅜ 예전에 php 독학할 때 재밌었는데...
꼭 시간을 내서 마아냐님의 파이선 익히도록 할꺼에요!

편할 때, 필요하실 때 천천~히 둘러봐주세요 :D 내용을 착착 쌓아서 더 알기 쉽게 만들어놓겠습니당

궁금한게 있는데 스팀잇에서 주로 사용하는 언어는 파이썬인가요? 주워듣기로 파이썬이 재밌고 난이도도 막 어려운것이 아니라고 하던데 어떤가요? 제가 배워본 언어는 php 하나뿐이에요. 그것도 그냥 기초정도 ^^;

python과 nodejs를 가장 많이 사용한다고 해요. API가 두 언어를 위주로 나오고 있어서요. 하이브 때도 크게 변하진 않을 느낌입니다 ;ㅂ; 파이썬은... 수학 잘하시는 분에게 쉽습니다... (?)

Coin Marketplace

STEEM 0.31
TRX 0.11
JST 0.034
BTC 64852.72
ETH 3178.07
USDT 1.00
SBD 4.20