LINE Messaging API で受信したスタンプを特定するには・スタンプを送信するには

LINE Messaging API を使ったチャットボットで、ユーザから受信したスタンプの内容を特定して、それに応じたスタンプを返信してみたい、と思った。

今回は仕様を調べただけで、その結果が色々残念だったので、スタンプのやり取りは諦めることにした。

目次

ユーザから受信したスタンプを特定するには

ユーザからスタンプが送信されると、LINE Webhook サーバでは次のようなイベントオブジェクトを受け取れる。

{
  "events": [
    {
      "type": "message",
      "replyToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "source": {
        "userId": "uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
        "type": "user"
      },
      "timestamp": 1552500000000,
      "message": {
        "type": "sticker",
        "id": "9500000000000",
        "stickerId": "15555555",
        "packageId": "1000000"
      }
    }
  ],
  "destination": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}

スタンプの場合は message.typesticker なので、text などとは区別が付くだろう。

packageId というのがスタンプのパッケージを示す ID。ショップで購入できる「スタンプ集」のいち単位がコレに当たる。1つのパッケージに付き、最大40個のスタンプが配信されている。

stickerId というのが、そのパッケージ内の1つのスタンプを示す ID だ。

どんなイベントオブジェクトを受け取れるのかは以上だが、さてココからどうやって「どこのパッケージの何のスタンプか」を特定するか…。

スタンプ情報を取得する API はない

結論からいくと、スタンプ情報を取得できるような API はないので、packageIdstickerId が分かったら、手動で探しに行くしかない。

packageId を次の URL に結合してブラウザでアクセスすると、LINE スタンプのショップページに飛べる。

このページの HTML ソース中から、対象のスタンプの画像ファイルを探してみたのだが、次の URL に stickerId を当てはめれば、スタンプの画像ファイルが取得できることが分かった。

そもそもの話になるが、スタンプ一つひとつがどんな内容を示しているのかが分かるような Alt Text は存在しないので、あとはこの画像ファイルからスタンプを目視確認して、「コレは『ありがとう』スタンプだな」「コレはガッカリしてるスタンプだな」などと人力で見極めていくしかない。

当たり前だが世界中のクリエイターズスタンプの中身を調べることは不可能に近いので、自分で調べた範囲のスタンプにしか反応できないチャットボットになりそうだ。

チャットボットからスタンプを送信するには

チャットボットからスタンプメッセージを送信することはできるようで、API も簡単なのだが、送れるスタンプが LINE 公式のモノに限られる、という残念な仕様だった。

公式で用意されているスタンプを送信することが出来ます。

相手から送られてくるスタンプはすべて識別可能だが、悲しいことにLINE Botからユーザに送るスタンプは「標準スタンプ」に限定される。何が「標準」かという話だが、LINE登録すると初期状態から使える「デフォルト・スタンプ」が標準ということなのだろう(packageIdが 1~4のスタンプ)。将来的に、LINEストアで販売されている他のスタンプも送信できるようになればいいのだが。

この時点でゲンナリして「スタンプをやり取りする」構想は諦めてしまった。

スタンプ代わりに画像を送る?

代わりといってはなんだが、スタンプではなく画像 URL を指定した「画像メッセージ」を返信すれば良いかも?とは思う。ただしコレも、HTTPS で配信されている JPG 画像で、ピクセルサイズやファイルサイズに制限があるので、イマイチ使い勝手が悪い。

色々ゲンナリしたのでココマデ。LINE チャットボットであんまりリッチなことはしないようにしよう…。