しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Facebook Messenger Platform のコールバックで送信されるデータ構造を調べた

公式ドキュメントにはテキストぐらいしかサンプルが載っていなかったので、テストで作ったモリス先輩 Bot に送信して試してみました。

ちなみに下の画像のように、Messenger のツールバーにあるやつを試しました。

データ構造が同じものはまとめてあるので、実質は 5 種類だけになっています。

テキスト

{
  "object": "page",
  "entry": [
    {
      "id": ID,
      "time": 1460967453657,
      "messaging": [
        {
          "sender": {
            "id": USER_ID
          },
          "recipient": {
            "id": USER_ID
          },
          "timestamp": 1460967453610,
          "message": {
            "mid": "MID",
            "seq": 1,
            "text": "TEXT"
          }
        }
      ]
    }
  ]
}

message の中に text があるだけの、とてもシンプルな構造です。テキスト以外は全て何かしら添付されているデータ構造となっています。

画像 / GIF

{
  "object": "page",
  "entry": [
    {
      "id": ID,
      "time": 1460967490904,
      "messaging": [
        {
          "sender": {
            "id": USER_ID
          },
          "recipient": {
            "id": USER_ID
          },
          "timestamp": 1460967490879,
          "message": {
            "mid": "MID",
            "seq": 1,
            "attachments": [
              {
                "type": "image",
                "payload": {
                  "url": "IMAGE_URL"
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

attachments の type が image となり、payload が画像の URL となります。GIF の場合も同様で、既に用意されている アニメーション GIF の URL が payload に入るだけです。

スタンプ / いいね!

{
  "object": "page",
  "entry": [
    {
      "id": ID,
      "time": 1460967514265,
      "messaging": [
        {
          "sender": {
            "id": USER_ID
          },
          "recipient": {
            "id": USER_ID
          },
          "timestamp": 1460967514248,
          "message": {
            "mid": "MID",
            "seq": 1,
            "sticker_id": STICKER_ID,
            "attachments": [
              {
                "type": "image",
                "payload": {
                  "url": "STICKER_IMAGE_URL"
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

スタンプといいね!も画像とほぼ同じですが、sticker_id というのが追加されています。スタンプ固有の ID がここに入ってくるので、単純な画像との判別が出来ます。

いいね!の場合は sticker_id が 369239263222822 のようですが、iOS だけかもしれません。未確認です。

ボイスメッセージ

{
  "object": "page",
  "entry": [
    {
      "id": ID,
      "time": 1460967554832,
      "messaging": [
        {
          "sender": {
            "id": USER_ID
          },
          "recipient": {
            "id": USER_ID
          },
          "timestamp": 1460967554651,
          "message": {
            "mid": "MID",
            "seq": 1,
            "attachments": [
              {
                "type": "audio",
                "payload": {
                  "url": "AUDIO_FILE_URL"
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

音声を録音して送信するだけなので、type が audio になり payload が mp4 という簡単なデータです。

位置情報

{
  "object": "page",
  "entry": [
    {
      "id": ID,
      "time": 1460967582260,
      "messaging": [
        {
          "sender": {
            "id": USER_ID
          },
          "recipient": {
            "id": USER_ID
          },
          "timestamp": 1460967582230,
          "message": {
            "mid": "MID",
            "seq": 1,
            "attachments": [
              {
                "title": "TITLE",
                "url": "BING_MAP_URL",
                "type": "location",
                "payload": {
                  "coordinates": {
                    "lat": LATITUDE,
                    "long": LONGITUDE
                  }
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

これまでのデータとは少し異なり、payload の中に coordinates が入ってきます。url には Bing Map の URL が入っているので、地図を使った表示も出来ます。

大した情報ではないですが、忘れそうだったのでメモ代わりに残しておくことにします。