BETA

LINE Messaging API × AWS Lambdaによる簡易応答システム #2-appx2: スタンプ

投稿日:2020-06-07
最終更新:2020-06-07

連載#2に関連したオマケの第2弾として、スタンプを扱います。

対象読者

  • Pythonをちょっと触れる
    • 変数、リスト、制御構文(if、for)の操作
    • JSONの操作
    • urllibかrequestsでのHTTP操作

本記事のゴール

「スタンプを送ったら、スタンプが返ってくる」を実装します。なお、送り返すスタンプは固定とします。

流れ

  1. LINE Messaging APIからの受信データ
  2. LINE Messaging APIとの応答

1. LINE Messaging APIからの受信データ

基本はテキストデータと同じです。違うのは、messageのみです。

'body': '{  
    "events":[  
        {  
            "type":"message",  
            "replyToken":"xxxxx",  
            "source":{  
                "userId":"xxxxx",  
                "type":"user"  
            },  
            "timestamp":xxxxx,  
            "mode":"active",  
            "message":{  
                "type":"sticker",    # スタンプの場合のメッセージタイプ  
                "id":"xxxxx",  
                "stickerId":"xxxxxxx",    # スタンプID  
                "packageId":"xxxxxxx",    # パッケージID  
                "stickerResourceType":"STATIC"  
            }  
        }  
    ],  
    "destination":"xxxxx"  
}  

スタンプの場合、messagetypestickerとなります(スタンプ=sticker)。この条件に対し、スタンプを返すことを実装します。
ちなみに、stickerIdpackageIdを参照すれば、ユーザーが使用しているスタンプの情報も取得できます。

スタンプの詳細は公式ページをご参照ください。

2. LINE Messaging APIとの応答

基本はテキストデータと同じなので、ほぼ連載#2と同じコードです。そのため、スタンプで異なる箇所にのみコメントアウトをつけています。

import json  
import os  
import logging  
import urllib.request  

logger = logging.getLogger()  
logger.setLevel(logging.INFO)  

def lambda_handler(event, context):  
    logger.info(event)  

    body = json.loads(event['body'])  

    for event in body['events']:  
        messages = []  
        if event['type'] == 'message':  
            # メッセージタイプがstickerの場合の処理  
            if event['message']['type'] == 'sticker':  
                messages.append({  
                    'type': 'sticker',    # 送り返すメッセージのタイプをスタンプに指定  
                    'packageId': 11537,    # 送り返すスタンプのパッケージID  
                    'stickerId': 52002734    # 送り返すスタンプのスタンプID  
                })  


                url = 'https://api.line.me/v2/bot/message/reply'  
                headers = {  
                    'Content-Type': 'application/json',  
                    'Authorization': 'Bearer ' + os.environ['LINE_CHANNEL_ACCESS_TOKEN']  
                    }  
                data = {  
                    'replyToken': event['replyToken'],  
                    'messages': messages  
                }  
                request = urllib.request.Request(url, data = json.dumps(data).encode('utf-8'), method = 'POST', headers = headers)  
                with urllib.request.urlopen(request) as response:  
                    logger.info(response.read().decode("utf-8"))  

    return {  
        'statusCode': 200,  
        'body': json.dumps('Hello from Lambda!')  
    }  

スタンプIDとパッケージIDについては、公式ページを参照ください。なお、このページに記載されていないスタンプの送り方は未調査です…。

終わりに

スタンプに対してスタンプで応答することを実装しました。Webhookイベントと応答メッセージの形式さえ把握していれば、テキストもスタンプも扱いは似ていますね。

ここまでお読みいただき、ありがとうございました!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

hanaの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう