[目次]
LINE Messaging API | Webプログラミング!(2021年度)
LINE Messaging API
前提知識
- POSTリクエスト
- 連想配列 (またはクラス)
- JSON
- logging
準備
- (初回のみ)ドキュメントに従って, LINE Developersコンソールにログインします. 開発者登録します. プロバイダーを作ります.
典型的プログラム作成-デバッグサイクル
- Bot 1個に対応して, チャンネルを作ります. Developer Trial を選びます. アクセストークンを再発行し, Channel ID, Channel Secret, AccessToken を記録します.
- LINEモバイルアプリで, QRコードを使ってBotを友だち登録します.
- lineconfig.php に Channel ID, Channel Secret, AccessToken を書く
- ca.comのContainerとして PHP7 を選ぶ
- ca.comにスクリプト なんとか.php を書く
- LINE Developers コンソールで Webhook 送信を利用すると設定し, Webhook URLに https://ca.com/なんとか.php を Webhook URL として登録する.
- 更新し, 接続確認する.
- 必要に応じて, LINE Developers コンソールで自動応答メッセージ, 友だち追加時あいさつの利用の有無を設定する.
- (test)LINEモバイルアプリからBotにメッセージを送る. 期待した反応が返ってきたら終了.
- ca.com の SSH Terminal で(Ubuntuの場合) sudo tail /var/log/apache2/error.log, (CentOSの場合) sudo tail /var/log/httpd/error_log してエラーメッセージを確認する.
-
PHPプログラム内で, 自分の望む文字列(例えば, postされた, postする連想配列全体)をエラーメッセージとして出力し, そのまま実行を続けさせることができる.
error_log(文字列); error_log(print_r(連想配列,true));
-
PHPプログラム内で, 自分の望む文字列(例えば, postされた, postする連想配列全体)をエラーメッセージとして出力し, そのまま実行を続けさせることができる.
- エラーメッセージに応じて, なんとか.php を書き直す.
- (test)にもどる
サンプル1
メッセージを送信(返信)する方法です.
URL(https://...../ojiro.php)をWebhookに登録します. 更新したら, 接続確認します.
サンプル1ojiro.php
<?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];
error_log(print_r($post_data,TRUE));
$messageData = [[
'type' => 'text',
'text' => 'バケラッタ!'
]];
//error_log(print_r($messageData,TRUE));
//error_log(print_r("afo".$replyToken,TRUE));
sendMessage($replyToken,$messageData);
function sendMessage($replyToken,$messageData){
global $accessToken;
$post_data=json_encode(['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, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
));
$result = curl_exec($ch);
curl_close($ch);
error_log(print_r($post_data,TRUE));
error_log(print_r($result,TRUE));
return $result;
}
// Local Variables:
// mode:php
// End:
lineconfig.php
<?php
$channelid=''; // a.k.a. client_id
$channelsecret=''; // a.k.a. client_id
$accessToken = '';//
サンプル1'
LINE Messaging APIへのリクエスト/からのレスポンスはJSONでやってるのだが, 上ではなるべくPHPの連想配列に変換してやっている. JSONで直に書くこともできる→サンプル4
サンプル2
サンプル2イベントが起きた際に返信することができます. いちばん単純なイベントは, メッセージの受信です.
URL(https://...../parrot.php)をWebhookに登録します.
parrot.php
<?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];
$text=$post_data["events"][0]["message"]["text"];
error_log(print_r($post_data,TRUE));
$messageData = [[
'type' => 'text',
'text' => "「".$text."」だって〜"
]];
sendMessage($replyToken,$messageData);
function sendMessage($replyToken,$messageData){
global $accessToken;
$post_data=json_encode(['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, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
));
$result = curl_exec($ch);
curl_close($ch);
error_log(print_r($post_data,TRUE));
error_log(print_r($result,TRUE));
return $result;
}
// Local Variables:
// mode:php
// End:
課題
- 数nをテキストメッセージで受け取って, 2*nをテキストメッセージとして返す bot を作ろう.
- 数nをテキストメッセージで受け取って, 1からnまでの九九表をテキストメッセージとして返す bot を作ろう.
サンプル3
サンプル2様々なメッセージタイプがあり, それを複数個組み合わせて, 1個のレスポンスとして返信することができます.
URL(https://...../multi.php)をWebhookに登録します.
multi.php
<?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];
error_log(print_r($post_data,TRUE));
$messageData = [
[
'type' => 'text',
'text' => 'バケラッタ!'
],
[
'type' => 'sticker',
'packageId' => '2',
'stickerId' => '144'
],
[
'type' => 'image',
'originalContentUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png',
'previewImageUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png'
]
];
//error_log(print_r($messageData,TRUE));
//error_log(print_r("afo".$replyToken,TRUE));
sendMessage($replyToken,$messageData);
function sendMessage($replyToken,$messageData){
global $accessToken;
$post_data=json_encode(['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, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
));
$result = curl_exec($ch);
curl_close($ch);
error_log($post_data,TRUE);
error_log(print_r($result,TRUE));
return $result;
}
// Local Variables:
// mode:php
// End:
課題
- テキストメッセージを受け取って, 先頭5文字を5個のメッセージで1文字ずつ返信するbot を作ろう.
サンプル4
サンプル2返信メッセージを, PHPの連想配列でなく, JSONで書いた例. いいところも悪いところも…
URL(https://...../multi2.php)をWebhookに登録します.
multi2.php
<?php
require_once("lineconfig2.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];
error_log(print_r($post_data,TRUE));
$messageDataArray = [
[
'type' => 'text',
'text' => 'バケラッタ!'
],
[
'type' => 'sticker',
'packageId' => '2',
'stickerId' => '144'
],
[
'type' => 'image',
'originalContentUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png',
'previewImageUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png'
]
];
$messageDataJSON="[
{
\"type\":\"text\",
\"text\":\"\u30d0\u30b1\u30e9\u30c3\u30bf!\"},
{\"type\":\"sticker\",
\"packageId\":\"2\",
\"stickerId\":\"144\"
},
{
\"type\":\"image\",
\"originalContentUrl\":\"https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png\",
\"previewImageUrl\":\"https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png\"
}
]";
//sendMessage($replyToken,$messageDataArray);
sendMessageJSON($replyToken,$messageDataJSON);
function sendMessage($replyToken,$messageData){
global $accessToken;
$post_data=json_encode(['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, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
));
$result = curl_exec($ch);
curl_close($ch);
error_log($post_data);
error_log(print_r($result,TRUE));
return $result;
}
function sendMessageJSON($replyToken,$messageData){
global $accessToken;
$post_data="{
\"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, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . $accessToken
));
$result = curl_exec($ch);
curl_close($ch);
error_log($post_data);
error_log(print_r($result,TRUE));
return $result;
}
// Local Variables:
// mode:php
// End: