randowhale과 같은 서비스 나도 만들어보자
안녕하세요.
@jongeun 입니다.
@randowhale과 같은 서비스를 node.js로 만드는 것에 대해 설명하겠습니다.
먼저, @randowhale 서비스에 대해 알아보고 해당 서비스가 어떻게 구현되는지를 살펴보겠습니다.
@randowhale 서비스는 @gunchul 님이 올리신 아래 포스트에서 확인할 수 있습니다.
https://steemit.com/kr/@gunchul/tip-2-sbd-0-5-2-5
원문은 아래 링크에서 확인 가능합니다.
https://steemit.com/steemit/@randowhale/updated-changes-to-randowhale-please-read
내용을 요약하면 다음과 같습니다.
- 2 SBD를 @randowhale 에게 전송한다. 이 때, memo 란에 보팅을 원하는 포스트의 주소를 입력한다.
- @randowhale은 해당 포스팅에 0.5% ~ 2.5% 의 보팅 파워로 보팅한다.
그럼, 어떻게 @randowhale 와 같은 서비스를 구현할 수 있는지 설명하겠습니다.
코드는 nodejs 프로젝트 입니다.
1. 디펜던시 추가
package.json에 아래와 같이 steem.js를 추가합니다.
{
"name": PROJECT-NAME,
"version": "PROJECT-VERSION",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"log4js": "^1.1.1",
"steem": "^0.5.18"
}
}
2. steem.js 코드에 포함
js 코드에서 사용할 라이브러리를 아래와 같이 포함합니다.
var steem = require('steem');
3. 로그인
본인의 스티밋 계정으로 로그인합니다.
로그인에 성공하면, wif가 반환되는데, wif는 보팅할 때, 사용됩니다.
var wif = steem.auth.toWif(account.name, account.password, 'posting');
account.name과 account.password는 로그인 아이디, 비밀번호 입니다.
4. 트랜젝션 조회
아래 방법이 맞는지 모르겠지만, 5초에 한 번씩 본인의 트렌젝션을 조회합니다.
setInterval(function() {
steem.api.getAccountHistory(account.name, 99999999, 20, function(err, getAccountHistoryResult) {
})
}, 5 * 1000);
getAccountHistory 함수는 특정 계정을 설정하여, 특정 계정과 연관된 트렌젝션을 보여줍니다. 99999999는 인덱스, 20은 결과셋 개수를 의미합니다. 인덱스를 높게 설정한 것은 트렌젝션의 개수 보다 높을 때는 가장 최근 트렌젝션을 보여주기 때문입니다.
5. 트랜젝션 분석
getAccountHistory 함수의 결과로 출력된 트렌젝션을 분석하여, transfer 트렌젝션만 추출합니다.
추출하는 방법은 코드가 조잡하지만, 대략 아래 코드와 같습니다.
setInterval(function() {
steem.api.getAccountHistory(account.name, 99999999, 20, function(err, getAccountHistoryResult) {
for(var i=0; i<getAccountHistoryResult.length; i++){
var result = getAccountHistoryResult[i];
result = JSON.stringify(result);
var start = result.indexOf(',');
if(start >1 ){
var end = result.lastIndexOf(']');
result = result.substring(start+1, end);
result = JSON.parse(result);
if(result.trx_id != "0000000000000000000000000000000000000000"){
result = JSON.stringify(result);
start = -1;
end = -1;
//트렌젝션 종류가 transfer 인 것을 확인
start = result.indexOf("transfer")
if(start > -1 ){
end = result.lastIndexOf(']');
result = result.substring(start+"transfer".length+2, end);
result = JSON.parse(result);
//거래 금액이 원하는 금액이 맞는지 확인,
if(result.amount == '2.000 SBD'){
var memo = result.memo;
var startMemo =memo.indexOf('@');
var endMemo = memo.lastIndexOf('/');
var permlink = memo.substring(endMemo+1);
var author = memo.substring(startMemo+1, endMemo);
vote(author, permlink);
}
}
}
}
}
})
}, 5 * 1000);
해당 코드에서는 @randowhale와 동일한 2 SBD 를 입금받았다고 가정합니다. transaction의 memo에서 보팅할 주소를 추출합니다.
6. 보팅
원하는 금액이 입금되었다면, 아래와 같은 코드로 보팅합니다.
var min = 50;
var max = 250;
var votingPower = Math.floor(Math.random()*(max-min+1)) + min;
steem.broadcast.vote(wif, account.name, author, permlink, votingPower, function(err, voteResult) {
});
위의 코드에서는 0.5% ~ 2.5%의 보팅파워가 랜덤으로 결정됩니다.
이상으로 @randowhale와 같은 서비스를 구현하는 방법에 대해 살펴보았습니다.
혹시, @randowhale와 유사한 서비스를 원하시면, 같이 한 번 해볼까요?
저는 스팀파워가 낮아서 개발력을 제공할 수 있습니다.

로또 번호를 뽑는 프로그래밍과 비슷하군요
혹시 보팅봇 운영 안하시나요? 1SBD 보냈는데 1시간이 지났는데 안오네요..
ㅜㅜ 아이고 운영안합니다. ㅠㅠ 어떡하죠
아. 그러시군요. 운영 안한다는 글이 없길래 계속 운영하시는줄 알았네요. 죄송하지만 환불 부탁드립니다.