LINE Beaconが当たったので簡単な実装をしてみた
経緯
何を作ったか
Beaconに近づくとLINEで教えてくれるBotです。簡単すぎてスミマセン。
画面
処理の流れ
次のようなJSONが送られてくるのは前回紹介しました。
{ "events": [ { "type": "beacon", "replyToken": "e0f475d5c49249b48b1bb37f7406d4cc", "source": { "userId": "*********************************", "type": "user" }, "timestamp": 1536757232074, "beacon": { "hwid": "**********", "dm": "", "type": "enter" } } ] }
ここのeventsの要素のtypeが'beacon'になっているとbeaconのイベントということで。実装は次のような感じでできますね。
if (events[0].type === 'beacon') { if (events[0].beacon.type === 'enter') { // enter時の処理. } else if (events[0].beacon.type === 'leave') { // leave時の処理. } }
ソースコード
どんな展開が見込めるか
[ Beaconを持ち歩く前提で ]
待ち合わせする人にこのBotに友達になってもらって、近づいたらお知らせすることにより、待ち合わせがスムーズに。
[ Beaconを固定で設置する前提で ]
家に近づいたらスマートホーム関連のAPIを叩く。(電気つける/テレビつけるetc)
やろうとしたけどできなかったこと
[ Beaconを持ち歩く前提で ]
このBotを飲み会トークルームに招待して、飲み会に遅れる場合、自分が店に近づいたら予めビールを頼んでおいてもらいたいw
できなかった理由は、トークルームでのイベント発火です。まぁよく考えたら
・友達登録もしていないトークルーム上のアカウントにBeaconイベントを発火させる
・トークルーム上の誰に近づいたかそもそも判別できない
など、セキュリティー的にもWebhook API的にも無理な感じでした。
GCPのCloud FunctionsでPuppeteerを動かす
経緯
ちょっと前に(2018/08)、GCPがNode8対応したとのことでPuppeteerを動かす記事が載っていましたので試してみました。記事によると以前のGCPでPuppeteerを動かそうと思ったら、クラウドにしてはそれなりにヘビーな環境が必要になっていたようです。
まぁこれはAWSでも同じことが言えますね。果たしてGCPはいかに。
Cloud Functionsの課金
初めて使うということと、お試しであるとうことで、おいくら万円?ってのが、まずありますよね。ざっくりまとめると次のとおり。
- 呼び出し : 0.0000004 [$/回]
- コンピューティング(メモリ) : 0.0000025 [$/GB秒]
- コンピューティング(CPU) : 0.0000100 [$/GHz秒]
- データ転送 : 上り無料、下りは 0.12 [$/GB]
- ローカルディスク : 使わないつもりなので無視
ただ、無料階層というものがあり
・200万回の呼び出し
・メモリ 400,000 [GB秒]
・CPU 200,000 [GHz秒]
・データ転送下り~5GB
が付いてますので、実質無料で試せそうです。
無料階層を使用する場合でも、有効な請求先アカウントが必要です
Pricing | Cloud Functions Documentation | Google Cloud
でもまぁ、登録は必要です。
Functionを作成します
関数を作成
関数の詳細を入力します
関数の名前を付けて、メモリ容量を選択して(公式では1GBを推奨)、トリガーはHTTP。今回はお手軽お試しということで、ソースコードはインラインエディタを選択。ランタイムはNode.js 8を選択。
公式のブログからソースコードをコピーします。
が、14~15行目のreturn res.send(がつながっててエラーになるので注意。
実行する関数には screenshot と入力し、作成ボタンをクリックします。
くるくる・・・
失敗するとこうなります (さきほどの14〜15行目が原因でした)
無事に成功するとこうなります
関数名クリックで詳細が見れます
URLがすでに出てるのでAWSで言うと API Gateway⇒AWS Lambda って感じなんでしょうきっと。
Postmanから叩いてみる
無事にscreenshot関数の結果が返ってきました\(^o^)/
感想
Puppeteerをクラウドで動かそうとした場合パッケージが大きくて、アップしたり動かしたりするのが結構大変です。
その点GCPのCloud Functionsではインストール(npm i)がクラウド側で行われるのでライトな印象です。
Puppeteerといえば・・・本を執筆しました
「これが言いたかっただけじゃないの?」というツッコミは置いといて…
Puppeteerの入門書が秀和システムから出版されました。表紙は鶴田謙二さん。
表紙目当てで買って頂ける方もいらっしゃるようです。
Node.jsの知識がなくてもWebスクレイピングができるようになれるよう書きました。
LINE Beaconが当たったのでセットアップしてみた
LINE Beacon当たったぁぁあ!!
なんとLINE Beaconが当たった!!嬉しい。何か作ろう #スマートスピーカーを遊びたおす会 #linebootawards
— Ryoichi Obara (@ryoichi_obara) 2018年9月7日
と言っても、何か作る前にはまず設定です。
Beaconはコレ
なんと本体 5,400円(税込)に加えて送料は 1,080円!…高い!ありがたいっ!!
ということで久しぶりにLINEにログイン・・・
と思ったら、アカウントの追加を失敗してしまいました。こちらにまとめました。
ここまでMessaging APIからWebhookでデータが飛ばせる所まできたと思います。
Beaconの設定を行う
ここから設定します。
https://admin-official.line.me/beacon/register#/
"ビーコン端末とbotの連携" をクリック。
"アカウント一覧"から対象のアカウントを選択
"ハードウェアID" と "パスコード" を入力
こちらの入力欄は HWID, CODE の順。
実機は、CODE, HWID の順で書かれています。(逆かいな)
CODEは-が入っていますが、これはどちらでも登録できました(ハイフンあったほうが読みやすいよね!)
アカウント連携が完了しました
一覧画面に遷移して追加されているのが確認できます
LINEアプリの設定を行います
手順はこちら
1. LINEがインストールされているスマートホンのbluetoothをonにしてください。
2.「LINE Beaconを利用」にチェックを入れてください。
a. 設定 → プライバシー管理 → LINE Beaconを利用。
3. Botアカウントと友達になってください。
a. 連携していないBotアカウントには、ビーコンの情報は送られません。
4. ビーコンの電源が入っていることを確認し、スマートホンを近づけて下さい。
a. LINEアプリがビーコンを検知し、その情報をLINEプラットフォームに送信します。https://admin-official.line.me/13555625/beacon/#/connect
Beaconの電源をON/OFFするには、筐体の中のこの部分のスイッチを切り替えます
表面のランプが点滅し、ランプの点滅が消えたら準備完了のようです
テスト
こんな感じのデータを受信するのを確認できると思います。
{ "events": [ { "type": "beacon", "replyToken": "e0f475d5c49249b48b1bb37f7406d4cc", "source": { "userId": "*********************************", "type": "user" }, "timestamp": 1536757232074, "beacon": { "hwid": "**********", "dm": "", "type": "enter" } } ] }
beacon.hwidが連携に使用したBeaconのハードウェアIDであり、Beacon端末を一意に特定するものです。
source.userIdユーザー(これはアプリごとかな…?)を一意に特定するものです。
botアカウントと既に友達で、BeaconとiPhoneが既に近い状態で、Beaconの電源をonにした場合(?)、なかなか飛んできませんでした。
書式のドキュメントはこちら
https://developers.line.me/ja/reference/messaging-api/#beacon-event
さて何つくろう・・・(勝負はここからw)
参考
https://developers.line.me/ja/docs/messaging-api/using-beacons/