ビットコイン（BTC）の現在価格を教えてくれるLINE Botをつくってみた！

#はじめに
皆さんこんにちは。
ゴールデンウィークも終わり、日常が戻ってきましたね。
さて、今回も仮想通貨の価格を教えてくれるアプリケーションを作ってみました！

きっかけは、LINEで友人と仮想通貨についての会話しているとき、
「今、あの通貨いくらなんだっけ？」みたいな時がありまして、LINEの中で知れたらいいなというところからでした。
という事で、今回はLINEBotとAPIを利用して、Bitcoin価格を教えてくれる、LINEBotを作成しました。
ただただ、Bitcoinの価格を教えてくれるものですが何かの役に立ってくれればうれしいです！

#概要
LINEのトークで「いまいくら？」と打ち込むとCoindeskの公開APIを参照しBitcoinの現在価格を返答してくれます。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1390350/0ee31779-f8e8-848a-2f1b-fab82a3aa263.gif)

#環境
Node.js	15.13.0
axios	0.21.1

#今回使用したAPI
Coindesk API (https://api.coindesk.com/v1/bpi/currentprice.json)

#処理の詳細
処理の全文は以下の通りです。

```btc_price.js
// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');

// ローカル（自分のPC）でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;

// Messaging APIで利用するクレデンシャル（秘匿情報）です。
const config = {
    channelSecret: 'チャンネルシークレット',
    channelAccessToken: 'チャンネルアクセストークン'
};



// ########## ▼▼▼ API取得 ▼▼▼ ##########
const sampleFunction = async (event) => {
    // ユーザーメッセージが「いまいくら」かどうか
    if (event.message.text !== 'いまいくら？') {
        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: '「いまいくら？」と話しかけてね'
        });
    } else {
        // 「リプライ」を使って先に返事しておきます
        await client.replyMessage(event.replyToken, {
            type: 'text',
            text: '調べています……'
        });
        
        let pushText = '';
        try {
            // axiosでBTCPriceのAPIを叩きます（少し時間がかかる・ブロッキングする）
            const res = await axios.get('https://api.coindesk.com/v1/bpi/currentprice.json');
            // 取得できたBTCのUSD価格を抜き出す
            const rates = res.data.bpi.USD.rate_float;
        
            pushText = `BTC価格は${rates}USDです！`;
        } catch (error) {
            pushText = '検索中にエラーが発生しました。';
            // APIからエラーが返ってきたらターミナルに表示する
            console.error(error);
        }

        // 「プッシュ」で後からユーザーに通知します
        return client.pushMessage(event.source.userId, {
            type: 'text',
            text: pushText,
        });
    }
};
// ########## ▲▲▲ API取得 ▲▲▲ ##########


// LINE SDKを初期化します
const client = new line.Client(config);

// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
    // 受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視します
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }
    // サンプル関数を実行します
    return sampleFunction(event);
}


// expressを初期化します
const app = express();

// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {
  
  // 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
  if (req.body.events.length === 0) {
    res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します（なくてもよい）
    console.log('検証イベントを受信しました！'); // ターミナルに表示します
    return; // これより下は実行されません
  } else {
    // 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
    console.log('受信しました:', req.body.events);
  }

  // あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
  // 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
  Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

// 最初に決めたポート番号でサーバーをPC内だけに公開します
// （環境によってはローカルネットワーク内にも公開されます）
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
```

#API部分詳細
まず、はじめにユーザーからのメッセージが「いまいくら？」と合致しているか判定しています。
あっている場合は、「調べています……」と返し、APIを叩きに行きます。
異なる場合は、「「いまいくら？」と話しかけてね」と返答します。

```btc_price.js
const sampleFunction = async (event) => {
    // ユーザーメッセージが「いまいくら」かどうか
    if (event.message.text !== 'いまいくら？') {
        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: '「いまいくら？」と話しかけてね'
        });
    } else {
        // 「リプライ」を使って先に返事しておきます
        await client.replyMessage(event.replyToken, {
            type: 'text',
            text: '調べています……'
        });
```

APIの部分は下記のようにしています。
今回のAPIでは、USD以外にもGBP、EURも同時に拾ってくるものなので、USDのrate_floatを指定して表示させています。

```btc_price.js
        let pushText = '';
        try {
            // axiosでBTCPriceのAPIを叩きます（少し時間がかかる・ブロッキングする）
            const res = await axios.get('https://api.coindesk.com/v1/bpi/currentprice.json');
            // 取得できたBTCのUSD価格を抜き出す
            const rates = res.data.bpi.USD.rate_float;
        
            pushText = `BTC価格は${rates}USDです！`;
        } catch (error) {
            pushText = '検索中にエラーが発生しました。';
            // APIからエラーが返ってきたらターミナルに表示する
            console.error(error);
        }

        // 「プッシュ」で後からユーザーに通知します
        return client.pushMessage(event.source.userId, {
            type: 'text',
            text: pushText,
        });

```

#終わりに
今回は、単純にBitcoinの現在価格を出してくれるものでした。
当初の野望は、仮想通貨名を入れるとその通貨の”現在価格”、”24H価格比較”、"vol"などの情報を出してくれたり、テクニカル的に買いか売りかを判断してくれたらいいなというものでした。
今後も、ちょこちょこ改良を加えていこうと思います。