【クリスマス用】近くのケンタッキーを教えてくれるLINE BOTを作ってみた

この記事はエイチームブライズアドベントカレンダー6日目の記事です。

はじめに

アドベントカレンダー2回目の投稿です。
前回はOneSignalを使って超簡単に、特定のユーザへのブラウザpushを作るという実用的な内容を書いたので、今回はちょっとクリスマスぽいことをしてみようと考えました。
私の思考回路は超絶単純でクリスマスと言えばケンタッキー。
そこで最近気になってるLINEのMessageingAPIを使って位置情報を送ると近くにあるケンタッキーの情報を送ってくれるBotを作ってみました。

用意するもの

  • LINE@のDeveloper Trialアカウント
  • ぐるなびAPIを使うのでAPIキー
  • PHPとSSLを利用できるサーバー

DeveloperアカウントはLINE@の公式ページから発行することができます。
ググるとやり方山ほど出てくるので今回は割愛。
ぐるなびのAPIはこちらからアカウントを発行してください。言われた通りに入力していけば何も迷うことなくすんなるアカウント発行できます。
そしてMessaging APIを使うにはLINEの管理画面でWebhook URLを登録する必要があるのですが、httpsで用意する必要があるためSSLを利用できる環境が必要になります。今回はcloud9とHerokuを使いました。

やってみた

準備が整ったら早速作ってみましょう!

cloud9で新規アプリケーションを作成

適当なアプリケーション名をつけてアプリケーションを作成したら、index.phpを下記のようにします。

index.php
<?php

$accessToken = 'LINEのアクセストークン(管理画面より取得)';

// 受信したメッセージ情報
$raw = file_get_contents('php://input');
$receive = json_decode($raw, true);

$event = $receive['events'][0];
$replyToken  = $event['replyToken'];
$messageType = $event['message']['type'];

// 送られてきたのが位置情報以外だったら応答しない
if($messageType != "location") exit;

$lat = $event['message']['latitude'];
$lon = $event['message']['longitude'];

// 送られてきた位置情報を元にぐるなびのAPIにアクセスしてケンタッキーの店舗情報を取得する
$uri    = 'https://api.gnavi.co.jp/RestSearchAPI/20150630/';
$accKey = 'ぐるなびのアクセスキー(アカウント発行後メールにて送られてきます)';

$url  = $uri . '?format=json&name=ケンタッキー&range=5&keyid=' . $accKey . '&latitude=' . $lat . '&longitude=' . $lon;

$json = file_get_contents($url);
$obj  = json_decode($json);

// 店舗情報を取得
$count = 0;
$columns = array();
foreach ($obj->rest as $restaurant) {
  $columns[] = array(
    'thumbnailImageUrl' => $restaurant->image_url->shop_image1,
    'text'    => $restaurant->name,
    'actions' => array(array(
                  'type'  => 'uri',
                  'label' => '詳細を見る',
                  'uri'   => $restaurant->url
                ))
  );
  if (++$count > 5) { // 最大5店舗の情報を返す
    break;
  }
}

// LINEで返信する
$headers = array('Content-Type: application/json',
                 'Authorization: Bearer ' . $accessToken);

if ($columns) {
  $template = array('type'    => 'carousel',
                    'columns' => $columns);

  $message = array('type'     => 'template',
                   'altText'  => 'ケンタッキーの情報',
                   'template' => $template);
} else {
  $message = array('type' => 'text',
                   'text' => 'メリークリスマス。残念ですが近くにケンタッキーはありません。');
}

$body = json_encode(array('replyToken' => $replyToken,
                          'messages'   => array($message)));
$options = array(CURLOPT_URL            => 'https://api.line.me/v2/bot/message/reply',
                 CURLOPT_CUSTOMREQUEST  => 'POST',
                 CURLOPT_RETURNTRANSFER => true,
                 CURLOPT_HTTPHEADER     => $headers,
                 CURLOPT_POSTFIELDS     => $body);

$curl = curl_init();
curl_setopt_array($curl, $options);
curl_exec($curl);
curl_close($curl);

LINEのMessagingAPIについてはこちらに詳細載っています。
ぐるなびはこちら
近くにケンタッキーがないときはその旨をメッセージで返してくれます。なんて親切。

Heroku へ deploy

Cloud9で作ったアプリケーションをHerokuへデプロイします。

ローカルリポジトリを準備する

$ git init
$ git add *
$ git commit -m "コミットメッセージ"

Herokuへログイン

$ heroku login

Enter your Heroku credentials:
Email: myaccount@example.com
Password: ********
Logged in as myaccount@example.com

Herokuでアプリケーションを作成しpushする

アプリケーション名は入れても入れなくてもどちらでもOKです。
入れなければ適当なアプリケーション名が割り振られます。

$ heroku create アプリケーション名
Creating ⬢ xxxxx-xxxxx-xxxxx... done
https://xxxxx-xxxxx-xxxxx.herokuapp.com/ | https://git.heroku.com/xxxxx-xxxxx-xxxxx.git
$ git push heroku master

LINE@の管理画面からWebhook URLを登録

上記で発行された Heroku のURLをLINE管理画面上から登録します。
スクリーンショット 2017-12-05 17.07.25.png

動かしてみる

LINEからBotに向けてメッセージを送ってみます。

IMG_0047.PNG

いい感じに近くのケンタッキーを紹介してくれました。

はまったところ

LINE MessagingAPIもぐるなびのAPIもハマるところがないくらい簡単に使えました。
ただ自宅で作っていてテストをしてもなぜかぐるなびのAPIから600エラー(店舗がありません)が返ってくるのです。
歩いて行ける距離にケンタッキーはあるのになぜか…。
色々調べていて気づきました。

近所のケンタッキー潰れてた。

なのでそういう人のために近くにケンタッキーがない場合はその旨を伝える親切設計を追加しました。

それ以外はドキュメントがわかりやすく用意されているのでとても簡単に実装できました。

まとめ

実際このBotは使い道ないと思いますが、LINE Messaging API を使うと本当にいろんなことができます。
ぜひ色々試してみて面白いBotを作ってみてはいかがでしょうか。

お知らせ

エイチームブライズでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひともエイチームグループ採用ページWebエンジニア詳細ページ)よりお問い合わせ下さい。

明日

エイチームブライズアドベントカレンダー6日目の記事は、いかがでしたでしょうか。
明日は @sho0211 がSREを作った話について書いてくれるようです。お楽しみに!