Help us understand the problem. What is going on with this article?

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

前書き 

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

linebotとは

 引用

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

リンク

lineボットとは

使用したライブラリ

誰でも簡単にlinebotが作れるライブラリ

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

必要なもの

・サーバー(ssl接続可能な)
Line Developersアカウント
ホットペッパーAPIアカウントの作成

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

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

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

herokuでアプリケーション作成

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

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を返すものとなっています。
お店は最大5店まで送ることができます。(地元で試してみたら1店舗も出ませんでした)

こちらに様々なオプションが掲載されているので、いろんな情報を取得してみるのも面白いです。
ジャンルを絞って店舗を検索するように改良してみたりするのもいいかもしれませんね!

linebotでの活用

まず、linebotのリファレンスを確認します。
位置情報が送られてきた時に、送られてくる情報は以下の通りです。

location
{
    "type": "location",
    "title": "my location",
    "address": "〒150-0002 東京都渋谷区渋谷2丁目21−1",
    "latitude": 35.65910807942215,
    "longitude": 139.70372892916203
}

必要なのは"latitude"と"longitude"になりますね。
では次にライブラリの位置情報が送られてきた時行なっている処理のところを探してみましょう。

location
if ($messeage_type == "location") {

ここですね。

location
$locaation = $bot->get_location();
$lat = $locaation['latitude'];
$log = $locaation['longitude'];

ここで位置情報を取得し、緯度経度の値を変数にぶち込みます。

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

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の情報を取得し、連想配列として値を受け取ります。

debug
file_put_contents('任意のtxtファイル', print_r($json), true);

のような感じでデバッグを行い、変数に配列が入っているか、どのような構成で入っているかを確認してみましょう。

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

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

name
$nameOne = $json['results']['shop']['0']['name'] . $json['results']['shop']['0']['urls']['pc'];

店名と予約できるURLを使いやすいように変数に入れてあげます。返したいお店の数だけ変数を用意してあげてください。

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

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

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

PHP cURLの色々な使い方
誰でも簡単にlinebotが作れるライブラリ
PHPでJSONデータの取得の仕方

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away