TL;DR
「わずか300円でIoTボタンを作る方法」の続きだよ。のんびりしていたら既にバックエンドまで実装済みの記事「通知が飛ぶIoTボタンを作ってみた」があがってるけど、気にしないで続きを書くよ。今回はあまりIoTボタンとは関係ない内容なので、先に伝えたいことを書くよ。
- Now.shはNode.jsが今すぐ簡単に使える素敵なPaaSだよ
- 標準でHTTPSが使えるのでLINE Bot開発に最適だ
- LINE Botをデプロイするには、
SECRETS
やFROZEN
を考慮しよう
ちなみに先のIoTボタンからLINEに通知したいだけならBotを使わずに、LINE Notifyを使った方が簡単だよ。
準備 (LINE Messaging API利用登録)
まずはLINE Messaging APIの利用登録をするよ。LINE記事「LINE BOTの作り方を世界一わかりやすく解説(1)【アカウント準備編】」や、「わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開」がわかりやすい!
これらの記事の手順にしたがってChannel Secret
とChannel 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
にするよ。
〜略〜
"scripts": {
"start": "node index.js",
}
コピペ&デプロイ
LINE Botの本体index.js
にはとりあえず公式のサンプルEcho botをコピペするよ。
'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.
こんな感じのメールが届くのでリンクをクリックすれば認証は完了だ。
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.json
にaliasの設定をする方法もあるよ。
アクセストークンなど秘密の情報
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&Timer
とWebhook
を利用しても良いね。
完成
これでLINE Botが完成だよ 本題だった「IoTボタンからのリクエストに応じてBotでメッセージを通知」には、先ほどのEcho Botサンプルにちょっと手を加えればOKだ。
ソースコードはGitHubに上げておくよ。LINEグループに参加した際にグループIDを記憶し、WebAPIにリクエストが来たら記憶したグループID宛にメッセージを投げているよ。詳しい説明はコード中にコメントで書いておくよ。