Line Messaging API webhookイベントオブジェクトの型

Line Messaging API webhookイベントオブジェクトの型

投稿日: 2024年10月27日

Tips
要約
  • 外部APIの型定義をAIで生成し、Webhookイベントに関する型を共有しています。
  • 型情報を元に、具体的なイベントやプロパティの型定義を示し、特に参加イベントの型を確認しました。
  • LINE通知を実装したい際にはこの記事を参照してもらうことを目的としています。

はじめに

外部APIの型定義、結構大変だなと感じたので使う人がいたらと思い共有します!!

公式ドキュメントを元にAIで生成しました。

全てのイベントは検証していないのでご利用の際は使いたいイベントの型に間違いないか念のためドキュメント確認してからご使用ください!!

使いたいプロパティの型定義だけしていればよいとのことではあります!!(ぶべさんに確認済)

type WebhookEvent =
  | MessageEvent
  | UnsendEvent
  | FollowEvent
  | UnfollowEvent
  | JoinEvent
  | LeaveEvent
  | MemberJoinedEvent
  | MemberLeftEvent
  | PostbackEvent;

export interface WebhookRequest {
  destination: string;
  events: WebhookEvent[];
}

interface CommonProperties {
  type: string;
  mode: "active" | "standby";
  timestamp: number;
  source: EventSource;
  webhookEventId: string;
  deliveryContext: {
    isRedelivery: boolean;
  };
}

interface EventSource {
  type: "user" | "group" | "room";
  userId?: string;
  groupId?: string;
  roomId?: string;
}

interface MessageEvent extends CommonProperties {
  type: "message";
  replyToken: string;
  message: Message;
}

interface UnsendEvent extends CommonProperties {
  type: "unsend";
  unsend: {
    messageId: string;
  };
}

interface FollowEvent extends CommonProperties {
  type: "follow";
  replyToken: string;
  follow: {
    isUnblocked: boolean;
  };
}

interface UnfollowEvent extends CommonProperties {
  type: "unfollow";
}

interface JoinEvent extends CommonProperties {
  type: "join";
  replyToken: string;
}

interface LeaveEvent extends CommonProperties {
  type: "leave";
}

interface MemberJoinedEvent extends CommonProperties {
  type: "memberJoined";
  replyToken: string;
  joined: {
    members: EventSource[];
  };
}

interface MemberLeftEvent extends CommonProperties {
  type: "memberLeft";
  left: {
    members: EventSource[];
  };
}

interface PostbackEvent extends CommonProperties {
  type: "postback";
  replyToken: string;
  postback: {
    data: string;
    params?: {
      datetime?: string;
      newRichMenuAliasId?: string;
    };
  };
}

type Message = TextMessage | StickerMessage;

interface TextMessage {
  type: "text";
  id: string;
  text: string;
}

interface StickerMessage {
  type: "sticker";
  id: string;
  stickerId: string;
  packageId: string;
  stickerResourceType: "ANIMATION" | "MESSAGE";
  keywords: string[];
  text?: string;
  quoteToken?: string;
}

こういった長いのは見るのダルって思うタイプなのですが(素直ですみませんね)、今回私が使いたいところだけちょっと確認するところまでやってみようかなと思います。

参加イベント

参加したタイミングでデータベース登録等行うことになると思うので、このイベントの型定義は個人的に要チェックです。

公式ドキュメントの参加イベントの例は下記のような感じです。

{
  "destination": "xxxxxxxxxx",
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "join",
      "mode": "active",
      "timestamp": 1462629479859,
      "source": {
        "type": "group",
        "groupId": "C4af4980629..."
      },
      "webhookEventId": "01FZ74A0TDDPYRVKNK77XKC3ZR",
      "deliveryContext": {
        "isRedelivery": false
      }
    }
  ]
}

型定義の方見てみます。

interface CommonProperties {
  type: string;
  mode: "active" | "standby";
  timestamp: number;
  source: EventSource;
  webhookEventId: string;
  deliveryContext: {
    isRedelivery: boolean;
  };
}

interface JoinEvent extends CommonProperties {
  type: "join";
  replyToken: string;
}

問題なさそうですね・・!!

そのまま使います!!

おわりに

LINE通知したいなって思ったらこの記事思い出してくださ~い!

シェア!

Threads
user
吉本茜
山口在住/二児の母/育休中
記事一覧に戻る
Threads
0