【Line Notify】1時間で作る仮想通貨の『高騰/下落』通知BOT【Google Apps Script】

## 概要
掲題の通り。 即席で作れました。
## 背景
- 目をつけている通貨のチャート【*/jpy】を、取引の為の判断材料としてつぶさに知りたい。
 - 国内取引所のネイティブアプリには(通知機能が)ある物もあるが・・・
     - **極端に価格が安い様なアルトコインは取り扱っていない傾向にある。**~~億るためには枚数が必要~~ 
- 四六時中スマホにかじりついているのもしんどい
 - **高騰** or **下落** した時だけスマホに通知が来ればｲｲ!(ﾟ∀ﾟ )

## 作るにあたって
以下が必要

 - **レート取得API**
 - **通知用バックエンドサービス**
 - **通知受信用モバイルクライアントアプリ**

## 選定
#### レート取得API
世界中の通貨レートを取り扱っている[**coinmarketcap**](https://coinmarketcap.com/)の公開APIを利用しました。
https://coinmarketcap.com/api/
response(json)には、価格の他に**1h/24h/7dにおける【高騰/下落】パーセンテージ**といった情報も含まれており、今回の目標であるサービスは、それらを受け取った時点で既に6割方完成していたといっても過言ではありませんでした。

#### 通知用バックエンドサービス
[**Google Apps Script**](https://developers.google.com/apps-script/)のトリガー機能を利用して構築しました。  
mBaasの利用も検討しましたが、今回は更なる手軽さを重視してgasを採用しました
~~すぐにでも作って使いたかったし~~

#### 通知受信用モバイルクライアントアプリ
[**LINE & LINE Notify**](https://notify-bot.line.me/ja/)を利用しました。こちらも手軽さを重視。
~~「そもそも自前で作らない」という事なので、この項目名は不適切ですかね~~

## 作ってみる
### ①LINE BOT作成のため、Notifyトークンを発行
https://notify-bot.line.me/ja/
 1. LINEのアカウント情報を入力しログインをする。
 2. ヘッダ右部のメニューの「マイページ」を押下。
 3. 「トークンを発行する」を押下。通知対象の部屋、若しくはユーザーを選択する。
 4. トークンが発行されるので控える(通知用のバックエンドスクリプトで利用する)。

### ②通知用のGoogle Apps Scriptを作成
google drive → 新規 → その他 → Google App Script
から新規スクリプトを作成。
今回はこんな感じのスクリプト。

```js
function main() {
  const NOTIFY_LINE_TOKEN = 'your line notify token';

  const NOTIFY_BORDER_PRICE_UP = 100;
  const NOTIFY_BORDER_PRICE_DOWN = -90;

  const NOTIFY_COIN_NAME = 'bitcoin'; // from https://api.coinmarketcap.com/v1/ticker/ `id`


  const coinData = getCoinData(NOTIFY_COIN_NAME);
  const coinRate = '1jpy : ' + (getJpyRate() * parseFloat(coinData.price_usd)) + NOTIFY_COIN_NAME;

  const isUp = isPriceUp({
    percentage : coinData.percent_change_1h,
    border : NOTIFY_BORDER_PRICE_UP
  });
  const isDown = isPriceDown({
    percentage : coinData.percent_change_1h,
    border : NOTIFY_BORDER_PRICE_DOWN
  });

  var upOrDown = '';
  if(isUp) {
    upOrDown += '高騰'
  }
  if(isDown) {
    upOrDown += '下落'
  }

  if(upOrDown) {
    sendMessage({
      lineToken : NOTIFY_LINE_TOKEN,
      message : NOTIFY_COIN_NAME + 'が' + upOrDown + 'しました\r\n' + coinRate
    });
  }
}


function isPriceUp(props) {
  return parseFloat(props.percentage) >= parseFloat(props.border);
}


function isPriceDown(props) {
  return parseFloat(props.percentage) <= parseFloat(props.border);
}


function sendMessage(props) {
   UrlFetchApp.fetch('https://notify-api.line.me/api/notify', {
     'method'  : 'post',
     'payload' : 'message=' + props.message,
     'headers' : {'Authorization' : 'Bearer '+ props.lineToken}
   });
}


function getCoinData(coinName) {
  const apiUrl = 'https://api.coinmarketcap.com/v1/ticker/';

  const result = UrlFetchApp
          .fetch(apiUrl + coinName)
          .getContentText();
  return JSON.parse(result)[0];
}


function getJpyRate() {
  const rate = 110; //暫定 110円固定
  return rate;
}
```
API取得からLINEへの通知まで、[UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)を利用してあっけなく完成しました。  
注意点としては、coinmarketcapAPIのresponseにはjpyのレート情報が存在しないため、(対jpyのレートを通知するなら)**usdの価格から別途jpyでのレートを算出する必要があります。**
　→今回は想定値で1usd/110jpy固定としました。~~こっちもちゃんと外部から取得した方がいいんだろうけど・・・~~

### ③作成したGoogle Apps Scriptにトリガーを設定する
②で作成したスクリプトのプロジェクトにて、トリガー(時計マーク)のアイコンを押下し、通知の周期を設定。
![トリガ.PNG](https://qiita-image-store.s3.amazonaws.com/0/119363/f9b958c5-cdbc-ae57-b339-58be4c66a838.png)
今回は「つぶさに」知りたいため**分周期**で**5分**に設定。

　
以上で完成です!
試しにLINE通知を待ってみます。すると・・・
![Screenshot_2018-01-20-00-04-24.png](https://qiita-image-store.s3.amazonaws.com/0/119363/60cdf7d8-34de-ce58-ba44-c66a841ae14c.png)
通知が無事届きましたね!~~いきなり下落の通知ですが~~

今回設定した通貨は[StrongHands](http://stronghands.github.io/)でした。
[coinmarketcapAPI](https://api.coinmarketcap.com/v1/ticker/)における取り扱い通貨IDを、スクリプトの定数に設定し直せばどの通貨でも自由にBOT通知する事が出来ます。

```js
const NOTIFY_COIN_NAME = 'stronghands';
```

## 作ってみて
欲しい!と思い立ってから1時間弱で完成させられました。
一昔前なら、たったこれだけのソリューションでも、今回の比では無い程のコストがかかったと思うと、技術の進歩を感じずにはいられませんでした。~~LINEとgoogleは神~~

gasで作ったので、現状はあまりシステム的な拡張性がありませんが、コアな処理部分は非常にシンプルなので、今後利用する中で新たな気づきがあれば、冒頭で触れたmBaas化や、ネイティブアプリ化方面に育てていっても面白いのかな、と思います。~~まぁそれ以前に日本の取引所がもっとアルトコインの取り扱い増やしてくれればいいんだけどﾅ～~~

上にも貼っつけましたが、ソースはgithubにもあげております。何かの参考になれば幸いです。
https://github.com/nishiurahiroki/gas-coin-notify

長々とお付き合い頂きありがとうございました。