メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

LINE Beaconが当たったので簡単な実装をしてみた

経緯

ryoichi0102.hatenablog.com

何を作ったか

Beaconに近づくとLINEで教えてくれるBotです。簡単すぎてスミマセン。

画面

f:id:ryoichi0102:20180925102130j:plain

処理の流れ

次のような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時の処理.
  }
}

ソースコード

github.com

どんな展開が見込めるか

[ 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.google.com

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を作成します

関数を作成

f:id:ryoichi0102:20180918202837p:plain

関数の詳細を入力します

関数の名前を付けて、メモリ容量を選択して(公式では1GBを推奨)、トリガーはHTTP。今回はお手軽お試しということで、ソースコードはインラインエディタを選択。ランタイムはNode.js 8を選択。

公式のブログからソースコードをコピーします。
が、14~15行目のreturn res.send(がつながっててエラーになるので注意

実行する関数には screenshot と入力し、作成ボタンをクリックします。

f:id:ryoichi0102:20180918203103p:plain

くるくる・・・

f:id:ryoichi0102:20180918203832p:plain

失敗するとこうなります (さきほどの14〜15行目が原因でした)

f:id:ryoichi0102:20180918204241p:plain

無事に成功するとこうなります

f:id:ryoichi0102:20180918204328p:plain

関数名クリックで詳細が見れます

URLがすでに出てるのでAWSで言うと API GatewayAWS Lambda って感じなんでしょうきっと。

f:id:ryoichi0102:20180918204355p:plain

Postmanから叩いてみる

無事にscreenshot関数の結果が返ってきました\(^o^)/

f:id:ryoichi0102:20180918204523p:plain

感想

Puppeteerをクラウドで動かそうとした場合パッケージが大きくて、アップしたり動かしたりするのが結構大変です。
その点GCPのCloud Functionsではインストール(npm i)がクラウド側で行われるのでライトな印象です。

Puppeteerといえば・・・本を執筆しました

「これが言いたかっただけじゃないの?」というツッコミは置いといて…

Puppeteerの入門書が秀和システムから出版されました。表紙は鶴田謙二さん。
表紙目当てで買って頂ける方もいらっしゃるようです。
Node.jsの知識がなくてもWebスクレイピングができるようになれるよう書きました。

www.shuwasystem.co.jp

Amazonのリンクはコチラ

LINE Beaconが当たったのでセットアップしてみた

LINE Beacon当たったぁぁあ!!

と言っても、何か作る前にはまず設定です。

Beaconはコレ

なんと本体 5,400円(税込)に加えて送料は 1,080円!…高い!ありがたいっ!!

beacon.theshop.jp

ということで久しぶりにLINEにログイン・・・

と思ったら、アカウントの追加を失敗してしまいました。こちらにまとめました。

ryoichi0102.hatenablog.com

ryoichi0102.hatenablog.com

ここまでMessaging APIからWebhookでデータが飛ばせる所まできたと思います。

Beaconの設定を行う

ここから設定します。
https://admin-official.line.me/beacon/register#/

"ビーコン端末とbotの連携" をクリック。

f:id:ryoichi0102:20180913192133p:plain

"アカウント一覧"から対象のアカウントを選択

f:id:ryoichi0102:20180913192447p:plain

"ハードウェアID" と "パスコード" を入力

こちらの入力欄は HWID, CODE の順。

f:id:ryoichi0102:20180913192600p:plain

実機は、CODE, HWID の順で書かれています。(逆かいな)
CODEは-が入っていますが、これはどちらでも登録できました(ハイフンあったほうが読みやすいよね!)

f:id:ryoichi0102:20180913193126p:plain

アカウント連携が完了しました

f:id:ryoichi0102:20180913193423p:plain

一覧画面に遷移して追加されているのが確認できます

f:id:ryoichi0102:20180913193623p:plain

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するには、筐体の中のこの部分のスイッチを切り替えます

f:id:ryoichi0102:20180913194026p:plain

表面のランプが点滅し、ランプの点滅が消えたら準備完了のようです

f:id:ryoichi0102:20180913194339p:plain

テスト

こんな感じのデータを受信するのを確認できると思います。

{
  "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/

engineering.linecorp.com