最近、LINEのMessagingAPIでガッツリLINEBOTを作る機会があり、そこでクラス化したものを使いやすく作り変えてみました。
ライブラリっていうほどのものでもないです。公式SDKよりはゆるく使えて入門編にはいいのかなーって感じです。
Contents
ソース
trial-message-api(GitHub):
github.com/kazztech/trial-messaging-api
LINEBOTの実装方法
簡単に流れを紹介します。詳細は別サイトを参考にして下さい。
- LineDevelopersに登録
- プロバイダ、チャネルを作成
- webhook先のSSL対応サーバーを契約 (Herokuとかなら無料でできるっぽいですね。)
- プログラムを書いてサーバーにアップロード
- webhookとプログラムの関連付け
使い方
PHP7.1以上必須
サンプルコード:
github.com/kazztech/trial-messaging-api/blo…
MessagingAPI公式リファレンス:
https://developers.line.biz/ja/reference/messa…
必須:インスタンス化
読み込んだMessagingApiクラスにLINEDevelopersの管理画面から発行したアクセストークン、チャンネルシークレットとメッセージオブジェクトを設定します。
require "./MessagingApi.php";
const ACCESS_TOKEN = "";
const CHANNEL_SECRET = "";
$requestBody = file_get_contents("php://input");
$messageObject = json_decode($requestBody, true);
$line = new MessagingApi(ACCESS_TOKEN, CHANNEL_SECRET, $messageObject);
// or MessagingApi(ACCESS_TOKEN) // callbackではない場合はACCESS_TOKENのみで可
任意:送信元の検証
isSignProperメソッドで送信元の検証を行います。秘密鍵とリクエストボディをハッシュ化してリクエストヘッダのシグネチャと比較しリクエストの正当性を検証しています。
if (!$line->isSignProper($requestBody))
die("検証失敗、不正なアクセス");
任意:返信
eventMatchedメソッドの引数にアクションタイプをスラッシュ区切りで設定します。マッチした場合にtrueが帰ってきます。この場合はテキストメッセージの内容の末尾に「とは?」をつけて返信します。
if ($line->eventMatched("message/text")) {
$replyText = $messageEvent["message"]["text"] . "とは?";
$messages = [];
$messages[] = [
"type" => "text",
"text" => $replyText
];
$line->sendReply($messages);
}
第二引数にtrueをとることで受信側に通知が表示されなくなります。
$line->sendReply($messages, true);
任意:ユーザー情報の取得
userIdをもとにユーザー情報を取得します。名前、アイコン、ステータスメッセージが取得可能です。これは友だち追加時のメッセージにユーザー名を含めた例です。
// 友だち追加orブロック解除時のイベント
if ($line->eventMatched("follow")) {
$userProfileObject = $line->getUserProfile($messageEvent["source"]["userId"]);
$messages = [];
$messages[] = [
"type" => "text",
"text" => "ようこそ、" . $userProfileObject["displayName"] . " さん!"
];
$line->sendReply($messages);
}
任意:送信されたコンテンツの取得
送信された画像、動画、音声、ファイルのバイナリデータを取得します。取得したデータをサーバーに保存する場合はfile_put_contentsなどを利用して下さい。
// 画像が送られてきたときのイベント
if ($line->eventMatched("message/image")) {
// 送信された画像のバイナリを取得
$contentBinary = $line->getBineryContent();
// 取得した画像データを保存
$imgPath = "images/" . $messageEvent["message"]["id"] . ".jpg";
file_put_contents($imgPath, $contentBinary);
}
任意:PUSH送信
sendPushMessageメソッドは第二引数のtoに設定したUserId宛にPUSHメッセージを送信します。sendBroadcastMessageメソッドは友達登録されている全ユーザーにメッセージを送信します。
$line = new MessagingApi(ACCESS_TOKEN);
$messages = [];
$messages[] = [
"type" => "text",
"text" => "PUSH送信もできる"
];
$line->sendPushMessage($messages, ["userid1", "userid2"]);
// or $line->sendBroadcastMessage($messages);
今後
気が向いたらバージョンアップするかも