[PHP] LINE ボットでクイックリプライを使う

#今回の題
LINEボットでクイックリプライを実装してみようと思います。
「PHP LINEボット クイックリプライ」などでググるとRawMessageBuilderを使った方法やjsonを直接書いているコードが散見できたのですが、SDKに用意されたクイックリプライ用のクラスを使ったものがありませんでした。なのでここにその方法を書き残します。


クイックリプライとは以下のようなやつです。
![A2B97A33-0576-43F4-A53D-3B674BAAE189.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/73d098e0-c516-57d8-6a2f-82fb2f90c62a.jpeg)
confirmやカルーセルの実装方法は以下の記事にまとめています。
[[PHP] Messaging APIを使ったLINEbotで色々試してみる](https://qiita.com/kuzira_vimmer/items/ad485a9365c2c23f0465)


#前提
- 公式のSDKを利用します。
[LINE Messaging API SDK for PHP](https://github.com/line/line-bot-sdk-php)

- おうむ返しまで完成している。
もし完成していない場合、以下の記事を参考に完成させてください🙇‍♂️
[[PHP] Messaging APIを使ったLINEbotで色々試してみる](https://qiita.com/kuzira_vimmer/items/ad485a9365c2c23f0465)

#コードと説明
```php
// 1、表示する文言と押下時に送信するメッセージをセット
$message_template_action_builder = new MessageTemplateActionBuilder('ボタンに表示する文言', '押下時に送信されるメッセージ');
// 2、1をボタンに組み込む
$quick_reply_button_builder = new QuickReplyButtonBuilder($message_template_action_builder);
// 3、ボタンを配列に格納する (12個まで)
$quick_reply_buttons[] = $quick_reply_button_builder;
// 4、3を元にクイックリプライを作成する
$quick_reply_message_builder = new QuickReplyMessageBuilder($quick_reply_buttons);
```

使用しているクラスは3つ。
上記のコードでは以下のように[use](https://www.php.net/manual/ja/language.namespaces.importing.php)でインポートして使用しています。

```ph
use LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder;
use LINE\LINEBot\QuickReplyBuilder\ButtonBuilder\QuickReplyButtonBuilder;
use LINE\LINEBot\QuickReplyBuilder\QuickReplyMessageBuilder;
```

##送信について
大切な部分なので項目を分けました。
作成したクイックリプライは以下のように`replyMessage()に直接渡して送信することが出来ません。`

```php
// これは送信できない
// 略
$quick_reply_message_builder = new QuickReplyMessageBuilder($quick_reply_buttons);
$bot->replyMessage($reply_token, $quick_reply_message_builder);
```

正しくはこう、

```php
// 略
$quick_reply_message_builder = new QuickReplyMessageBuilder($quick_reply_buttons);
$text_message_builder = new TextMessageBuilder('これはテストです', $quick_reply_message_builder);
$bot->replyMessage($reply_token, $text_message_builder);
```

インターフェイス[LINE\LINEBot\MessageBuilder](https://github.com/line/line-bot-sdk-php/blob/master/src/LINEBot/MessageBuilder.php)を適用したクラスに噛ませて送るような形になります。

#全体図
最初の画像のように料理のカテゴリを一覧表示させてみます。

```php
<?php
require_once('vendor/autoload.php');

use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;
use LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder;
use LINE\LINEBot\QuickReplyBuilder\ButtonBuilder\QuickReplyButtonBuilder;
use LINE\LINEBot\QuickReplyBuilder\QuickReplyMessageBuilder;

$channel_access_token = 'XXXXXXXXX';
$channel_secret = 'XXXXXXXXX';

$http_client = new CurlHTTPClient($channel_access_token);
$bot = new LINEBot($http_client, ['channelSecret' => $channel_secret]);
$signature = $_SERVER['HTTP_' . HTTPHeader::LINE_SIGNATURE];
$http_request_body = file_get_contents('php://input');
$events = $bot->parseEventRequest($http_request_body, $signature);
$event = $events[0];
$reply_token = $event->getReplyToken();


$categories = [
    '和食',
    '洋食',
    '中華料理',
    'アジア・エスニック',
    'イタリアン',
    'フレンチ'
];

foreach ($categories as $category) {
    // 1、表示する文言と押下時に送信するメッセージをセット
    $message_template_action_builder = new MessageTemplateActionBuilder($category, $category . 'を選択したよ！');
    // 2、1をボタンに組み込む
    $quick_reply_button_builder = new QuickReplyButtonBuilder($message_template_action_builder);
    // 3、ボタンを配列に格納する(12個まで)
    $quick_reply_buttons[] = $quick_reply_button_builder;
}
// 4、3を元にクイックリプライを作成する
$quick_reply_message_builder = new QuickReplyMessageBuilder($quick_reply_buttons);
$text_message_builder = new TextMessageBuilder('カテゴリを選択してください', $quick_reply_message_builder);
$bot->replyMessage($reply_token, $text_message_builder);
```
以上です。
SDKのソースコードを追いまくりました👀 (目が痛い）
近いうちに今度はFlex Messageの記事でも書こうかと思っています。

#参考
[LINE Messaging API SDK for PHP](https://github.com/line/line-bot-sdk-php)
[LINE Developers クイックリプライを使う](https://developers.line.biz/ja/docs/messaging-api/using-quick-reply/)

※ 今回は簡単なメッセージを送るクイックリプライを実装しましたが、この他にも、位置情報やカメラロールの起動など[様々な機能](https://developers.line.biz/ja/docs/messaging-api/using-quick-reply/#%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)が使えますので気になる方は[この辺りのソース](https://github.com/line/line-bot-sdk-php/tree/master/src/LINEBot/TemplateActionBuilder)を参考にしてみてください。

#終わりに
余談ですが、ポートフォリオとしてLINEボットを作成される方もいるそうです。ECサイトや掲示板など似通ったものが多い中で、そういったものが作れると差別化が出来そうでいいですね。また、フロントの知識が弱くともバックエンドの知識だけでリッチなUIを実装できるLINEボットは時間対効果が高く、理にかなっているなぁと思いました。
……作りましょう！　LINEボット！！（深夜テンション）

少しでもお役に立ちましたらストックついでにLGTMお願いいたします！🙇‍♀️