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

この記事は[エイチームブライズアドベントカレンダー](https://qiita.com/advent-calendar/2017/a-t-brides)6日目の記事です。

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

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

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

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

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

```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) { // 最大５店舗の情報を返す
    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については[こちら](https://developers.line.me/ja/docs/messaging-api/overview/)に詳細載っています。
ぐるなびは[こちら](http://api.gnavi.co.jp/api/manual/restsearch/)。
近くにケンタッキーがないときはその旨をメッセージで返してくれます。なんて親切。

## 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](https://qiita-image-store.s3.amazonaws.com/0/200812/36a25799-de77-97bf-b3fd-1ff8803811c5.png)

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

<img width="375" alt="IMG_0047.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/200812/dd03dfb8-8dc3-ded5-617e-aabfc4b62f92.png">

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

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


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

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

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

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

# お知らせ
エイチームブライズでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](http://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](http://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい。

# 明日
[エイチームブライズアドベントカレンダー](https://qiita.com/advent-calendar/2017/a-t-brides)6日目の記事は、いかがでしたでしょうか。
明日は @sho0211 がSREを作った話について書いてくれるようです。お楽しみに！