[小ネタ]Webhookイベントを使ってメッセージ送信用ユーザーIDのDBを作る #LINE_API

2019.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、中村です。気づけば1月も今日で終わりですね。早く春が来てほしいです。

さて、今月最後はLINE Messaging APIのメッセージ送信関連tipsです。 Messaging APIの中には応答メッセージだけでなく、プッシュメッセージを送る・複数のユーザーにメッセージを送る(マルチキャスト)機能があります。この機能を利用するには、userId, groupId, roomIdのどれかが必要になります。

Botをグループやトークルームに入れて利用する場合は、groupIdやroomIdを使ってAPIでuserIDを取得できますが、Botと1対1の場合はwebhookのイベントをもとにuserIdを取得しておく必要がありそうです。(現時点でchannelに紐づくユーザーを取得するAPIはありません。)今回はwebhookイベントを利用してDynamoDBに格納しておきます。

はじめに

Webhookイベントオブジェクトにはいくつかのタイプがあります。userId取得にはフォローイベントフォロー解除イベントを利用します。 まず、下記の共通のプロパティがあります。

共通プロパティ

プロパティ名 タイプ 説明
type String イベントタイプを表す識別子
timestamp Number イベント発生時刻(ミリ秒)
source Object イベントの送信元情報を含むユーザー、グループ、またはトークルームオブジェクト

ユーザーオブジェクト

プロパティ名 タイプ 説明
type String user
userId String 送信元のユーザーID

上記に加えて、フォローイベントとフォロー解除イベントは下記のプロパティがあります。

フォローイベント

プロパティ名 タイプ 説明
type String follow
replyToken String イベントへの応答に使用するトークン

フォロー解除イベント

プロパティ名 タイプ 説明
type String unfollow

実装してみる

LINEからリクエストされるWebhookは、API GatewayとLambdaで構築していきます。LambdaではじめてのLINE Botを作るを参考にしましょう。またLambdaのロールでは、DynamoDBへの書き込み権限を付与が必要です。

簡単ですが、実際のDynamoDBへの書き込み部分はこのような形になります。

    let eventType: string = event.events[0].type;
    let userId: string = event.events[0].source.userId;
    let timestamp: number = event.events[0].timestamp;

    switch (eventType) {
        :
        :
        :
        :   
        case "follow":
            let putOption: Aws.DynamoDB.DocumentClient.PutItemInput = {
                "TableName": "user",
                "Item": {
                    "userId": userId,
                    "timestamp": timestamp
                }
            };
            let putResult: Aws.DynamoDB.DocumentClient.PutItemOutput = await DynamoDB.put(putOption).promise();
            console.log(JSON.stringify(putResult));
        break;
        case "unfollow":
            let deleteOption: Aws.DynamoDB.DocumentClient.DeleteItemInput = {
                "TableName": "user",
                "Key": {
                    "userId": userId
                }
            };
            let deleteResult: Aws.DynamoDB.DocumentClient.DeleteItemOutput = await DynamoDB.delete(deleteOption).promise();
            console.log(JSON.stringify(deleteResult));
        break;
        :
        :
        :
        :
    }

実際にBotを追加するとLambdaまでリクエストされ、DynamoDBにデータが書き込まれていると思います。LINE上でブロックすることで、データは消すことができます。

Lambdaには、このような形でJSONが飛んできています。

フォローイベント

{
    "events": [
        {
            "type": "follow",
            "replyToken": "78b3bf0156a24572a6f87a37c06b23cc",
            "source": {
                "userId": "xxxxxxxxxxxxxx",
                "type": "user"
            },
            "timestamp": 1548919221641
        }
    ],
    "destination": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

フォロー解除イベント

{
    "events": [
        {
            "type": "unfollow",
            "source": {
                "userId": "xxxxxxxxxxxxxx",
                "type": "user"
            },
            "timestamp": 1548919288104
        }
    ],
    "destination": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

このような簡単な実装でプッシュメッセージやマルチキャストを行う際に使える、ユーザーDBができました。

まとめ

いかがでしたでしょうか。 仕組みは簡単ですが、LINEへのメッセージ送信をLINE@以外から行う場合に使えそうです。

弊社では、「Amazon Connect」の導入を検討している方を対象とした無料相談会を毎週開催中です。

また音声を中心とした各種ソリューションの開発支援も行なっております。