📌

LINEのOpenAPIが公開されたので触ってみた

2023/08/07に公開

はじめに

LINEのOpenAPIが2023/07/05に公開されました。
https://developers.line.biz/ja/news/2023/07/05/open-api/
せっかくなのでMessagingAPIを中心にどのような挙動をするのか確認してみます。
今回はAPIを利用した複数の送信方法で、インプレッションがどのように取得できるのかをテーマに調査してみました。

MessagingAPIにおけるメッセージ送信方法のおさらい

それぞれの送信方法における違いのポイントを簡単に記載していきます。

PushAPI

ユーザー、グループトーク、または複数人トークに、任意のタイミングでメッセージを送信する。

byNameで複数ユーザーを送信先に指定することは不可
基本的に1to1でのメッセージに利用する

MulticastAPI

複数のユーザーに対して同じメッセージを効率よく送信する。
グループトークまたは複数人トークにメッセージを送ることは不可。

byNameで複数ユーザーにメッセージを送信することが可能
送信対象が1人の場合には低遅延であるPushAPIが推奨されている

NarrowcastAPI

複数のユーザーに、任意のタイミングでメッセージを送信する。
送信対象は、属性情報(性別や年齢、OSの種類、地域など)やリターゲティング(オーディエンス)を利用して指定可能。
グループトークまたは複数人トークにメッセージを送ることは不可。

byNameで単数&複数ユーザーにメッセージを送信することは不可
LINEの持つユーザー情報を利用し、セグメント配信をすることが可能
ユーザー情報でセグメント指定して送信する場合は、LINE公式アカウントのターゲットリーチが100人以上である必要がある。
満たしていなかった場合は非同期で走る送信処理開始時にエラー
送信条件に属性情報またはオーディエンスを指定した場合、最終的な送信対象が50人以上である必要がある。
満たしていなかった場合は非同期で走る送信処理開始時にエラー
LINEプラットフォームがリクエストを受信した後にバックグラウンドで非同期に送信。ナローキャストメッセージを送信するリクエストが成功していたとしても、送信開始後に失敗している可能性がある。

BroadcastAPI

LINE公式アカウントと友だちになっているすべてのユーザーに、任意のタイミングでメッセージを送信する。
友達登録している全ユーザーにメッセージを送信

準備

今回はPostmanで実際にAPIを叩く形でレスポンスなどを確認していこうと思います。
https://www.postman.com/

対象となる定義ファイルは以下となります。
https://github.com/line/line-openapi/blob/main/insight.yml
同ディレクトリに存在するmessaging-api.ymlとは別になっているので若干、混乱しました。

インプレッションを取得する上での注意点

こちらも最初落とし穴にハマったのですが、送信方法によってインプレッション取得のAPIは分かれているみたいです。

  • PushAPI及びMulticastAPI:getStatisticsPerUnitAPI
  • NarrowcastAPI及びBroadcastAPI:getUserInteractionStatisticsAPI

となります。
そのため、PushAPI及びMulticastAPIでインプレッションを取得するためには、送信時にcustomAggregationUnitを付与する必要があります。

実際に叩いてみよう!

case.1:PushAPIのインプレッションを取得してみる

  1. PushAPIの実行(customAggregationUnitを付与)
  2. customAggregationUnitを指定してgetStatisticsPerUnitAPIの実行(未読状態)
  3. LINEアプリからメッセージを開封
  4. customAggregationUnitを指定してgetStatisticsPerUnitAPIの実行:(既読状態)

未読状態のレスポンス

{
    "overview": {
        "uniqueImpression": null,
        "uniqueClick": null,
        "uniqueMediaPlayed": null,
        "uniqueMediaPlayed100Percent": null
    },
    "messages": [],
    "clicks": []
}

既読状態のレスポンス

{
    "overview": {
        "uniqueImpression": null,
        "uniqueClick": null,
        "uniqueMediaPlayed": null,
        "uniqueMediaPlayed100Percent": null
    },
   "messages": [
        {
            "seq": 1,
            "impression": null,
            "uniqueImpression": null,
            "mediaPlayed": null,
            "mediaPlayed25Percent": null,
            "mediaPlayed50Percent": null,
            "mediaPlayed75Percent": null,
            "mediaPlayed100Percent": null,
            "uniqueMediaPlayed": null,
            "uniqueMediaPlayed25Percent": null,
            "uniqueMediaPlayed50Percent": null,
            "uniqueMediaPlayed75Percent": null,
            "uniqueMediaPlayed100Percent": null
        }
    ],
    "clicks": []
}

LINEAPIではインプレッションから個人を特定できないように、インプレッション数が20以下の場合、各パラメータをnullで返却するみたいです。
PushAPIで送信対象をグループや複数人チャットに指定していた場合、byNameの特定は難しいですが、個人宛に送信した場合は1人しかあり得ないので誰が既読をつけたかは自明ですね;;

case.2:MulticastAPIのインプレッションを取得してみる

  1. MulticastAPIの実行(customAggregationUnitを付与)
  2. customAggregationUnitを指定してgetStatisticsPerUnitAPIの実行(未読状態)
  3. LINEアプリからメッセージを開封(こちらは20以上のアカウントで試してみます)
  4. customAggregationUnitを指定してgetStatisticsPerUnitAPIの実行:(既読状態)

未読状態のレスポンス

{
  "overview": {
    "uniqueImpression": null,
    "uniqueClick": null,
    "uniqueMediaPlayed": null,
    "uniqueMediaPlayed100Percent": null
  },
  "messages": [],
  "clicks": []
}

既読状態のレスポンス

{
  "overview": {
    "uniqueImpression": 20,
    "uniqueClick": null,
    "uniqueMediaPlayed": null,
    "uniqueMediaPlayed100Percent": null
  },
  "messages": [
      {
        "seq": 1,
        "impression": 26,
        "uniqueImpression": 20,
        "mediaPlayed": null,
        "mediaPlayed25Percent": null,
        "mediaPlayed50Percent": null,
        "mediaPlayed75Percent": null,
        "mediaPlayed100Percent": null,
        "uniqueMediaPlayed": null,
        "uniqueMediaPlayed25Percent": null,
        "uniqueMediaPlayed50Percent": null,
        "uniqueMediaPlayed75Percent": null,
        "uniqueMediaPlayed100Percent": null
      }
    ],
  "clicks": []
}

ちゃんと20アカウント以上で既読をつけた場合はインプレッション数として返却されていますね。
やはり個人(アカウント)の特定は出来なさそうです。

case.3:BroadcastAPIのインプレッションを取得してみる

  1. BroadcastAPIの実行
  2. レスポンスヘッダのx-line-request-idを取得
  3. x-line-request-idを指定してgetUserInteractionStatisticsAPIの実行(未読状態)
  4. LINEアプリからメッセージを開封
  5. x-line-request-idを指定してgetUserInteractionStatisticsAPIの実行:(既読状態)

未読状態のレスポンス

{
  "overview": {
    "requestId": "8227619e-cea5-4517-a3e8-166d8b1637d6",
    "timestamp": 1689069600,
    "delivered": 4,
    "uniqueImpression": null,
    "uniqueClick": null,
    "uniqueMediaPlayed": null,
    "uniqueMediaPlayed100Percent": null
    },
  "messages": [],
  "clicks": []
}

既読状態のレスポンス

{
  "overview": {
    "requestId": "8227619e-cea5-4517-a3e8-166d8b1637d6",
    "timestamp": 1689069600,
    "delivered": 4,
    "uniqueImpression": null,
    "uniqueClick": null,
    "uniqueMediaPlayed": null,
    "uniqueMediaPlayed100Percent": null
  },
  "messages": [
    {
      "seq": 1,
      "impression": null,
      "mediaPlayed": null,
      "mediaPlayed25Percent": null,
      "mediaPlayed50Percent": null,
      "mediaPlayed75Percent": null,
      "mediaPlayed100Percent": null,
      "uniqueMediaPlayed": null,
      "uniqueMediaPlayed25Percent": null,
      "uniqueMediaPlayed50Percent": null,
      "uniqueMediaPlayed75Percent": null,
      "uniqueMediaPlayed100Percent": null
    }
  ],
  "clicks": []
}

getStatisticsPerUnitAPIに対してこちらはrequestId、timestamp、deliveredといくつか多くのパラメータが返ってきました。
特にdeliveredに関しては既読率、クリック率などの割合を出すためにgetStatisticsPerUnitAPIにも欲しいなと感じます。

補足

ちなみに、、、
まず利用用途はないと思いますが、PushAPIとMulticastAPIのx-line-request-idを指定してgetUserInteractionStatisticsAPIを実行した場合は以下のようなレスポンスになります。

{
  "message": "Not Found"
}

所感

PushAPIに関しては宛先が個人の場合、インプレッションが見えてしまうことがポリシーと反していないか若干気になりました。もしかするとこのAPI仕様を前提に機能開発することで、突然の仕様変更に戸惑う未来があるかもなと感じます。
また、customAggregationUnitに関しては月間1000ユニットまでの付与だったりと、いくつか注意しなければいけないポイント・制約は多そうです。
とはいえ、APIの利用制限を意識さえすれば十分にインプレッションデータとして活用できそうなものが取得できると感じました。

参考

GitHubで編集を提案
LiB Consulting

Discussion