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行目)。


PAGE TOP