uzullaがブログ

uzullaがブログです。

Hachioji.pmのLINE BotをLINE Messaging APIでつくってみた

私はHachioji.pmという地域pm*1を毎月開催しているのですが、毎回(ほぼ)参加者全員がトークするので、それのネタの為にもとHachioji.pmむけのLINEのボットを作ってみました。

紹介

ざっとどういう物なのか紹介です。

f:id:uzulla:20161009051619p:plain

基本「ヒャッ!」と、下からでてくるボタンで操作するスタイルです。

次回詳細を表示、というよりATNDを開く

f:id:uzulla:20161009050518p:plain

毎回Hachioji.pmはATNDで募集をかけています。開催日時、場所情報がATNDのAPIで引けるので、それをパースして表示します。

日時をみれば次回がないとかも表示できて便利(?)

地図表示

f:id:uzulla:20161009050532p:plain

会場は八王子周辺ですが、毎回異なります。

ATNDには会場の名前やサイトなどのURLをはってありますが、Google MAPとかははっていません、これは手間の問題です。

ATNDは住所をいれるとAPIから緯度経度がとれます。

で、Messaging APIでは色々な種類のメッセージをおくれますが、ここでは位置情報をつかっています。

わりとこれ結構便利な気がする。

まあ、ATNDみたらええやん、リンクたどればええやん、まあそうなんですけどね、大体のサイトってPC向けだから、スマホでもスッと地図が立ち上がるのはストレスがない。

次回催促

f:id:uzulla:20161009050605p:plain

f:id:uzulla:20161009050658p:plain

hachiojipmは毎月一回くらい開催しているのですが、割と適当に主催が思い立ったらATNDをたてています。つまり、主催が忙しかったりすると、しばらく次回がたたないということがあります。

Hachioji.pmはSlackがあるので、それとかでツッコんでもらえばいいだけなんですが、まあ気軽に催促されるのもいいかなとおもい、ボタンをつけてみました。「次回はよ」と言うと(あるいはボタンをタップすると)、Slackに投稿して私が気付きます。

ビーコンでチェックイン

f:id:uzulla:20161009050718p:plain

主催がビーコンをもっていますので、主催の近くにいくだけで参加したことがログされるのがおもしろいかなと実装してみました。

まあ、「ログされます」といっても別になにがされるわけでもないです。「100回連続参加で賞品!」とかそういうのも特にない予定です。

Hachioji.pmは参加者が後から遅れてくる事が多いので(そういうスタイルなので)、しばしば「誰がきてるんだっけ?あと誰がきてないんだっけ?」という会話がなされる為、うまく突き合わせをすればその問題が解決できそうですね。

(とはいえ、全員がLINEやってるわけでもないので…?)

おしてはいけないボタン

おしてはいけません


と、いうことで以上です。

これは新しい何かを解決するイノベーションあるものではなく、トークと個人的な趣味のために1日くらいで作ったものです。正直SlackやATNDだけでできることであり、このBotの価値は特にないです、みんなもつかわない気がします。まあ、スマホで一発で地図をみれるのは便利な気がします…が、Hachioji.pmが開催される場所は割とローテーション気味なのでみんな道をおぼえている気もする。

まあ、お金がかかることでもないので、しばらく暇をみて育ててみようかとは思います。

参考になるとはおもえないんですけど、大変素朴なコードを公開しておきます。

github.com

作ってみた感想

とりあえず、使える(?)BOTを初めて作ってみて、何人かにつかってみてもらった感想なのですが…一言でいうと「なんか…ガラケーを思い出すな」という感じです。

あれも画像もつかいづらくて基本文字だし、セッションがないし(guid=ONなどw)、色々やりましたけど、あれを思い出します。

当時、ものすごい「絵文字を配置する」ことが得意な人がいましたけど、ああいう感じの…。なんていうか割り切れば割り切れる感じ。

実際にはLINEは画像をつかっていろいろできるんですけど、画像を作る工数であきらめられるし、諦めて文字だけでも(そこまでは)みすぼらしくないのがいいですね。

PHP SDKの感想

兎に角しっかりしており、他の言語で作る方でもexapmlesのKitchenSinkだけは見て損はないかと。

https://github.com/line/line-bot-sdk-php/tree/master/examples/KitchenSink

リッチメニューが便利

f:id:uzulla:20161009051735p:plain

チャットボットなのにチャットしねえのかよ!といわれそうですけど、実際リッチメニューは非常に便利ですね。

LINE@で管理する機能なので、なかなか「プログラマー向け」とはいいがたい概念や管理画面なんですが、とにかくこれはよい。

これ、ますますボットの意味なく、ウェブでええやん…という感じがいなめませんが、便利なものは便利だからええんや。

自動リンクが邪魔

f:id:uzulla:20161009051754p:plain

日付の数字を電話番号と認識したり、「hachioji.pm」という文字をURLとして認識したり誤爆するんですよね。ちょっとだるい。

まあ、工夫で回避するしかないかなとおもってますが…。

セッションとルーターが…

まだ困ってないんですけど、ボット用のルーターとセッション管理ってのはどうなっていくんですかね。まあ複数窓という概念はないとすればまさにガラケー時代を思い出すセッション機構をつくればいいのだろうか。

ボットは「リロード(とか、トップページをひらく)」の仕組みがないんで、「会話」をやるならセッション管理が必要で、なにかシーケンスをするならAbortする仕組みもなんか用意しないと、ものすごいかったるい(毎回最初からやりなおさせる)か、詰み(もどれない)そうですね。

あとはルーターですねー、PHP sdkだと、取れたeventのclass名と入力文字をみてルーティングしていく事になります。この設計は安全で気に入っていますが愚直にやっていくとコードがドンドンネストする。そして、他のchatでつかいまわしはきかない。

ボットにはURLのpathみたいなものはないし、将来的には自然言語解析して〜という感じだとおもうんですが大変そう。

たとえばこういう自然言語を解析するASP的なAPIがあるよとおしえてもらったので、面白いなとはおもっているのですが、

www.microsoft.com

qiita.com

こういうのをつかって、はたして見通しよく*2実装できるのだろうか…大変そう…もうボタンでいいんじゃないかなあ…w

非同期が…

今、BotはAzure App Service+PHPでうごかしてるんですが、無料枠でうごかしてるのでしばらくするとワーカーが停止します。 停止状態からアクセスすると自動的にスピンアップするんですけど体感2〜3秒位ボットが返事をくれないので、「あれ?」と、もう一度ボタンをおしちゃうことがありますね。勿論二回うごいちゃう。

これ、あまり体験としてよくないので、連続した重複は無視するとかやらないといけないかな。上にも書いたセッション(やスロットリング)とかと一緒に解決しなきゃいけなさそう。ボットのフレームワークってやつをつかったことがないんですけど、こういうのがあるのかな。

iOSはLINEのBeacon有効にするのに設定が必要なの?

私のメイン端末が今Androidなんで今日初めて気付いたんですけど、iOSってもしかしてBeaconがデフォルトオフなんでしょうか、結構ショックです。

今日ドヤ顔でみんなにやってもらおうとおもったら結構できなかったんですよね…、設定したつもりでも、うごいたりうごかなかったり、まあ設定がたりてないのでしょうが、きびしい。

これ、将来的にはデフォルト変わるのだろうか…iOS(というかApple)の都合でこうなってるとしたら渋い。

まとめ

BOT作成簡単ですね!

ただ、簡単だけどヒネりもなく何かを作っても「これ別にWebでええやん」となってしまうので、なかなかむずかしそうであります。

次は「チャットグループにボットを生息させると便利」という話を聞き、そうか、ならば普段一番LINEしている奥さんとのLINEをエンハンスしたりできないかなとおもってます。

こちらからは以上です

*1:Perlのユーザーのmeet up

*2:コールバックヘルとかにならずに