【LINE】分析系の Messaging API を叩いてみる

2021.04.20

吉川@広島です。

LINE Messaging API というとお知らせ通知や自動返信といったメッセージ送信 API のイメージが強いかと思いますが、例えば送信したメッセージについてどれくらい反応があったのかというような分析系のAPIも存在しています。

Messaging APIリファレンス

本記事ではこれらの分析 API を叩いてみた結果を共有したいと思います。

環境

  • Node.js 14.x
  • TypeScript 4.1.3
  • line-bot-sdk-nodejs 7.2.0
  • REST Client 0.24.5

VSCode REST Client

本記事では API クライアントとして VSCode プラグインの REST Client を使っています。

REST Client については下記などご参考下さい。

[VSCode] REST Client は変数を使うとAPIの環境やパラメータ変更が楽になる!

Channel Access Token

チャネルアクセストークン

各 API を叩くのに必要なチャネルアクセストークンは LINE Developers にて チャネル選択→「Messaging API設定」→「チャネルアクセストークン」より取得 が可能です。

本記事では検証用チャネルを作成して実施しました。

メッセージの送信数を取得する

リクエスト

GET https://api.line.me/v2/bot/insight/message/delivery?date={DATE}
Authorization: Bearer {CHANNEL_ACCESS_TOKEN}

{DATE}20210416 のような形式で日付を渡します。

レスポンス

{
  "status": "ready",
  "autoResponse": 15,
  "welcomeResponse": 1,
  "apiReply": 1
}

statusready 以外の場合は別の有効な必要を指定する必要があります。

ready:メッセージ数を取得できます。
unready:dateに指定した日付のメッセージ数の集計がまだ完了していません。しばらくしてからリクエストを再実行してください。通常、集計処理は翌日中に完了します。
out_of_service:dateに指定した日付が、集計システムの稼働開始日(2017年03月01日)より前です

友だち数を取得する

リクエスト

GET https://api.line.me/v2/bot/insight/followers?date={DATE}
Authorization: Bearer {CHANNEL_ACCESS_TOKEN}

{DATE}20210416 のような形式で日付を渡します。

レスポンス

{
  "status": "ready",
  "followers": 1,
  "targetedReaches": 1,
  "blocks": 0
}

友達は私一人だけなので、意図通りの値が返ってきていますね。

友だちの属性情報に基づく統計情報を取得する

リクエスト

GET https://api.line.me/v2/bot/insight/demographic
Authorization: Bearer {CHANNEL_ACCESS_TOKEN}

レスポンス

{
  "available": false,
  "genders": [],
  "ages": [],
  "areas": [],
  "appTypes": [],
  "subscriptionPeriods": []
}

availablefalse になっていますが、これは以下によるものと思われます。

また、統計情報を表示するには20人以上のターゲットリーチが必要です。

検証用のプロジェクトで私一人しかユーザがおらず、上記を満たしていないからですね。

ユーザーの操作に基づく統計情報を取得する

下準備 (ブロードキャストメッセージを送信)

LINE公式アカウントから送信したナローキャストメッセージまたはブロードキャストメッセージに対して、ユーザーがどのように操作したかを示す統計情報を確認できます。

ということなので、分析対象となるナローキャストメッセージかブロードキャストメッセージを送信する必要があります。今回はブロードキャストメッセージを送信することにします。

line-bot-sdk-nodejs を使った以下の TypeScript コードを書きました。

import { Client, LINE_REQUEST_ID_HTTP_HEADER_NAME } from '@line/bot-sdk'

const main = async () => {
  const client = new Client({
    channelAccessToken: process.env['LINE_CHANNEL_ACCESS_TOKEN'] as string,
  })

  const broadcastResult = await client.broadcast({
    type: 'text',
    text: 'hello',
  })
  console.log(
    'broadcast requestId: ',
    broadcastResult[LINE_REQUEST_ID_HTTP_HEADER_NAME]
  )
}

main()

実行前に下のように LINE_CHANNEL_ACCESS_TOKEN 環境変数をセットしておきます。

export LINE_CHANNEL_ACCESS_TOKEN={CHANNEL_ACCESS_TOKEN}

その後、トランスパイルして実行すると

broadcast requestId: xxxxxxxxxxxxxxxxxxxxxxx

とリクエスト ID を得られるので、これを控えておきます。

リクエスト

GET https://api.line.me/v2/bot/insight/message/event?requestId={REQUEST_ID}
Authorization: Bearer {CHANNEL_ACCESS_TOKEN}

{REQUEST_ID} に先程取得したリクエスト ID を渡します。

レスポンス

{
  "overview": {
    "requestId": "{REQUEST_ID}",
    "timestamp": 1618822800,
    "delivered": 1,
    "uniqueImpression": null,
    "uniqueClick": null,
    "uniqueMediaPlayed": null,
    "uniqueMediaPlayed100Percent": null
  },
  "messages": [],
  "clicks": []
}

uniqueClick などの値が null なのは、以下によるものと思われます。

またプライバシーを保護するため、次のような場合、個人の操作に関するプロパティの値はnullになります。
プロパティの値が20未満だった場合
プロパティの値が20以上であっても、そのイベントを発生させた実人数が20人未満だった場合(たとえばmessages[].mediaPlayedは30だが、messages[].uniqueMediaPlayedが15だった場合は、どちらの値もnullになります)

たしかに、クリックした人数があまりに少ない場合、具体的に誰のことか予測できてしまう場合があるのかもしれません。

まとめ

今回は検証用チャネルを使っており、ユーザがいない & 実践的な送信メッセージがないのであまり面白い数値は得られていません。しかしドキュメントを見て頂くとわかるようにデータがしっかりある場合はかなり色々な項目を得ることができます。

以上、参考になれば幸いです。