12
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Nowで始める、ナウでヤングなLINEBot生活(Node.js編)

Last updated at Posted at 2018-09-29

LINE BOOT AWARDSの締め切りも近いので、NowというPaaSを使ったLINE Botのデプロイ方法について書こうと思います。

NOWとは?

超絶簡単に言うとHerokuの様にWEBアプリの公開を簡単にしてくれるサービスです。
シンプルかつ高速で、gitなどのソース管理システムを使うことなくとても簡単に使用することができます。
Node.jsのデプロイが基本ですが、Dockerも使うことができるので、いろんなことができます。

細かい話はこちらの記事を
https://qiita.com/nkzawa/items/8bf62549f79ebbcaafd8
https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50

今回デプロイするもの

アイデアボット

スクリーンショット_2018_09_29_23_26.jpg

こんな感じでメッセージの中にアイデアという言葉があれば、某最近最終回を迎えた朝ドラ主題歌の歌詞を返してくれるBotをビルドします。

Botの準備

アイデアボットはline-bot-sdk-nodejsを使ってBotの開発をします。
npmで必要なライブラリをインストール

npm install @line/bot-sdk
npm install express

そんでもって、サンプルコードをもとにコードを書きます

index.js
'use strict';

const line = require('@line/bot-sdk');
const express = require('express');

// create LINE SDK config from env variables
const config = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
};

// create LINE SDK client
const client = new line.Client(config);

// create Express app
// about Express itself: https://expressjs.com/
const app = express();

// register a webhook handler with middleware
// about the middleware, please refer to doc
app.post('/callback', line.middleware(config), (req, res) => {
  Promise
    .all(req.body.events.map(handleEvent))
    .then((result) => res.json(result))
    .catch((err) => {
      console.error(err);
      res.status(500).end();
    });
});

// event handler
function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    // ignore non-text-message event
    return Promise.resolve(null);
  }
  //メッセージの内容にアイデアという文字があれば歌詞を返す
  if(event.message.text.match("アイデア")){
    const echo =  {type: 'text', text: "つづく日々の道の先を塞ぐ影にアイデアを~"};
    // use reply API
    return client.replyMessage(event.replyToken, echo);
  }
}

// listen on port
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`listening on ${port}`);
});

とりあえず、これでアイデアボットは完成です。

Nowの使いかた

ここからNowを使ってのデプロイです

インストール

とりあえず、公式からデスクトップアプリをダウンロード
https://zeit.co/download

or

npmを使用してインストール

npm i -g now

package.jsonにスタートスクリプトを記述

package.jsonにプログラムをスタートさせるコマンドを記載します

package.json
"scripts": {
    "start": "node index.js"
  },

通常のアプリならあとは

now

コマンドだけでデプロイされるのですが、Botをデプロイするのであれば、もう少し追加の設定が必要です。

aliasの設定

nowではデプロイするたびに、[https://アプリ名-ランダムな文字列.now.sh]というURLが与えられます。
LINEBotでは、WebhookURLを登録する必要があるので、デプロイされるたびにURLが変わると、面倒なのでaliasを設定します。
こちらもpackage.jsonに追加してください。

package.json
"now": {
    "alias": "〇〇〇〇"
  },

〇〇〇〇には自分の好きな文字を入れてください
この状態だと、デプロイして

now alias

コマンドを実行すると、[https://〇〇〇〇.now.sh]というURLでアクセスすることができるようになります。

ということで、ダッシュボードにalias実行後のURLを先に載せちゃってください

LINE_Developers.jpg

環境変数を入れる

今回のアイデアボットは環境変数からアクセストークンや、チャンネルシークレットの情報を取ってきているため、デプロイする際もその情報を入れてあげなければいけないです。

// create LINE SDK config from env variables
const config = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
};

ハードコーディングする手もありますが、Nowのフリープランではコードが見えてしまうので
トークンなど秘密の情報は環境変数ぶち込みます

そのためにはSecretsというものを使います。
https://zeit.co/docs/getting-started/secrets

ターミナル上で

now secret add line-token YOUR_CHANNEL_ACCESS_TOKEN
now secret add line-secret YOUR_CHANNEL_SECRET

YOUR_CHANNEL_ACCESS_TOKEN, YOUR_CHANNEL_SECRETには自分のBotの情報を入れてください。

そして、Secretsの情報が、どの環境変数に紐づいているのかをpackage.jsonに記述します。
aliasを追加するときに作ったnowの所に追加してください。

package.json
 "now": {
    "alias": "〇〇〇〇",
    "env": {
      "CHANNEL_ACCESS_TOKEN": "@line-token",
      "CHANNEL_SECRET": "@line-secret"
    }

これでデプロイの際に環境変数にトークンなどの情報が入ります。

デプロイ

あとはnowをして

now

こんな感じで、Successが出たら完了!
1__ubuntu_s-mang-glk2_____bash_.jpg

aliasの反映

このままだと、https://〇〇〇〇.now.shではアクセスできないので、aliasの内容を反映させます。

now alias

このコマンドを実行したら

aliasに設定した内容のURLに紐づいてくれます。

1__ubuntu_s-mang-glk2_____bash_.jpg

これで完成です!

Botに「アイデアを考えるんや」みたいな感じのことを言うと返事がくると思います!

注意点

1つ注意ですが、Herokuと同じ様にNowもインスタンスに一定時間アクセスがないとsleepしてしまうため、もしサービスとかで使い場合はcronとかで一定時間で起こしてあげてください。

2018/10/25追記)
NowでOSSプランでもインスタンスをスリープさせない方法があるので、それについての記事を書きました
Nowの無料プランでもインスタンスをスリープさせない方法

最後に

Nowを使うと簡単にBotのデプロイができるようになります。

シンプルで早くて簡単なNowでナウでヤングなBot生活を楽しんでください!

時間があれば、Dockerfileを使ったデプロイとClovaスキルのデプロイ記事を書こうと思います。

12
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?