スマートフォンアプリでのプッシュ通知と言っても様々な形態が出てきました。Webサイトプッシュも最近出てきていますし、Slackのようなチャット、そして今回紹介するLINEやMessengerなども通知先として注目されています。
今回は日本を代表するメッセンジャーアプリであるLINE向けにmBaaSのスクリプトから通知を送る方法を紹介します。若干実験的な部分もありますのでご注意ください。
LINE Developerへ申し込む
まずAPIキーの取得を行う必要があります。特に注意して欲しいのがプランです。フリープランは月額0円ですが、Push APIが提供されていません。これは有料のベーシックプランでも同じです。今回は任意のタイミングでメッセージを送る(通知する)のでDeveloper Trialを申請します。
登録後、WebHookで通知するURLを登録します。この時にmBaaSのURLが登録できれば良いのですが、現状では認証無しでスクリプト呼び出しができないので、今回はHerokuで簡易的なサーバを立てています。ソースコードは にアップしてありますのでご覧ください。今回は単に送り元が知りたいだけなので簡単なコードです。
# app.rb require 'sinatra' require 'logger' get '/' do 'Hello' end post '/' do $stdout.sync = true puts request.body.read '' end
そしてWebHook URLの確認を行います。ちゃんとデプロイできていれば問題ないと思います。
なお、自動返信機能は無効にしておいてください。これが有効になっているとうまくWebHookが来ないようです。
送り先を知る
セットアップが終わったらQRコードを使ってボットアカウントを登録します。そしてメッセージを送ります。これはWebHook URLを登録した直後だと呼ばれないようです。数時間かかるかも知れません。
無事メッセージが送られてくると、下記のようなメッセージがログに残ります。
{ "events": [ { "message": { "id": "6378942634821", "text": "こんにちは", "type": "text" }, "replyToken": "34b...423", "source": { "type": "user", "userId": "Uf86fe748ec8efe48b72507852ec1d680" }, "timestamp": 1499905366192, "type": "message" } ] }
ここで知りたいのはuserIdになります。
メッセージを送信する
では実際にメッセージを送信してみます。LINEのNode.jsサンプルコードでは専用のライブラリを使うようになっていますが、mBaaSではインストールできないので、SuperAgentを使って書き換えます。送信するのに必要な情報はすべて外部から与えるようにします。この内容をapp.jsとしてmBaaSのスクリプトに登録します。
let request = require('superagent'); module.exports = function(req, res) { let channel_token = req.body.token; request .post('https://api.line.me/v2/bot/message/push') .send({ "to": req.body.to, "messages":[{ "type":"text", "text": req.body.message }] }) .set('Authorization', `Bearer ${channel_token}`) .set('Accept', 'application/json') .end(function(err, res){ if (err || !res.ok) { req.send(err); } else { req.send('Sent message!') } }); }
そして外部からこのスクリプトを呼び出します。LINEのチャンネルトークン、mBaaSのアプリケーションキーとクライアントキーはそれぞれ読み替えてください。送り先も本来は固定ではなく可変であるべきです。
const NCMB = require('ncmb'); const to = 'Uf86fe748ec8efe48b72507852ec1d680'; const token = 'obuy...lFU='; const message = 'こんにちは。これはNCMBからのメッセージです 🕺'; const application_key = 'b854...600'; const client_key = '41c...a8d'; let ncmb = new NCMB(application_key, client_key); ncmb.Script .data({ 'to': to, 'token': token, 'message': message }) .exec('POST', 'app.js') .then(function(res){ console.log('sent!') }) .catch(function(err){ // エラー処理 });
このスクリプトを実行すると通知がきます。
そしてLINEを開けば、画面にメッセージが届いています。
現在はmBaaSをWebHooks先として登録できませんので、メッセージの受け取りを感知することができません。つまり返信ができませんのでご注意ください(その点があくまで実験的ということです)。
LINEではテキストだけでなく画像やリンク、スタンプなども送れます。詳しくはLINE API Referenceをご覧ください。