PHPでLINEBotを作ってみた

はじめに

LINEのMessaging APIをつかって、簡単なBotを作ってみました。
簡単につくれるので、ぜひ、やってみてください。

公式サイトはこちらです。

https://developers.line.biz/ja/services/messaging-api/

環境

# 項目 バージョン
1 CentOS 7.8
2 PHP 7.2.29
3 Apache 2.4.6
4 ngrok(※) 2.3.35

(※)
Messaging API を使用するには、HTTPSを使用し、
認定認証局で発行されたSSL証明書が必要となります。
お試しのために、証明書を発行するのはもったいないので、
今回は、ngrokを使って、一時的にローカルサーバを外部に公開しました。

ngrok の設定

インストールは公式サイトからZIPファイルをダウンロードして、/usr/binに解凍したngrokを置くだけです。

https://ngrok.com/

インストール後、ngrok http 80でサーバを公開してみましょう。
ポート番号は、ご自身の環境に合わせて変更してください。

コマンドを実行すると下記が表示されるので、ForwardingにあるURLで接続します。
ドキュメントルートに簡易なファイル置いて、接続確認をしてみてください。

 $ ngrok http 80

 # 下記が表示される
 Session Status                online
 Session Expires               7 hours, 59 minutes
 Version                       2.3.35
 Region                        United States (us)
 Web Interface                 http://127.0.0.1:4040
 Forwarding                    http://05da5e3f63de.ngrok.io -> http://localhost:80
 Forwarding                    https://05da5e3f63de.ngrok.io -> http://localhost:80

 Connections                   ttl     opn     rt1     rt5     p50     p90
                               1       0       0.01    0.00    5.80    5.80

公開を停止する場合は、Ctrl+Cで停止します。
公開、停止するたびに、サブドメインが変わるので注意してください。

LINE Developers の設定

1. LINE Developers にログインする

https://developers.line.biz/ja/

LINEアカウントでログインできるので、自身のLINEアカウントでログインします。
LINEアカウントをもってない場合は、LINEアカウントを作りましょう。

2. MessagingAPI の設定をする

プロバイダーを作って、チャネルを作成します。
チャネル作成をするときに、Messaging APIを選択します。
お好きなチャネル名にし、その他必須事項を入力し、作成をクリックします。

3. Webhook URL の設定をする

Messaging API設定タブにあるWebhook URLに、先ほど、公開したサーバのURLを設定します。
さっきも言いましたが、ngrokは公開・停止のたびにURLが変わるので、URLが変わったらこの設定も変更してください。

応答メッセージ、あいさつメッセージも無効にしておきます。
ここの設定はお好きなように。
それと、チャネルアクセストークンが必要になるので、発行しておきます。

line-1

4. IPアドレスの許可

セキュリティ設定タブからサーバのIPを許可する

プログラム を書く

MessagingAPIから情報を受け取って返すためのコードを書いていきましょう。

1. メッセージを受け取る

//JSONデータを取得
$jsonAry = json_decode(file_get_contents('php://input'), true);
//メッセージ取得(配列)
$message = $jsonAry['events'][0]['message'];
//返信用トークン
$replyToken = $jsonAry['events'][0]['replyToken'];

JSONデータを取得した配列$jsonAryの中身は下記のようになっています。
ユーザが送ったメッセージと返信用のトークンが必要なので、変数にいれています。

Array
(
    [events] => Array
        (
            [0] => Array
                (
                    [type] => message
                    [replyToken] => XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                    [source] => Array
                        (
                            [userId] => XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                            [type] => user
                        )

                    [timestamp] => 1591942605921
                    [mode] => active
                    [message] => Array
                        (
                            [type] => text
                            [id] => 12130737336360
                            [text] => 送ったメッセージ
                        )

                )

        )

    [destination] => XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
)

2. メッセージを返す

ユーザが送ったメッセージに対して、「って、何ですか??」とつけて返してみましょう。

//チャネルアクセストークン(MessagingAPI設定から確認)
define('TOKEN', 'チャネルアクセストークンを記載');
//返信用のメッセージ配列を設定
$messageData = [
    'type' => 'text',
    'text' => '「'.$message['text'].'」って何ですか??',
];
//返信用の配列設定
$response = [
    'replyToken' => $replyToken,
    'messages' => [
        $messageData,
    ],
];
$ch = curl_init('https://api.line.me/v2/bot/message/reply');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8','Authorization: Bearer  ' . TOKEN ));
$result = curl_exec($ch);
curl_close($ch);

ここまでコードを書いたら、Messaging API設定タブにあるQRコードから
Botのチャネルをお友だち登録してみましょう。
そして、メッセージを送ってみると、「○○」って何ですか??と返ってくるはずです。

line-2

3. メッセージを2つ返す

さっきはメッセージを1つだけ返していましたが、連続でメッセージを返してみましょう。
「って何ですか??」のあとに、「もう1回、何をするか教えてください」と返してみましょう。

response配列のmessages要素に、返信メッセージを複数設定することで、複数メッセージを返すことができます。
最大5つまでは、送ることができます。

//チャネルアクセストークン(MessagingAPI設定から確認)
define('TOKEN', 'チャネルアクセストークンを記載');
//メッセージ1つ目
$messageData1 = [
    'type' => 'text',
    'text' => '「'.$message['text'].'」って何ですか??',
];
//メッセージ2つ目
$messageData2 = [
    'type' => 'text',
    'text' => 'もう1回、何をするか教えてください',
];
$response = [
    'replyToken' => $replyToken,
    'messages' => [
        $messageData1, //メッセージ1つ目
        $messageData2, //メッセージ2つ目
    ],
];
$ch = curl_init('https://api.line.me/v2/bot/message/reply');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8''Authorization: Bearer   ' . TOKEN ));
$result = curl_exec($ch);
curl_close($ch);

line-3

4. テキストメッセージ以外を返す

テキストメッセージ以外にも、スタンプや画像、確認メッセージを返すことができます。
今回は、確認メッセージを返してみましょう。
PC用のLINEアプリでは確認メッセージは使用できないのでご注意ください。

ユーザが送ったメッセージに対し確認メッセージを返します。
「はい」「いいえ」以外のメッセージがきた場合に、確認メッセージを出すようにして、
「はい」、「いいえ」の返答に応じて、返すメッセージを変えてみましょう。
ユーザの返答に応じて、さまざま処理を分岐させることができます。

//チャネルアクセストークン(MessagingAPI設定から確認)
define('TOKEN', 'チャネルアクセストークンを記載');
if ($message['text'] == 'はい') {
    $messageData = [
        'type' => 'text',
        'text' => 'あってた!良かった!',
    ];
} elseif ($message['text'] == 'いいえ') {
    $messageData = [
        'type' => 'text',
        'text' => '違うのー。。。',
    ];
} else {
    $messageData = [
        'type' => 'template',
        'altText' => '確認メッセージ', //PCでこのテンプレートは使用できないため、その場合にこのテキスが表示される
        'template' => [
            'type' => 'confirm',
            'text' => $message['text'].'と送りましたか?', //確認ボタンの上部のメッセージ部分
            'actions' =>[
                [
                    'type' => 'message',
                    'label' => 'はい', //確認ボタンに表示させたい文字
                    'text' => 'はい', //ボタンを押した際に送信させる文字(ボタンを押したタイミングLINE上に表示)
                ],
                [
                    'type' => 'message',
                    'label' => 'いいえ',
                    'text' => 'いいえ',
                ],
            ],
        ],
    ];
}
$response = [
    'replyToken' => $replyToken,
    'messages' => [
        $messageData,
    ],
];
$ch = curl_init('https://api.line.me/v2/bot/message/reply');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8','Authorization:  Bearer ' . TOKEN ));
$result = curl_exec($ch);
curl_close($ch);

line-4

おわりに

今回は、簡単にメッセージを返すだけのBotを作りました。
公式のガイドラインに詳細があるので、いろいろ試してみてください。

https://developers.line.biz/ja/docs/messaging-api/overview/