Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
30
Help us understand the problem. What are the problem?

[PHP] Messaging APIを使ったLINEbotで色々試してみる

今回の題

API系の記事はこれで3つ目です!
前回→[PHP] Zoom APIを利用してミーティングを作成する
前々回→[PHP] YouTube APIの利用(動画情報の取得)

今回はタイトルの通り、LINEbotを作りましょう!
LINE DevelopersのMessagingAPIというものを利用すれば、自分好みのLINEbotが簡単に作れます。
この記事では、

  • おうむ返し
  • ボタン
  • confirm
  • カルーセル
  • クイックリプライ
  • 日付選択アクション

などを作ってみます。

必要なもの

  • サーバー

ssl化が必須です。
私はconohaで動かしてますが、ググるとherokuを使った記事を多く見かけました。

チャネルシークレットとチャネルアクセストークンの取得

4つの段階に分けて説明していきます。

1. 開発者用のアカウントを作成

以下にアクセスし、LINEのアカウントを使ってログインしてください。
LINE Developers

2. プロバイダーの作成

以下のページの左サイドバーにプロバイダーという項目があると思うので選択し、画面中央辺りの「作成」を押してください。
LINE Developers コンソール

スクリーンショット 2020-07-08 5.00.01.png

作成するプロバイダー名を求められるので適当に入力し、「作成」を押したらプロバイダーの作成は完了です!
スクリーンショット 2020-07-08 5.12.40.png

3. チャネルの作成

プロバイダーの作成後、以下のようなページに飛ばされます。
画像内の赤枠の「Messaging API」を選択してください。
スクリーンショット 2020-07-08 5.13.55.png

チャネルを作成する画面に飛ぶので、必須項目を全て入力し、「作成」を押したらチャネルの作成は完了です!
スクリーンショット 2020-07-08 5.20.24.png

4. チャネルシークレットとチャネルアクセストークンの取得

チャネルの作成後、作成したチャネルの設定ページに飛ばされます。
チャネルシークレットとチャネルアクセストークンの取得はどちらもこのページを起点にします。
スクリーンショット 2020-07-08 5.42.04.png

  • チャネルシークレット
    チャネル基本設定のタブの下の方に載っています。
    あとで使うのでコピーしておいてください。
    スクリーンショット 2020-07-08 5.48.50.png

  • チャネルアクセストークン
    Messaging API設定のタブの下の方に載っています。
    初期状態だと何も表示されていませんが、右にある「発行」を押すと表示されます。
    これもあとで使うのでコピーしておいてください。
    スクリーンショット 2020-07-08 5.53.32.png

以上でチャネルシークレットとチャネルアクセストークンがGETできました。

Webhook設定

Messaging API設定のタブの中央辺りに欄があるので、リクエストを受け取るURLを設定し、Webhookの利用を有効にします。
スクリーンショット 2020-07-08 9.10.50.png

botを友達に追加

Messaging API設定のタブの上の辺りにQRコードがあるので読み取って友達に追加しておきましょう。

そろそろコードを書いていきます。

LINE Messaging API SDK for PHPのインストール

composerを使ってインストールします。

$ composer require linecorp/line-bot-sdk

LINE Messaging API SDK for PHPのソースコードは以下です。
LINE Messaging API SDK for PHP

コードの例

実際に動かしたコードをそのまま載せておきます。
なので、チャネルシークレットとチャネルアクセストークンをセットすればコピペで動きます。

1. おうむ返し。

ただテキストを返すだけ!

<?php
require('vendor/autoload.php');

use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;

//先ほど取得したチャネルシークレットとチャネルアクセストークンを以下の変数にセット
$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();
$reply_text = $event->getText();
$bot->replyText($reply_token, $reply_text);

2. ボタン

個人的に一番使います。便利。

<?php
require('vendor/autoload.php');

use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ButtonTemplateBuilder;

$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();

$yes_button = new PostbackTemplateActionBuilder('はい', 'button=1');
$no_button = new PostbackTemplateActionBuilder('キャンセル', 'button=0');
$actions = [$yes_button, $no_button];
$button = new ButtonTemplateBuilder('タイトル', 'テキスト', '', $actions);
$button_message = new TemplateMessageBuilder('タイトル', $button);
$bot->replyMessage($reply_token, $button_message);

ButtonTemplateBuilderの第3引数に画像のURLを渡せば少しおしゃれなボタンができるのでお試しあれ!

3. confirm

ボタンをもっとシンプルにしたようなやつです。

<?php
require('vendor/autoload.php');

use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ConfirmTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;

$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();

$yes_confirm = new PostbackTemplateActionBuilder('はい', 'confirm=1');
$no_confirm = new PostbackTemplateActionBuilder('いいえ', 'confirm=0');
$actions = [$yes_confirm, $no_confirm];
$confirm = new ConfirmTemplateBuilder('メッセージ', $actions);
$confirm_message = new TemplateMessageBuilder('confirm', $confirm);
$bot->replyMessage($reply_token, $confirm_message);

4. カルーセルメッセージ

<?php
require('vendor/autoload.php');

use LINE\LINEBot;
use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\Event\PostbackEvent;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselColumnTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselTemplateBuilder;

$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();

$columns = [];
// カルーセルの各カラムを生成(5つまで)
for ($i = 1; $i < 5; $i++) {
    $yes = new PostbackTemplateActionBuilder('はい', 'button=yes');
    $cancel = new PostbackTemplateActionBuilder('キャンセル', 'button=no');
    $actions = [$yes, $cancel];
    $column = new CarouselColumnTemplateBuilder("タイトル", "本文", "画像のURL", $actions);
    $columns[] = $column;
}
// カラムをカルーセルに組み込む
$carousel = new CarouselTemplateBuilder($columns);
$builder = new TemplateMessageBuilder("テスト", $carousel);
$bot->replyMessage($this->reply_token, $builder);

5. クイックリプライ

長いので別記事にまとめました
[PHP] LINE ボットでクイックリプライを使う

日時選択アクション

ボタンやconfirmと合わせて使います。
LINE botは他のAPIと組み合わせて作成することが多いので、以下のコードで日付を送信できるということを覚えておけば何かと役立つと思い載せておきます。

<?php
require('vendor/autoload.php');

use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;
use LINE\LINEBot\TemplateActionBuilder\DatetimePickerTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ButtonTemplateBuilder;

$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();

$date_time = new DatetimePickerTemplateActionBuilder('日付を選択', 'storeId=12345', 'datetime');
$no_button = new PostbackTemplateActionBuilder('キャンセル', 'button=0');
$actions = [$date_time, $no_button];
$button = new ButtonTemplateBuilder('タイトル', 'テキスト', '', $actions);
$button_message = new TemplateMessageBuilder('タイトル', $button);
$bot->replyMessage($reply_token, $button_message);

ボタンからのリクエストの取得

ユーザーがボタンを押した時のリクエストは以下のコードで配列の形にして取得できます。

$postback_data = $event->getPostbackData();
parse_str($postback_data, $data);

まだあるけどキリがないので……とりあえず以上!

最後に

LINE Messaging API SDK for PHPを使うには、記事中で挙げたSDKのソースをしっかり追う必要があり初めは中々に手間です😩
今回の記事ではよく使うアクションをそのまま使えるコードを添えて書いたので、もしこれからソースを追おうとしている方などの参考になれば幸いです!

少しでも参考になりましたらいいね(LGTM)やコメントなどいただけると嬉しいです!😬
良いLINEbotライフを!!

参考

LINE Developers APIリファレンス
line-bot-sdk-php
他にもあったのですが、昔、Qiitaで参考にした記事が見つからず……。

Why not register and get more from Qiita?
  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
30
Help us understand the problem. What are the problem?