[개발] Node & Steem(노드 앤 스팀) - 5편 리스팀 알림 봇을 만들어볼까? ( 1 / ? )
리스팀 알림 봇이란...?
뭘 만들어볼까 고민고민을 하다가 평소에 생각하던 내용이 있었습니다. 누군가 저의 포스팅을 리스팀 해주는 것은 매우 고마운 일입니다. 자기 블로그 한 켠을 차지하게 해주는 인정과 자신의 다른 팔로워에게 소개해주는 역할까지 해주니 사실 보팅보다 더 고마운 일이 아닐 수 없습니다.
헌데 누가 했는지 잘 안보이는게 문젭니다. 처음에 한두시간 정도는 누가 리스팀 해줬는지 보이지만, 간혹 안보이는 경우도 있고 시간이 좀 지나면 누가 리스팀 해주었는지 보이지도 않습니다.
그래서 이런 리스팀이 있을 때 알람으로 좀 받고 싶은데 굳이 텔레그램이나 이런 써드파티 앱이 아닌 내 리스팀된 포스팅에 댓글로 @아무개 님이 이 포스팅을 리스팀하였습니다. 정도로만 댓글 다는 봇을 마련해주어도 그 리스팀하신 분에 대한 감사한 마음을 가질 수 있을 것이라 생각했습니다.
모든 kr의 포스팅에 그 기능을 적용한다면 댓글 공해가 될수도 있으니 본인의 수락(신청)의 의미인 댓글 명령으로 whitelist 에 포함시켜 리스팀 알림 봇을 동작시킨다면 충분히 유용한 서비스가 되지 않을까 싶습니다.
@리스팀알림 on(켬)
@리스팀알림 off(끔)
이런식으로요. 누군가 나의 포스팅을 리스팀 했을 때 이런 댓글 봇이 동작하는 것이죠.
@nhj12311 님이 이 포스팅이 마음에 드나봐요. 방금 리스팀 했군요~? ♥. 2018-02-05 18:57
그럼 어떻게 만들건데?
저는 봇도 만들어본 적 없고 api만 보면서 나름 어떤 api를 사용해서 어떤 설계를 해야할지 머리속으로 생각해봅니다. 전부터 이 포스팅을 연재하면서 머리속으로 구상을 해본건 아주 단순한 그림입니다. 물론 다른 봇들은 구현이 어찌되어있는지 한번도 본적이 없는 상태입니다. ( 언제나 경험자분의 조언이 있으면 감사히 듣겠습니다. )
뇌피셜로 설계라는 것을 해봅니다. 먼저 블럭넘버라는 걸 기록해야 할듯 합니다. 최종 넘버를 항상 유지 기록하게끔이요. api는 steem.js의 streamBlockNumber를 사용하면 될것 같네요.
var release = steem.api.streamBlockNumber("head", function(err, result) {
console.log(err, result);
});
이 api는 블럭이 생성되면 해당 블럭넘버를 받아와서 번호를 반환해줍니다. 이렇게! (4배속 정도 감기한 화면임)
이 최신의 블럭넘버를 DB에 항상 최신으로 유지하고 현재 조회 및 작업중인 블럭넘버도 기록해야합니다. 봇 계정이 20초에 한번씩 댓글을 달수 있고 Bandwidth가 적은 경우는 더욱 제한이 걸릴거라 생각하기 때문에 대기 시간이 길수 있다고 보는 것이죠. 한가지 더 소스를 배포하는 시간에 다운타임도 있을 수 있으니 더욱 현재 작업완료된 블럭 넘버를 저장하고 있어야 합니다. 저는 최종 넘버를 lastBlockNumber로 칭하고 작업중인 넘버를 workBlockNumber라고 칭하겠습니다.
그래서 번호를 관리하는 테이블 두개가 일단 있어야 합니다. LastBlockNumber와 WorkBlockNumber라고요. 테이블을 두개로 나누는 이유는 서로 간의 간섭을 없애기 위함입니다.
그 다음은 WorkBlockNumber에 값을 입력 하고 해당 블럭 데이터를 getBlock api로 값을 얻어와 분해하여 보는 것입니다.
스팀 블록 데이터를 확인해보자.
이쯤에서 샘플 코드로 스팀 블럭 데이터를 열어보도록 해봅시다. 블럭 데이터를 눈대중으로 보고 열어 볼수 있도록 스크립트한 것입니다.
var release = steem.api.streamBlockNumber("head", function(err, blockNumber) {
console.log( blockNumber);
steem.api.getBlock(blockNumber, function(err, block ){
console.log( block.transactions[0].operations[0] );
var opCnt = 0;
for(var txIdx = 0; txIdx < block.transactions.length; txIdx++ ){
for(var opIdx = 0; opIdx < block.transactions[txIdx].operations.length; opIdx++ ){
opCnt++;
console.log( "txIdx : " + txIdx + ", opIdx : " + opIdx + ", opcnt : " + opCnt );
console.log( block.transactions[txIdx].operations[opIdx] );
}
}
release();
});
});
대충 요로코럼 쪼개보면 될듯 합니다. 요 스팀 블록 정보를 열어본 결과 몇개간추려 보자면~ 아래와 같이 나옵니다.
[ 'vote',
{ voter: 'yourhoney',
author: 'gomdorisweethome',
permlink: 'seven-day-b-and-w-challenge-day4',
weight: 1000 } ]
[ 'custom_json',
{ required_auths: [],
required_posting_auths: [ 'siralex' ],
id: 'follow',
json: '["follow",{"follower":"siralex","following":"gulcingny","what":["blog"]}]' } ]
[ 'comment',
{ parent_author: 'mimidiamond',
parent_permlink: 'my-world-of-steemit-so-far-so-great',
author: 'stacey31',
permlink: 're-mimidiamond-my-world-of-steemit-so-far-so-great-20180206t082447970z',
title: '',
body: 'Great post dear, Its indeed an untalented adjustment.\nKeep steeming @mimidiamond #cheers',
json_metadata: '{"tags":["untalented-adjustment","cheers"],"users":["mimidiamond"],"app":"steemit/0.1"}' } ]
vote, custom_json, comment 등의 타입이 있고 그 데이터들까지 있는 걸 알 수 있으니 블럭들을 읽어내어 필요한 작업들을 하면 될 것 같습니다. 그 중 제가 첫번째 관심을 가진 리스팀 알람은 아래와 같은 operation이 나오는걸 알수 있었습니다.
[ 'custom_json',
{ required_auths: [],
required_posting_auths: [ 'milliondollarz' ],
id: 'follow',
json: '["reblog",{"account":"milliondollarz","author":"adsactly","permlink":"adsactly-psychology-procrastination"}]' } ]
타입은 custom_json이며 id는 'follow' 그리고 json 데이터에 reblog라고 명시 되어있는 녀석이 우리가 말하는 리스팀이라는 걸 확인했네요.
생각해보니 리스팀 안내를 하기 위한 조건을 생각해봐야합니다.
리스팀 알람 봇의 작동 조건
1. 리스팀 유저의 명성도가 40 이상일 것
- 이는 리스팀 봇을 차단하기 위해 생각한 것이니변경이 필요할 수도 있습니다.
2. 리스팀 안내를 받는 이가 리스팀 봇 안내를 등록 할 것!
@리스팀알림 on(켬)
@리스팀알림 off(끔)
- 이런 멘트로 리스팀 알림의 서비스 리스트에 유저를 등록해야 한다고 했습니다. 이런 리스팀 알람이 필요없는 유저에겐 공해나 마찬가지니까요.
3. 몇일 정도 리스팀 시뮬레이션을 하여 수기로 블랙 리스트 작성
- 스팸과 같은 댓글 알람은 유저로 하여금 굉장히 피곤, 짜증나게 할 수 있으니 몇일간 시뮬레이션, 그리고 데이터를 모아 일 몇회 이상, 시간당 몇회 이상의 리스팀 스패머들을 블랙리스트를 작성할 필요성이 있습니다.
4. 24시간 내 리스팀 알람 제한 기준 필요.
- 제 생각에는 24시간 내 7건 이상의 리스팀을 하는 경우 리스팀 스패머의 기준이 될 수 있지 않을까 생각합니다. 이웃의 feed를 너무 어지럽히는 것도 좋은 것은 아니니까요.
모든 블럭을 뜯어서 볼수 있게 되었으니 각 상황(이벤트)에 맞게끔 whitelist DB에 유저정보를 적재하거나 리스팀 operation이 발견되는 경우 해당 글에 댓글을 달아주기만 하면 될것 같습니다. 다음시간에 좀 더 자세히 만들어나가봅시다. 포스팅 기준 두편 정도(?) 만들어나가면 완성 될 수 있을 듯 보입니다.
node & steem - 지난 회차 살펴보기
1편 - nodejs 개발환경을 구성해보자. 윈도우 개발 + Github 저장소 + 리눅스 운영
2편 - 콜백 지옥을 탈출해보자. - synchronize.js 편
3편 - 로깅 처리와 DB(mysql)설치 및 설정
4편 - DB 설정과 운영서버까지 설정 마무으리!
관심있어 나중에 보기 위해서 댓글달아둠.
ㅋㅋ 너무 적절한 짤에 빵 터지고 갑니다. ^^;
@리스팀 켬
@리스팀 켬
감사합니다. 뇌피셜대로 구현해낼 수만 있다면, 많은 분들이
유용하게 사용하실 수 있을 것 같네요. 리스팀합니다!
오오...기대됩니다. 리스팀봇이라니....
프로그래머 분들 진짜 존경합니다~
머리가 상당히 좋으신것 같네요^^
조...존경 정도의 말을 들을 건 전혀 아닙니다. 저도 제 분야가 아닌 걸 보면 그런 생각이 들곤 합니다... 사실 마누라가 아이 보는것만 봐도 존경심이 솟구치니 비슷한 마음이 아닐까 싶네요 ㅎㅎ
좋은 아이디어인 것 같습니다! 저도 시간날때 노드 공부를 해봐야겠습니다~
감사합니다. 노드 js , 파이썬과는 달리 자바스크립트라 좋긴 좋네요. 그나마 좀 친숙해서요 ㅎㅎ
와우~ 좋은 아이디어 로군요~~ ㅎㅎ
node&steem이 잘 진행되고 있는것 같아서 좋네요~~
감사합니다. 열나게 하고 있습니다~^^
저는 그동안 @asbear님의 steeme에서 리스팀을 확인하고 있었는데요. 이렇게 알람이 오면 더욱 편해질 것 같습니다.
봇이라도 저런 알림봇이라면 환영입니다!
스팀잇은 뭐하나 이분 안데려가시고!