10分で作れるNEMアドレス残高メール通知bot


NEMのアドベントカレンダーが本日だけ空いていたのでちょこっと書きます。

記載する内容はNEM1のもので、NEM2 Catapultで仕様が変わりますが、基本的なブロックチェーンへのリクエストはあまり変わらないと思います。(公開テストネットが始まったらできるかやってみまする。)

また、内容は手順を間違えなければプログラムの知識がなくても数行の簡単なコードをコピペしてもらえれば作れるものであります。

なお、筆者はエンジニアではなく、日常生活の範囲内で役立つツールのプログラムを書くくらいです。(twitter botとかLINE botとか)

それでは内容に入っていきます。

〈事前準備として必要なもの〉
・Googleアカウント
・PC(ブラウザ使えればOSは何でもいいです)
・ネット環境

〈使う言語〉
・GAS(GoogleAppsScriptというGoogleが作ったJavaScriptベースのプログラミング言語)

〈作業場所〉
・Googleドライブの中

【①ブラウザでGoogleドライブを開く】

黃・緑・青の三角形アイコンのマイドライブというやつですね。

新規のボタンから

Google Apps Script を開きます。
※ここにない場合はChromeストアからChrome拡張(アプリのようなもの)機能として追加してください。

開くとプログラムを書くところが現れます。

【②コードを書く】
この部分に以下のコードを書きます。

//NEMアドレスの情報をメールで知らせる  
function myFunction(){

  //取得したいNEMアドレスを""の間に入力※これはZaifのホットウォレットアドレス
  var account_address = "NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA";

  //残高データを取得するノード(NISと呼ばれるNEMのデータを持つサーバー)を設定
  var sn = "http://153.122.86.201";

  //取得した情報を送るメールアドレスを設定
  var mail_adress = "メールアドレス";

  //メールのタイトル
  var title = "NEM ACCOUNT INFORMATION"; 

  //取得先ノードへのアカウント情報取得リクエストのコード
  var response = UrlFetchApp.fetch(sn+':7890/account/get?address='+account_address);
  Logger.log(response);

  //GAS言語でメールを送信するコード(メソッドと呼ばれるもの)
  var message = GmailApp.sendEmail(mail_adress, title, response);
}

再生(実行)ボタンを押し、プログラムを実行します。

【③メールが届く】
なんかめちゃくちゃ文字列が書いてあるメールが届きます

これがNEMアカウント(アドレス)の中に含まれる”生”のデータです。
「JSON」と呼ばれる形式で送られてきます。

※このJSONデータを加工したり見やすくすることで、我らが「XEMbook」といった各種ツールは作られているのです。

ではデータの中を見てみます。

{
  "meta": {
    "cosignatories": [
      {
        "address": "NBEM6SFOHU5PORIGAVG3NNJIMCG73R2TWEEIDAZ5",
        "harvestedBlocks": 0,
        "balance": 9786450000,
        "importance": 0,
        "vestedBalance": 9786065466,
        "publicKey": "ae6754c70b7e3ba0c51617c8f9efd462d0bf680d45e09c3444e817643d277826",
        "label": null,
        "multisigInfo": {}
      },
      {
        "address": "NCTWKWGD564GIQQCZ5X5TC4YM46VXWLT3QWD5NLZ",
        "harvestedBlocks": 0,
        "balance": 3914000000,
        "importance": 0,
        "vestedBalance": 3914000000,
        "publicKey": "aa455d831430872feb0c6ae14265209182546c985a321c501be7fdc96ed04757",
        "label": null,
        "multisigInfo": {}
      },
      {
        "address": "ND3D6TXJYZGQUJ7T2OFYOUF4ACBRFZGSAJ7ZNHOH",
        "harvestedBlocks": 0,
        "balance": 500000,
        "importance": 0,
        "vestedBalance": 500000,
        "publicKey": "eef56715bf3e7fe2d3010765382a132117dadefffe9673fd44828c8b1dc7894c",
        "label": null,
        "multisigInfo": {}
      }
    ],
    "cosignatoryOf": [],
    "status": "LOCKED",
    "remoteStatus": "INACTIVE"
  },
  "account": {
    "address": "NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA",
    "harvestedBlocks": 0,
    "balance": 142441827408844,
    "importance": 0.014040731525229354,
    "vestedBalance": 127834701349152,
    "publicKey": "fbae41931de6a0cc25153781321f3de0806c7ba9a191474bb9a838118c8de4d3",
    "label": null,
    "multisigInfo": {
      "cosignatoriesCount": 3,
      "minCosignatories": 2
    }
  }
}

...見づらい...(そういえばZaifマルチシグアカウントだったからこんなに多いんだ...ちょっと自分のnemlogアドレスに変えます)
※JSONという形式のデータは整形してくれるツールが探せば出てくるので、それを通します。

{
  "meta": {
    "cosignatories": [],
    "cosignatoryOf": [],
    "status": "LOCKED",
    "remoteStatus": "INACTIVE"
  },
  "account": {
    "address": "NBM6KPWGAWX5EYUYL5NJ5VQA2FEYGFHFLHG4PISY",
    "harvestedBlocks": 0,
    "balance": 421348200,
    "importance": 0,
    "vestedBalance": 421110790,
    "publicKey": "0acb0b881d3733100d85f1d600470ab6fc810d7d3c39ab859be23b665cd197e5",
    "label": null,
    "multisigInfo": {}
  }
}

👏👏👏👏👏
では"account"の部分を見てみます。

"address": "NBM6KPWGAWX5EYUYL5NJ5VQA2FEYGFHFLHG4PISY", // ①アドレス
"harvestedBlocks": 0, // ②ハーベストしたブロック数
"balance": 421348200, // ③残高421.3482XEM ※10万分の1(小数点6ケタ)
"importance": 0, // ④重要度0
"vestedBalance": 421110790, // ⑤既得残高
"publicKey": "0acb0b881d3733100d85f1d600470ab6fc810d7d3c39ab859be23b665cd197e5", // ⑤公開鍵
"label": null, // ⑥ラベルなし
"multisigInfo": {} // ⑦マルチシグなし

見ていただくと分かるように秘密鍵は含まれていません。
(当然ですが)

【終わりに】
Google Apps Script には決められた時間にプログラムを実行してくれるタイマーのようなツールがあります。
それを使うことにより、前述したコードを使えば、一定時間ごとに設定したNEMの"生"データが指定したメールアドレスに届きます。

(今はもう止めましたが、コレとかタイマーで)
チータラの精霊

以前にゆーたろさんがGoogle Apps Script言語を使ってスプレッドシートに複数のNEMアドレスの残高を出力する関数ツールを作った記事を書いていました。
GoogleスプレッドシートでNEMアドレスの残高がわかる独自関数を作ってみた

Google Apps Script(GAS)はPCブラウザだけで動かせるのでNEMをちょっといじくってみるにはとても入りやすい言語だと思います。

(ただ送金や署名についてはライブラリがなく、つまずいています..どなたか...)

急ぎ足でしたが、是非、エンジニア以外の皆さんにも読んでもらえたなら幸いです。