LINE Messaging APIのReply APIを使うと、LINEに登録したユーザーのユーザーIDを知ることができ、プッシュメッセージで個別メッセージを送ることができるようになります。
「個別メッセージを送るのなら、チャット機能を使えば良いのでは?」と思われるかも知れませんが、チャットで1対1のやり取りをするためには、まずはじめにユーザーからメッセージやスタンプを送ってもらう必要があります。
つまり、あなたのLINE公式アカウントに友だち追加しただけのユーザーに対してチャットでメッセージを送ることはできないのですが、ユーザーIDを取得すると、プッシュメッセージで個別メッセージを送ることができるというわけです。
ユーザーIDを取得するには、Reply API(LINE Bot)を使用します。bot.phpを次のように改良してください。
<?php
require_once __DIR__ . '/vendor/autoload.php';
define('SECRET', '********');
define('ACCESSTOKEN', '********');
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$event_type = $json_object->{"events"}[0]->{"type"};
$userId = $json_object->{"events"}[0]->{"source"}->{"userId"};
if($event_type === "follow" || $event_type === "unfollow"){
file_put_contents("follow.log", $event_type . " " .$userId . "\n", FILE_APPEND);
exit;
}
$replyToken = $json_object->{"events"}[0]->{"replyToken"};
$message_text = $json_object->{"events"}[0]->{"message"}->{"text"};
$message_type = $json_object->{"events"}[0]->{"message"}->{"type"};
if($message_type !== "text") {
$return_message = "文字を入力してください。";
} else {
if($message_text === "おみくじ") {
$result = array('大吉', '吉', '大凶');
$rand = rand(0, 2);
$return_message = $result[$rand] . "です。";
} else {
$return_message = "ちょっと何言ってるかわからない。";
}
}
$response_format_text = array( "type" => 'text', "text" => $return_message );
$post_data = array( "replyToken" => $replyToken, "messages" => [$response_format_text] );
$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( $post_data, JSON_UNESCAPED_UNICODE ));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charser=UTF-8',
'Authorization: Bearer ' . ACCESSTOKEN
));
curl_exec($ch);
curl_close($ch);
変更点として、まず11行目でReply APIで得られるイベントタイプを取得しています。そして、14行目から17行目で、イベントタイプが follow(友だち追加 or ブロック解除)またはunfollow(ブロック)のときに、ユーザーIDをfollow.logというファイルに出力し、exitで処理を終了しています。
follow.logは、bot.phpと同じディレクトリに作られます。ブロック→ブロック解除をした後に確認すると、次のように出力されているはずです(実際の運用では、ファイル出力ではなくてデータベースを使うのが一般的です)。
$ cat follow.log
unfollow U25445d14542ef6f83fc1f9813e283a73
follow U25445d14542ef6f83fc1f9813e283a73
今回のプログラムの例では、ユーザーが友だち追加したことを示すイベントタイプ = follow(unfollow)をトリガーにしてユーザーIDを取得していますので、登録済みのユーザーのユーザーIDを取得することはできません。登録済みのユーザーのユーザーIDを取得したい場合は、例えばメッセージ配信でユーザーからの返信を促すと良いでしょう(このとき、セグメント配信がとても役立ちます)。
また、今回のプログラムでは、メッセージタイプ(21行目)の処理を追加しています。Reply API(LINE Bot)は、テキストのメッセージだけではなくて、スタンプや画像の送信、位置情報の送信などにも反応するため、テキストメッセージでなければ「文字を入力してください」と返信するようにしています(21行目)。
