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:コールバックヘルとかにならずに

How to use LINE Messaging API with PHP sdk in an hour.

this entry for beginner.

https://developers.line.me/messaging-api/overview

github.com

if you are expert, please see line-bot-sdk-php's examples. that is more better(more strict).

requirement

  • Public web server
  • need https
  • PHP version >= 5.6
  • curl extention
  • Composer

registration Developer trial

https://developers.line.me/

get tokens

You need to get channel token and channnel secret.

goto

https://developers.line.me/

and click channels at header right side.

you will see Channels basic infomation.

if you get wrong bot account?

if you try "TRIAL_BOT" before, open bellow url and click account list.

https://business.line.me/

then, open your developers trial bot account's Messaging API's LINE DEVELOPER button.

Okey, create your project

example file tree.

/project_root/
             /wwwroot/ # your httpd document root dir
                     /index.html # not require
                     /callback.php
             /vendor # will create by composer
             /composer.* # will create by composer

these are example. you can change wwwroot to htdocs,public and other as you like.

install sdk

$ mkdir project_root
$ cd project_root
$ wget https://getcomposer.org/composer.phar
$ php composer.phar require linecorp/line-bot-sdk

# will generate composer.json, composer.lock, vendor/

create callback.php at project_root/wwwroot/

this is sample echo bot.

<?php // callback.php
define("LINE_MESSAGING_API_CHANNEL_SECRET", 'your channel secret');
define("LINE_MESSAGING_API_CHANNEL_TOKEN", 'your channel token');

require __DIR__."/../vendor/autoload.php";

$bot = new \LINE\LINEBot(
    new \LINE\LINEBot\HTTPClient\CurlHTTPClient(LINE_MESSAGING_API_CHANNEL_TOKEN),
    ['channelSecret' => LINE_MESSAGING_API_CHANNEL_SECRET]
);

$signature = $_SERVER["HTTP_".\LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
$body = file_get_contents("php://input");

$events = $bot->parseEventRequest($body, $signature);

foreach ($events as $event) {
    if ($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage) {
        $reply_token = $event->getReplyToken();
        $text = $event->getText();
        $bot->replyText($reply_token, $text);
    }
}

echo "OK";

please edit your channel secret, your channel token to your tokens.

register webhook URL(callback URL)

set your callback.php url to webhook URL.

you can edit webhook URL at Channels basic infomation.

open bellow url and click channnels (same as get token).

https://developers.line.me/

TEST!

follow your bot account, and send a text.

echo bot will echo back same text.

(sticker(and other) message is not normal text message, this echo bot will ignore.)

if you got any reply

at first, CHECK YOUR ACCESS_LOG and ERROR LOG! (IMPORTANT!!!)

You can not trust access from webhook from line?

this code will dump any request post body to /tmp/dump.txt.

<?php
ob_start();
$raw = file_get_contents('php://input');
var_dump(json_decode($raw,1));
$raw = ob_get_clean();
file_put_contents('/tmp/dump.txt', $raw."\n=====================================\n", FILE_APPEND);

echo "OK";

FYI: webhook access is not encoded by application/x-www form-urlencoded, so $_POST will blank.

SSL Error

SSL certificate problem: unable to get local issuer certificate

this is cause by YOUR php settings.

you need set curl ca certification

please google with 'curl.cainfo php.ini'.

done!

that's all. very simple.

see also

if you want to listen other messaging api events, plz see SDK example/KitchenSink.

enjoy!

for japanese

ここ数日のエントリをみてくれ。

新・続LINEのMessaging APIを使うメモ:Beaconつかうぞ!

uzulla.hateblo.jp

一つ前の記事をまず見てください。

ビーコンとは

先日のLINE DEVELOPER DAY 2016で来場者にビーコンが配布されました。

f:id:uzulla:20161007153619p:plain

ビーコン、すごく夢があるやつで、「これがあればあんな案件もこんな案件も現実的だったのに…」と広告業界に片足あった男は思います*1。「その人がリアルにその場所にこないと発生しないトリガー」を皆がもとめていた時代があったのです(今でもあるけど)。

LINE DEV DAYでも、三箇所のビーコンのちかくにいくと、スタンプがもらえました。*2

まあビーコンのビジネス活用の話は他所に置きます。

ビーコンの登録

f:id:uzulla:20161007153900j:plain

ハコにURLがかいてあります、ハコをすててしまった人はしりません。*3

ビーコンの電池を抜くと、HWIDとCODEがあり、URLにそれを入力します。単語統一してくれ。

f:id:uzulla:20161007153922p:plain

うまくいけばビーコンがアカウントと連携し、LINE@MANAGERの左側にビーコンが現れ、アカウントのMessaging APIにビーコン検知のイベントがきます。

f:id:uzulla:20161007153941p:plain

使い方

昨日のサンプルコードをちょっとだけ修正して以下の感じにしてみました。

<?php // callback.php
define("LINE_MESSAGING_API_CHANNEL_SECRET", 'your channel secret');
define("LINE_MESSAGING_API_CHANNEL_TOKEN", 'your channel token');

require __DIR__."/../vendor/autoload.php";

$bot = new \LINE\LINEBot(
    new \LINE\LINEBot\HTTPClient\CurlHTTPClient(LINE_MESSAGING_API_CHANNEL_TOKEN),
    ['channelSecret' => LINE_MESSAGING_API_CHANNEL_SECRET]
);

$signature = $_SERVER["HTTP_".\LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
$body = file_get_contents("php://input");

$events = $bot->parseEventRequest($body, $signature);

foreach ($events as $event) {
    if ($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage) {
        $reply_token = $event->getReplyToken();
        $text = $event->getText();
        $bot->replyText($reply_token, $text);
/* ================= ここから追記 =============================*/
    } elseif ($event instanceof \LINE\LINEBot\Event\BeaconDetectionEvent) {
        $reply_token = $event->getReplyToken();
        $bot->replyText($reply_token, "近くにいますね?");
/* ================= ここまで追記 =============================*/
    }
}

echo "OK";

追記の所をみてみればわかりますが、BeaconDetectionEventがきたらreply tokenをとりだして適当なテキストを送っています。

基本的にはテキストメッセージ受信とまったく同じです。

たったこれだけです、ちゃんとうごきますよ。

以上ですが

これだけでは何なので、もう少し書きます。

配布されたビーコンについて

配布されたビーコンの感覚値をかいておきます。これは配布された開発者用のビーコンと手元のGalaxy S7 edgeでの話であり、飛距離は(これをもっている開発者以外にはw)あまり意味がないでしょう。 電波状況やつかっているHWでは変わるでしょうし。

  • スイッチいれて、イベントがくるまで約1分、案外早い
  • 屋内ドア二枚くらいなら電波とどく(が、とぎれとぎれ)
  • 10mは余裕そう(うわさによれば、1mでも100mでも調整できる(ハードが新しく出る?)とか…?)
  • 一度でも検知されれば良いようなので、即時性をかんがえなければ実効はもっとひろそう
  • 検知するとenterイベントがくる
  • leaveイベントはない
  • 検出のインターバルは15秒くらいなのでは?
    • 微妙な距離に置くと、イベントが30秒間隔で発生する事があった(有効>無効>有効のワンクールで15*2?)
    • つまり無限にenterがくるので、一度きたら一時間無視みたいなのは自分で調整しなければいけない(自由度がたかくてよい)
    • 人が多いイベントでこれうごかすと、アプリサーバ側も相応にまちかまえないとダメそう
  • ハードウェアの説明書がもうちょっとほしい
    • 電池の持ちがさっぱりわからん
    • LEDの意味とか…スペックとか
    • まあ、こまったことはないので説明書は不要かもしれないが
  • もう一個ほしいんですが

まあ公式APIドキュメントにビーコンのことはまだほとんどないし、しかたないね。

色々やって自分でたしかめろ!ということなのでしょう。

まとめ

よくできていて、迷う所がない。

とにかく管理画面以外文句がない。

こちらからは以上です、つづく 。

*1:最近は疎遠です

*2:LINEは主に奥さんとやっているので、使いどころがない

*3:固定っぽいけど