LoginSignup
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-12-12

今回の題

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

クイックリプライとは以下のようなやつです。
A2B97A33-0576-43F4-A53D-3B674BAAE189.jpeg
confirmやカルーセルの実装方法は以下の記事にまとめています。
[PHP] Messaging APIを使ったLINEbotで色々試してみる

前提

コードと説明

// 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でインポートして使用しています。

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

送信について

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

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

正しくはこう、

// 略
$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を適用したクラスに噛ませて送るような形になります。

全体図

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

<?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
LINE Developers クイックリプライを使う

※ 今回は簡単なメッセージを送るクイックリプライを実装しましたが、この他にも、位置情報やカメラロールの起動など様々な機能が使えますので気になる方はこの辺りのソースを参考にしてみてください。

終わりに

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3