Closed2

LINE Messaging API の Webhook で Bot を友だち追加したユーザーの User ID を取得する

A KidA Kid

前回の続きを少し。

LINE Bot からのメッセージ送信先として指定するためのユーザーIDは、LINEの画面上から確認することができない。
開発者自身はLINE Developers のコンソール画面から自分のIDを確認できるが、通常のLINE画面上ではAPI用のIDを確認することはできない。
また、Botの管理者側で、そのBotを友だち登録しているユーザーのIDを確認するようなこともできない
(認証済みアカウントまたはプレミアムアカウントではLINE公式アカウントを友だち追加したユーザーのリストを取得するAPIが使えるらしいが)。

普通のアカウントでそのBotを友だち登録したユーザーのIDを取得するためには、友だち登録されたときにコールされるWebhookで待ち受けておいて取得する必要がある。

A KidA Kid

簡単そうな Google Apps Script (GAS) での取得を試す。

やりたいこと

Botが友だち追加されたり、Botにメッセージ送信されたタイミングで、その内容をGoogle Drive上のスプレッドシートに記録する。
このときに User ID もあわせて記録しておく。

準備

Google Drive上のどこかに保存先となるスプレッドシートのファイルを作っておく。
ブラウザ上で開いたときのURLから、ファイルのIDを確認( https://docs.google.com/spreadsheets/d/[この部分]/edit )。

GAS 側のコード作成

  • Google Drive 上の任意のフォルダで新規 Google Apps Script を作成
  • プロジェクトの設定 > スクリプト プロパティ が環境変数的なものみたいなので、ここに LINE のチャネルアクセストークンを設定しておく
    • ここでは LINE_ACCESS_TOKEN という名前にした
      • 使うときは PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN")
    • ⇒GAS側から何か応答メッセージを送るわけでなければ別にtoken必要なかった

スクリプト全体はこんな感じ。

function doPost(e) {
  const events = JSON.parse(e.postData.contents).events;

  // スプレッドシートを開いて、1シート目を使用
  const targetBook = SpreadsheetApp.openById("[ファイルID]");
  const targetSheet = targetBook.getSheets()[0];

  for (let eventData of events) {
    // 受信イベントデータから必要な項目を取得
    const time = new Date(eventData.timestamp);
    const eventType = eventData.type;
    // ※友だち追加のイベント(type:follow)とかのときは
    //  messageフィールド自体がないので注意
    const messageType = eventData.message?.type;
    const messageText = eventData.message?.text;
    const userId = eventData.source?.userId;

    // 最後の行のあとに追加
    targetSheet.appendRow([time, eventType, userId, messageType, messageText, eventData]);
  }
}

timestampのところは、ちゃんとやるならタイムゾーンとか気にしないとだめそうだけど、今回はおまけなので省略。

応答のメッセージを返したい場合のサンプルは こちらなどにありました。

GAS デプロイ

このへんはどちらかというとGASの基本なのだと思う。

初回デプロイ

  • デプロイ > 新しいデプロイ で、以下を設定して「デプロイ」実行
    • 種類の選択 > ウェブアプリ
    • 「次のユーザーとして実行」は自分に
    • 「アクセスできるユーザー」は全員に
  • 「このウェブ アプリケーションを使用するには、データへのアクセスを許可する必要があります。」と表示されるので、「アクセスを承認」をクリック → Google アカウントを選択
  • 「Google hasn’t verified this app」というエラーになった(日本語環境だと「このアプリは確認されていません」になる?)
  • 「デプロイを更新しました」という画面で、表示されるURLを控えておく

2回目以降のデプロイ

  • デプロイ > デプロイを管理
  • 前回のデプロイを選んで、編集アイコンクリック
  • バージョンで「新バージョン」を選択して「デプロイ」実行

LINE 側で Webhook 設定

  • LINE Developers コンソールで、チャネルを選択して、Messaging API設定タブ > Webhook URL に先ほどのURLを貼り付ける
    • URL欄の下に「Webhookの利用」チェックがあるので、忘れずにONにしておく

このスクラップは2023/01/09にクローズされました