花粉症LINE Botのデータをnode.jsを使ってFirebaseに出し入れする（花粉カレンダー作成③）

##概要

耳鼻咽喉科の開業医をしています。

今回、以前作成したLINE Botのデータをnode.jsを使ってFirebaseに出し入れできるようにしました。


以前作ったLINE Botの記事はこちら　
[花粉症の重症度を判定し自分に合う市販薬を教えてくれるLINE Botの作成](https://qiita.com/doikatsuyuki/items/767ebd22a3e6d5d39d33)

##作成
**1.Firebaseno秘密鍵を生成し準備**
こちらを参考にします。
[サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup#add_firebase_to_your_app)

歯車マークからプロジェクトの設定を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/b23a53ee-e880-857d-4e22-32ec674b6c3c.png)


サービスアカウントに移動し下部にある「新しい秘密鍵の生成」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/f050a9e4-28ce-7baa-c359-3e1a22379c00.png)

次に表示される「キーを生成」ボタンを押します。
すると、すぐに生成されてJSONファイルがダウンロードされます。この段階では、長めの文字数のファイル名.jsonになっています。
ダウンロードしたJSONファイルをserviceAccountKey.jsonに名前を変えて配置します。

Realtime DatabaseのページでdatabaseURLを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/9b9ee06a-491e-d072-ceab-723b2dc65a51.png)

Firebaseコンソールにある、Realtime Databaseの中にあるデータが確認できるページでdatabaseURLを確認します。赤枠のところをメモしておきます。

**2.Firebaseにデータを記録できるようにする**

Firebase関連のインストール

```
npm i firebase-admin
```
[花粉症の重症度を判定し自分に合う市販薬を教えてくれるLINE Botの作成](https://qiita.com/doikatsuyuki/items/767ebd22a3e6d5d39d33)で作成したプログラムに追記していきます。

```js

// Firebase /////////////////////////////////

var admin = require("firebase-admin");

// 1. サービスアカウント鍵を生成しserviceAccountKey.jsonにリネーム
var serviceAccount = require("./serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  // 2. Realtime DatabaseのページでdatabaseURLを確認して反映
  databaseURL: "https://*************.com"
});

var db = admin.database();
var ref = db.ref("protoout/studio");
var usersRef = ref.child("messageList");

// LINE /////////////////////////////////////

const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: '********************',
    channelAccessToken: '***********************'
};

const app = express();

// app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);

    //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
    if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
        res.send('Hello LINE BOT!(POST)');
        console.log('疎通確認用');
        return; 
    }
  
  // Firebaseにも応答を記録 push
  usersRef.push({
    events:req.body.events
  });  
  
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));  
  
});


```
**3.Firebaseからデータを受信できるようにする**

以下のコードを追記します。

```js
// Firebase Listからデータを受信 child added on
var refMessageList = db.ref("protoout/studio/messageList");
refMessageList.on('child_added', function (snapshot) {
    //postbackの場合
    if (snapshot.val().events[0].type == 'postback') {
      console.log('child_added', snapshot.val().events[0].postback.data)
      userpostback = snapshot.val().events[0].postback.data;
    }
    //messageの場合
    if (snapshot.val().events[0].type == 'message') {
      //message-位置情報の場合
      if (snapshot.val().events[0].message.type == 'location') {
        userlat = snapshot.val().events[0].message.latitude;
        userlong = snapshot.val().events[0].message.longitude;
        getweather();//気象情報をreturnする関数
      }     
    }    
   })
```

**4.データベースを確認する**
LINEのデータが記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/9fac6d05-d9fa-b7ae-f777-1e0c0f83e19d.png)



##考察
LINE BotのデータをFirebaseに出し入れすることができました。
今度はFirebaseのデータをWEBカレンダーに表示できるようにしたいと思います。