目次
はじめに
LINEのMessaging APIをつかって、簡単なBotを作ってみました。
簡単につくれるので、ぜひ、やってみてください。
公式サイトはこちらです。
環境
| # | 項目 | バージョン |
|---|---|---|
| 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を置くだけです。
インストール後、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 にログインする
LINEアカウントでログインできるので、自身のLINEアカウントでログインします。
LINEアカウントをもってない場合は、LINEアカウントを作りましょう。
2. MessagingAPI の設定をする
プロバイダーを作って、チャネルを作成します。
チャネル作成をするときに、Messaging APIを選択します。
お好きなチャネル名にし、その他必須事項を入力し、作成をクリックします。
3. Webhook URL の設定をする
Messaging API設定タブにあるWebhook URLに、先ほど、公開したサーバのURLを設定します。
さっきも言いましたが、ngrokは公開・停止のたびにURLが変わるので、URLが変わったらこの設定も変更してください。
応答メッセージ、あいさつメッセージも無効にしておきます。
ここの設定はお好きなように。
それと、チャネルアクセストークンが必要になるので、発行しておきます。
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のチャネルをお友だち登録してみましょう。
そして、メッセージを送ってみると、「○○」って何ですか??と返ってくるはずです。
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);
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);
おわりに
今回は、簡単にメッセージを返すだけのBotを作りました。
公式のガイドラインに詳細があるので、いろいろ試してみてください。
