LineのMessaging APIでグループトークの内容をデータベースに保存してみた

LineのMessaging APIでグループトークの内容をデータベースに保存してみた

タイトルに書いたとおり、LINEMessaging APIを触ってみました。
タイトルが長い。けど、やったことはタイトルに書いたとおり。

LINEは友人との連絡に使っていたのですが、最近多くなってきたのが仕事での利用。
簡単で便利なLINEですが、トークルームが増えてくると過去のメッセージを確認するのに手間がかかってしまい、管理ツールとしては使い勝手が悪いんですよね。チャットツールとしては良いのですが。

用途によってトークルームを作るわけですが、仕事で使うとなると、過去のメッセージを見返したりすることがあります。
また、特定のユーザーのメッセージだけを確認したいこともあるんですよね。

それがLINEのデフォルトの機能だとやりづらい、もしくはできない。
ということで、LINEトークルーム内のメッセージ(トーク)を所持しているデータベースに保存できないかと思ったわけです。DBに保存できれば、あとは好きなようにできますからね。

LINEトークルーム内のメッセージをデータベースに保存したい!

あらためて。
やりたいことは、LINEのトークルーム内のメッセージ(トーク)を取得してデーターベースに保存すること

ざっと調べてみて、

  1. LINEのMessaging APIと使ったボットを利用
  2. トークルームにボットを招待
  3. ボットが取得したメッセージ(トーク)をデータベースに保存 ※PHPとMySQLを利用

という流れにすることに。

LINEのMessaging APIを利用するための準備

Messaging APIを使えば、ボットアプリのサーバとLINEプラットフォームの間でデータを交換することが可能になります。
ユーザーがボットにメッセージを送るとwebhookがトリガーされるので、LINEプラットフォームからボットアプリのサーバのwebhook URLにリクエストが送信されることになります。

まず、なにはともあれMessaging APIとボットの準備。
Messaging APIを利用するには、LINE Developersコンソールでチャネルを作成し、LINE@でボット用のアカウントを作る必要があります。

LINE Developersコンソールでチャネル作成

LineのMessaging APIでグループトークの内容をデータベースに保存してみた

https://developers.line.me/console/

Messaging APIを使ってボットを作成するには、まずLINE Developersコンソールでチャネルを作成する必要があります。
作成は上記のコンソールから。

LINE@でボット用のアカウントを作成

LineのMessaging APIでグループトークの内容をデータベースに保存してみた

https://at.line.me/jp/

続いてボット用のLINE@アカウントを用意します。
このボットを友達登録してトークルームに招待することで、メッセージが取得できるようになります。

細かいMessaging APIの設定方法は下記マニュアルを参考に。
https://developers.line.me/ja/docs/messaging-api/overview/

結構やることありますが、マニュアル通り進めれば問題なく準備はできるはず。
LINEでのメッセージをボットがおうむ返しするくらいまでできていれば、メッセージを取得することはできているはずなので、あとはそのデータをDBに突っ込むだけです。

Messaging APIとボットでトークルームのメッセージを取得!

さて、Messaging APIとボットの準備ができたら、いよいよトークルームのメッセージをデータベースに保存していきます。

Lineの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());
  }
}

軽くコメントを書きましたが、やっているのは下記。

  1. メッセージを書き込んだユーザ情報を取得
  2. メッセージタイプが画像だった場合は画像を保存
  3. ユーザ情報やメッセージをデータベースに保存

LINE Messaging APIのアクセストークン等、データベース情報は環境に合わせて入力してください。
また、ユーザ情報は、メッセージを書き込んだユーザがボットと友達になっていないと取れません。トークルーム内のユーザ全ての情報を取るのであれば、全員にボットと友達になってもらう必要があります。

画像保存部分やテーブル設計はざっとやっているので……まあ、適当に。

LineのMessaging APIでグループトークの内容をデータベースに保存してみた

適当なトークルームを作り、ボットを招待して正しく動作するか確認。
サーバ・DBを確認する限り、問題なく動作しているようです。

LineのMessaging APIでグループトークの内容をデータベースに保存してみた

メッセージごとに、ユーザ情報・メッセージ(画像、テキスト)をデータベースに保存できているので、あとはゴニョゴニョして表示するだけ。
DBにどのように何を入れるか次第ですが、色々やれそう。

ここではとりあえず、ユーザや投稿日での絞り込みや、フリーワード検索をいれてみました。
さらに複数のトークルームをひとつのページに表示できるように。ひとまずの希望は叶えられた形。

まとめ

初めて触ってみたLINEのMessaging API。
LINE DevelopersやLINE@など色々登録しないといけないのが面倒ですが、公式のマニュアルに沿っていけばハマることなく進められました。

基本的には純粋なチャットアプリですが、内容をデータベースに保存できたことで色々な用途で使えそうだなと考えています。
特定のワードを書き込んだらほにゃららする、なんてこともできますね。面白い。

コメント

  1. ixwebhosting より:

    どうもありがとうございました!

コメントを残す

*