Help us understand the problem. What is going on with this article?

Now.shを使って15分でLINE Botをデプロイする

More than 1 year has passed since last update.

TL;DR

わずか300円でIoTボタンを作る方法」の続きだよ。のんびりしていたら既にバックエンドまで実装済みの記事「通知が飛ぶIoTボタンを作ってみた」があがってるけど、気にしないで続きを書くよ。今回はあまりIoTボタンとは関係ない内容なので、先に伝えたいことを書くよ。

  • Now.shはNode.jsが今すぐ簡単に使える素敵なPaaSだよ
  • 標準でHTTPSが使えるのでLINE Bot開発に最適だ
  • LINE Botをデプロイするには、SECRETSFROZENを考慮しよう

ちなみに先のIoTボタンからLINEに通知したいだけならBotを使わずに、LINE Notifyを使った方が簡単だよ。

準備 (LINE Messaging API利用登録)

まずはLINE Messaging APIの利用登録をするよ。LINE記事「LINE BOTの作り方を世界一わかりやすく解説(1)【アカウント準備編】」や、「わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開」がわかりやすい!
これらの記事の手順にしたがってChannel SecretChannel Access Tokenを入手しよう。

Now.sh

Now.shはNode.jsのアプリをとても簡単な動かせるPaaSだよ。アカウント作成からドメイン取得まですべて簡単なCLIコマンドでできる尖がったサービスだ。利用にあたってユーザ情報登録やトークン取得も不要で爆速だ。ただし、無料で使えるOSSプランの場合、下記2点は要注意だ。

  • ソースコードは全て公開されるよ。
  • データの永続化の仕組みは提供しないよ。

Qiitaにも紹介記事「Now でクラウドの複雑さから解放されよう、今すぐに」があるので見てみよう。

Now.shでLINE Bot

事前準備

Now.shで使えるNode.jsの最新バージョンは8.0.0だ(2017/10月現在)。Node.jsのインストール方法は省略!Now.shのCLIはnpmでインストールできるよ。

$ npm install -g now

Now.shはpackage.jsonがあるディレクトリをPaaSにデプロイするよ。package.jsonを作成し、今回のアプリに必要なパッケージ(LINE SDKとExpress関連)もインストールだ。

$ mkdir myapp
$ cd myapp
$ npm -y init
$ npm install @line/bot-sdk express body-parser

アプリを起動するための設定をpackage.jsonに追加するよ。今回はアプリのファイル名をindex.jsにするよ。

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

コピペ&デプロイ

LINE Botの本体index.jsにはとりあえず公式のサンプルEcho botをコピペするよ。

index.js
'use strict';

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

const config = { 
    channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
    channelSecret: process.env.CHANNEL_SECRET,
};

const client = new line.Client(config);
const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    Promise
        .all(req.body.events.map(handleEvent))
        .then((result) => res.json(result));
});

function handleEvent(event) {
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }   
    const echo = { type: 'text', text: event.message.text };

    return client.replyMessage(event.replyToken, echo);
}

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

あとは下記のコマンドでデプロイするだけだ。初回はメールアドレスの入力を求められるので、有効なメールアドレスを入力するよ。

$ now
> No existing credentials found. Please log in:
> We sent an email to XXX@gmail.com. Please follow the steps provided
  inside it and make sure the security code matches Suspicious Ant.

こんな感じのメールが届くのでリンクをクリックすれば認証は完了だ。

mail
Hi!

Login attempt from XXXX, Japan
Verify that the provided security code matches Suspicious Ant before proceeding. 
Then please follow this link to verify your email address.

再びnowコマンドを実行するとアプリがデプロイされるよ。

$ now
> Deploying ~/work/Now/linebot under XXX@gmail.com
> Using Node.js 8.4.0 (default)
> Ready! https://xxx-abcyezicoh.now.sh [1s]
> Synced 3 files (10.02KB) [14s]
> Initializing…
> Building
...
> Deployment complete!

コマンド実行時に画面に表示されたURLでアプリにアクセスできるよ。LINE BotはSSL証明書が必要だけど、Now.shはHTTPSで提供されるから問題なしだ。ポート番号はコード中では3000番で指定したけど、デプロイ後は80番でアクセスできるよ。

Botのために

URL固定

アプリのURLはデプロイのたびに変更されるんだ。LINE botのwebhookに指定するためにはデプロイバージョンに関わらず固定化されたURLを使いたいよね。Now.shではURLに好きなAlias(下の例ではhttps://myapp.now.sh)をつけられるよ。

 $ now alias set https://xxx-abcyezicoh.now.sh myapp

他にもpackage.jsonaliasの設定をする方法もあるよ。

アクセストークンなど秘密の情報

Now.shの無料プランではソースコードはすべて公開されてしまうよ。だからアクセストークンなどの秘密の情報をコードに直書きすることは絶対ダメだね。
これを解決するためにNow.shではSecretsを提供しているよ。秘密の情報をNow.shにSecretsとして保存しておき、Secretsと環境変数を対応づけてデプロイできるんだ。

$ now secret add line-toke XXXX-XXXX-XXXX
$ now secret add line-secret YYYY-YYYY-YYYY
$ now -e CHANNEL_ACCESS_TOKEN=@line-token -e CHANNEL_SECRET=@line-secret

上の例では、秘密の値(XXXX-XXXX-XXXX)をline-tokenとしてSecretsに登録し、これをアプリ内から環境変数CHANNEL_ACCESS_TOKENとしてアクセスできるようにしているよ。

Keep-Alive

Now.shは、一定期間アクセスがないとFROZEN状態に入ってしまうよ。FROZEN状態でリクエストが来ると、ふたたびREADY状態になりリクエストを受け付けるようになるけど、FROZEN状態時に来たリクエストは処理できないんだ。
だからFROZEN状態にならないように定期的にKeepAliveリクエストを送信しないといけないよ。
cron.dで定期的にcurlを叩いてもいいし、IFTTTのDate&TimerWebhookを利用しても良いね。

完成

これでLINE Botが完成だよ:raised_hands_tone2: 本題だった「IoTボタンからのリクエストに応じてBotでメッセージを通知」には、先ほどのEcho Botサンプルにちょっと手を加えればOKだ。

button-line.gif

ソースコードはGitHubに上げておくよ。LINEグループに参加した際にグループIDを記憶し、WebAPIにリクエストが来たら記憶したグループID宛にメッセージを投げているよ。詳しい説明はコード中にコメントで書いておくよ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away