タイトルに書いたとおり、LINEのMessaging APIを触ってみました。
タイトルが長い。けど、やったことはタイトルに書いたとおり。
LINEは友人との連絡に使っていたのですが、最近多くなってきたのが仕事での利用。
簡単で便利なLINEですが、トークルームが増えてくると過去のメッセージを確認するのに手間がかかってしまい、管理ツールとしては使い勝手が悪いんですよね。チャットツールとしては良いのですが。
用途によってトークルームを作るわけですが、仕事で使うとなると、過去のメッセージを見返したりすることがあります。
また、特定のユーザーのメッセージだけを確認したいこともあるんですよね。
それがLINEのデフォルトの機能だとやりづらい、もしくはできない。
ということで、LINEトークルーム内のメッセージ(トーク)を所持しているデータベースに保存できないかと思ったわけです。DBに保存できれば、あとは好きなようにできますからね。
LINEトークルーム内のメッセージをデータベースに保存したい!
あらためて。
やりたいことは、LINEのトークルーム内のメッセージ(トーク)を取得してデーターベースに保存すること。
ざっと調べてみて、
- LINEのMessaging APIと使ったボットを利用
- トークルームにボットを招待
- ボットが取得したメッセージ(トーク)をデータベースに保存 ※PHPとMySQLを利用
という流れにすることに。
LINEのMessaging APIを利用するための準備
Messaging APIを使えば、ボットアプリのサーバとLINEプラットフォームの間でデータを交換することが可能になります。
ユーザーがボットにメッセージを送るとwebhookがトリガーされるので、LINEプラットフォームからボットアプリのサーバのwebhook URLにリクエストが送信されることになります。
まず、なにはともあれMessaging APIとボットの準備。
Messaging APIを利用するには、LINE Developersコンソールでチャネルを作成し、LINE@でボット用のアカウントを作る必要があります。
LINE Developersコンソールでチャネル作成
https://developers.line.me/console/
Messaging APIを使ってボットを作成するには、まずLINE Developersコンソールでチャネルを作成する必要があります。
作成は上記のコンソールから。
LINE@でボット用のアカウントを作成
https://at.line.me/jp/
続いてボット用のLINE@アカウントを用意します。
このボットを友達登録してトークルームに招待することで、メッセージが取得できるようになります。
細かいMessaging APIの設定方法は下記マニュアルを参考に。
https://developers.line.me/ja/docs/messaging-api/overview/
結構やることありますが、マニュアル通り進めれば問題なく準備はできるはず。
LINEでのメッセージをボットがおうむ返しするくらいまでできていれば、メッセージを取得することはできているはずなので、あとはそのデータをDBに突っ込むだけです。
Messaging APIとボットでトークルームのメッセージを取得!
さて、Messaging APIとボットの準備ができたら、いよいよトークルームのメッセージをデータベースに保存していきます。
まずはLINE DevelopersコンソールでWebhook URLを何かしらレンタルサーバーで運用しているものに。
ここではマニュアルに記載されているHerokuは使いません。
公式のPHP用のLINE Messaging APIのSDKがあるので、composerを使ってインストールしておきます。
インストール方法は下記に記載されていますよ。
https://github.com/line/line-bot-sdk-php
Webhook URLに記載したPHP(ここではcallback.php)の内容は下記のような感じに。
define("CHANNEL_ACCESS_TOKEN", 'コンソールで確認'); define("CHANNEL_SECRET", 'コンソールで確認'); $contents = file_get_contents('php://input'); $json = json_decode($contents); $event = $json->events[0]; $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(CHANNEL_ACCESS_TOKEN); $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => CHANNEL_SECRET]); // 個人トークの場合はグループに招待するようにメッセージ表示 if ($event->source->type != 'group') { $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder('グループに招待してください!'); } else { try { // メッセージを書き込んだユーザ情報を取得 $response = $bot->getProfile($event->source->userId); if ($response->isSucceeded()) { $profile = $response->getJSONDecodedBody(); $user_display_name = $profile['displayName']; $user_picture_url = $profile['pictureUrl']; $user_status_message = $profile['statusMessage']; $fileUrl = ""; // メッセージタイプが画像だった場合は画像を保存 if ($event->message->type == 'image') { function uploadImageThenGetUrl ($rawBody) { $im = imagecreatefromstring($rawBody); if ($im !== false) { $filename = date("Ymd-His") . '-' . mt_rand() . '.jpg'; imagejpeg($im, "images/uploads/" . $filename); } else { error_log("fail to create image."); } return $filename; } $res = $bot->getMessageContent($event->message->id); $fileUrl = uploadImageThenGetUrl($res->getRawBody()); } } // ユーザ情報やメッセージをデータベースに保存 $pdo = new PDO('mysql:host=ホスト;dbname=DB名;charset=utf8','ユーザ名','パスワード', array(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC)); $stmt = $pdo -> prepare("INSERT INTO talks (id, type, group_id, user_id, user_display_name, user_picture_url, user_status_message, talk_type, upload_image_name, time, reply_token, message_id, message_type, message_text, created_at) VALUES ('', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)"); $stmt->execute(array($event->type, $event->source->groupId, $event->source->userId, $user_display_name, $user_picture_url, $user_status_message, $event->source->type, @$fileUrl, $event->timestamp, $event->replyToken, $event->message->id, $event->message->type, $event->message->text)); } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); } }
軽くコメントを書きましたが、やっているのは下記。
- メッセージを書き込んだユーザ情報を取得
- メッセージタイプが画像だった場合は画像を保存
- ユーザ情報やメッセージをデータベースに保存
LINE Messaging APIのアクセストークン等、データベース情報は環境に合わせて入力してください。
また、ユーザ情報は、メッセージを書き込んだユーザがボットと友達になっていないと取れません。トークルーム内のユーザ全ての情報を取るのであれば、全員にボットと友達になってもらう必要があります。
画像保存部分やテーブル設計はざっとやっているので……まあ、適当に。
適当なトークルームを作り、ボットを招待して正しく動作するか確認。
サーバ・DBを確認する限り、問題なく動作しているようです。
メッセージごとに、ユーザ情報・メッセージ(画像、テキスト)をデータベースに保存できているので、あとはゴニョゴニョして表示するだけ。
DBにどのように何を入れるか次第ですが、色々やれそう。
ここではとりあえず、ユーザや投稿日での絞り込みや、フリーワード検索をいれてみました。
さらに複数のトークルームをひとつのページに表示できるように。ひとまずの希望は叶えられた形。
まとめ
初めて触ってみたLINEのMessaging API。
LINE DevelopersやLINE@など色々登録しないといけないのが面倒ですが、公式のマニュアルに沿っていけばハマることなく進められました。
基本的には純粋なチャットアプリですが、内容をデータベースに保存できたことで色々な用途で使えそうだなと考えています。
特定のワードを書き込んだらほにゃららする、なんてこともできますね。面白い。
コメント
どうもありがとうございました!