Node.js

マイニングプールのハッシュレートとかを定期的にツイートするbot作ったよ

はじめに

最近LA Mining Poolって言うところでBitzenyのマイニングを初めてハッシュレートとかがちょくちょく気になるので定期的にツイートするbotを作ったよ。その時のメモだよ。

よくマイニングプールで見かけるWikiみたいなシステムをMPOSって言うみたいだよ。

ここにAPIリファレンスがあるよ。

前提

LinuxサーバーでCronで定期作動させる予定で作ったよ。

なのでプログラムを常時起動させて独立的に定期投稿するタイプではないよ。

node.js 9.4.0を使うよ。

必要なモジュールは以下の通り。

- twitter
- dateformat
- request

作っていこう

早速作っていくよ。
まずtwitterに軽くラップするよ。

twitter.js
module.exports = class TwitterClient{
    constructor(){
        const twitter = require('twitter');
        this.client = new twitter({
            consumer_key: 'api_key',
            consumer_secret: 'api_secret',
            access_token_key: 'access_token',
            access_token_secret: 'access_token_secret'
        });
    }

    tweet(message) {
        const data = {
            status: message
        };

        this.client.post('statuses/update', data, function(error, tweet, res) {
            if(!error) console.log("ついーとできたよ");
        });
    }
}

とりあえずこれでtweetメソッドにツイート内容を投げるだけでよくなったよ。

次にメイン部分を作るよ。

main.js
const request = require('request');
const Twitter = require('./twitter.js');
const formatDate = require('dateformat');

main();

async function main() {
    const status = await getStatus();
    const balances = await getBalances();

    const hashrate = status.data.hashrate   + "KH/s";
    const confirmedBalance =    balances.data.confirmed + "ZNY";    
    const unconfirmedBalance     = balances.data.unconfirmed + "ZNY ";

     //ここはよしなにしてね。
     const message = formatDate(new Date(), 'yyyy/mm/dd HH:MM:ss')+
                        "\nHashRate: " + hashrate +
                        "\n認証済報酬: " + confirmedBalance +
                        "\n未認証報酬: " + unconfirmedBalance +  "\n";
    //console.log(message);
    new Twitter().tweet(message);
};

//APIで現在のhashrateを取得するよ。
async function getStatus() {
    const methodName = 'getuserstatus';
    const data = await callMethod(methodName);
    return data.getuserstatus;
}

//APIで現在の報酬情報を取得するよ。
async function getBalances() {
    const methodName = 'getuserbalance';
    const data = await callMethod(methodName);
    return data.getuserbalance;
}

//APIを呼び出すよ。
async function callMethod(methodName) {
    const headers = {
        'Content-Type': 'application/json'
    };

    //この二つはDashboardで確認できるよ。
    const api_key = 'api_key';
    const id = 'ユーザーID(5桁の数字だったよ)';

    const options = {
        //ここを変更すると別のプールに対応可能だよ。
        url: 'https://lapool.me/bitzeny/index.php',
        method: 'GET',
        headers: headers,
        json: true,
        qs: {
            'page': 'api',
            'action': methodName,
            'api_key': api_key,
            'id': id
        }
    };

    return await getRequest(options);
}

//nodejsとのお約束の章
function getRequest(options) {
    return new Promise(function (resolve, reject) {
        request(options, function (error, res, body) {
            if (!error && res.statusCode == 200) {
                resolve(body);
            } else {
                reject(error);
            }
        });
    });
}

これで完成だよ。

main()内のconsole.logを使ってツイート内容を決めたら次はcrontabの設定だよ。

$ su -
$ crontab -e
$ #ここでは/root/MiningPoolMonitor/main.jsを実行ファイルとするよ
$ 0 0,6,12,18 * * * node /root/MiningPoolMonitoring/main

これで毎日0時6時12時18時に6時間ごとにツイートするよ。

おしまい。

あとがき

正直Qiita書いてみたいっていう好奇心から描き始めたから内容がうっすうすなのは勘弁してね。

でもAsyncAwaitをいい感じに倒せた気がするのでよしとするよ。

憎いね、Promise。