LINEBOTを楽に実装できるPHPライブラリ作った

最近、LINEのMessagingAPIでガッツリLINEBOTを作る機会があり、そこでクラス化したものを使いやすく作り変えてみました。

ライブラリっていうほどのものでもないです。公式SDKよりはゆるく使えて入門編にはいいのかなーって感じです。

ソース

trial-message-api(GitHub):
github.com/kazztech/trial-messaging-api

LINEBOTの実装方法

簡単に流れを紹介します。詳細は別サイトを参考にして下さい。

  1. LineDevelopersに登録
  2. プロバイダ、チャネルを作成
  3. webhook先のSSL対応サーバーを契約 (Herokuとかなら無料でできるっぽいですね。)
  4. プログラムを書いてサーバーにアップロード
  5. 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);

今後

気が向いたらバージョンアップするかも

The present writer kazz.

関連記事

+SQLノート(MySQL)
+webスクレイピングで英単語の和訳を取得する
+Markdownで講義ノートを書くためのノート
+LINE BOTでPUSH送信
+LINEBOTで画像文字起こしと有害検出