【API】ホットペッパーAPIで近くのお店を返すLinebotを作ってみた。【PHP】【初学者向け】

###前書き　
とても苦労したlinebot作成についてアウトプットしてより理解を深めようと思い、初めてqiitaを書きます。おそらくお見苦しい点ばかりでしょうが、先輩方はぜひ暖かい眼差しで見守っていてください。

#linebotとは
###　引用
>LINE BOTとは、一言でいえばコミュニケーションアプリLINEで動く、チャットボットだ。チャットボットとは？方は、当サイト記事のチャットボットとはを参考にして欲しいが、チャットアプリ上で動くロボットの事だ。

###リンク
[lineボットとは]
(http://humming-bird.info/linebot/linebot/)

###
#使用したライブラリ

[誰でも簡単にlinebotが作れるライブラリ]
(https://qiita.com/jyuki/items/035cfeb72d7d359c738b)

今回はjyukiさんのライブラリ使用させていただいて、サクッと仕組みを作っていきます。

#必要なもの
・サーバー(ssl接続可能な)
・[Line Developersアカウント]
(https://developers.line.biz/ja/)
・[ホットペッパーAPIアカウントの作成]
(https://webservice.recruit.co.jp/register/index.html)

今回はherokuというサービスを使ってlinebotを作成していく方法を記載していきます。

Line Developersアカウントの登録や設定はすでにqiitaにいくつも記事があるので探して実装してみてください。

ホットペッパーAPIの利用登録をして、きちんとAPIKeyをメモしておきましょう(必ず必要です)。

#herokuでアプリケーション作成
herokuの公式サイトでアカウントを作成し、macOSならばherokuをhomebrewなどでインストールしておきましょう。
ライブラリをgit cloneしたディレクトリに移動し、以下のコマンドを入力し、ひとまずライブラリの中身をherokuにデプロイしてみましょう。

```sh:heroku
heroku login
heroku create [アプリ名]
git init 
git add .
git commit -m "first commit"
git push heroku master
```
このアプリ名はlinedevepolerのwebhookURLの
https://[アプリ名].herokuapp.com/
この部分にも使います！



#APIの使用

http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key='API_KEY&lat=35.696274&lng=139.74149
上記のURLの[key=]以下に各々のAPIKEYをぶっこんでURLにアクセスしてみてください。

XML形式で靖国神社付近のお店が返り値として取得できていますね。

今回のlinebotは利用者が位置情報を送るとこの店名と店のURLを返すものとなっています。
お店は最大５店まで送ることができます。(地元で試してみたら1店舗も出ませんでした)

[こちら] (https://webservice.recruit.co.jp/hotpepper/reference.html#1)に様々なオプションが掲載されているので、いろんな情報を取得してみるのも面白いです。
ジャンルを絞って店舗を検索するように改良してみたりするのもいいかもしれませんね！

#linebotでの活用

まず、[linebotのリファレンス](https://developers.line.biz/ja/reference/messaging-api/#location-message)を確認します。
位置情報が送られてきた時に、送られてくる情報は以下の通りです。

```php:location
{
    "type": "location",
    "title": "my location",
    "address": "〒150-0002 東京都渋谷区渋谷２丁目２１−１",
    "latitude": 35.65910807942215,
    "longitude": 139.70372892916203
}
```
必要なのは"latitude"と"longitude"になりますね。
では次にライブラリの位置情報が送られてきた時行なっている処理のところを探してみましょう。

```php:location
if ($messeage_type == "location") {
```

ここですね。

 ```php:location
$locaation = $bot->get_location();
$lat = $locaation['latitude'];
$log = $locaation['longitude'];
```
ここで位置情報を取得し、緯度経度の値を変数にぶち込みます。

そして今回APIの情報を取得する時に使うのはcurlです。(API情報取得にはfile_get_contentsではなく、curlの方が良いらしいです)

```sh:curl
$url = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIKEY]&lat=$lat&lng=$long';
//セッション初期化
$ch = curl_init();
//オプション
url_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//値を取得する。
$res =  curl_exec($ch);
$json = json_decode($res, true);
```

このような感じで外部URLの情報を取得し、連想配列として値を受け取ります。

```php:debug
file_put_contents('任意のtxtファイル', print_r($json), true);
```
のような感じでデバッグを行い、変数に配列が入っているか、どのような構成で入っているかを確認してみましょう。

https://[アプリ名].herokuapp.com/[ここに適当に作った任意のtxtファイル]

herokuのURLにアクセスすることで確認できます。

```php:name
$nameOne = $json['results']['shop']['0']['name'] . $json['results']['shop']['0']['urls']['pc'];
```
店名と予約できるURLを使いやすいように変数に入れてあげます。返したいお店の数だけ変数を用意してあげてください。

```php:send
//テキストの送信フロー
$bot->add_text_builder($nameOne);
```

ここまでできたらデプロイして、実際に位置情報を送って値が返ってくるか確認してみてください！



#参考にさせていただいたサイト一覧

[PHP cURLの色々な使い方](https://qiita.com/wanwanland/items/a5f9574fadd214d7b5c8)
[誰でも簡単にlinebotが作れるライブラリ]
(https://qiita.com/jyuki/items/035cfeb72d7d359c738b)
[PHPでJSONデータの取得の仕方](https://qiita.com/fantm21/items/603cbabf2e78cb08133e)