AWS Lambda

【Lambda×LINE】AWSを使って誕生日にメッセージを送ってくれる友達を作った

はじめに

こんにちは、ハヤシです。

突然ですが、誕生日なのに誰からもメッセージが届かなくてなんだか寂しい......そんな経験、ありますよね?
今回は、そんな悩みを解消すべくAWSを使って、誕生日にLINEのメッセージを送ってくれる友達を作りました。

LINEのMessaging API作成

LINEで任意のメッセージを送るには、メッセージを送るためのアカウントを作成し
Messaging APIを作成する必要があります。

以下より無料で簡単に作成可能です。
https://developers.line.biz/ja/services/messaging-api/

作成できたらこんなメッセージが送られるはずです。

想定通り動いたら、LINE Developersのコンソールからチャネルアクセストークン(長期)を発行しておきます。
これは後ほど使用するのでメモに取っておきましょう。

Lambda作成

次に、Lambdaを作成します。

と、その前に、メッセージを送る相手(自分)のユーザIDを確認します。

先ほど作成したアカウント宛に適当な文章を送って以下をLambdaで実行すると
CloudWatchのログストリーム内の"userId"に出力されます。

import json
import logging

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

def lambda_handler(event, context):
    logger.info("Received event:")
    logger.info(json.dumps(event))
    return {
        'statusCode': 200,
        'body': json.dumps('OK')
    }

これで必要な情報が揃いました。
ということで早速Lambdaを設定していきます。

コードは以下のとおりです。

import json
import urllib.request
import html
import boto3

LINE_ACCESS_TOKEN = "xxxxxx" #アクセストークン
LINE_USER_ID = "xxxxxx" #ユーザID

translate_client = boto3.client("translate")

def send_line_message(text):
    req = urllib.request.Request(
        "https://api.line.me/v2/bot/message/push",
        data=json.dumps({
            "to": LINE_USER_ID,
            "messages": [{"type": "text", "text": text}]
        }).encode("utf-8"),
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {LINE_ACCESS_TOKEN}"
        },
        method="POST"
    )
    urllib.request.urlopen(req)

def get_dad_joke():
    req = urllib.request.Request(
        "https://icanhazdadjoke.com/",
        headers={
            "Accept": "application/json",
            "User-Agent": "Mozilla/5.0"
        }
    )
    with urllib.request.urlopen(req) as res:
        data = json.load(res)
        return data["joke"]

def translate_text(text):
    return translate_client.translate_text(
        Text=text,
        SourceLanguageCode="en",
        TargetLanguageCode="ja"
    )["TranslatedText"]

def lambda_handler(event, context):
    joke_en = get_dad_joke()
    joke_ja = translate_text(joke_en)
    send_line_message(f"誕生日おめでとう!🥳\n\n{joke_en}\n\n{joke_ja}")

    return {
        "statusCode": 200
    }

単なるおめでとうメッセージだけだとつまらないので
ランダムにおやじギャグを取得してくれるAPI(https://icanhazdadjoke.com/api) から
おやじギャグをメッセージに追加しました。

また、このAPIは英語で返されるため、Amazon Translateという
AWSの翻訳サービスを使用して英語と同時に日本語訳も送付するようにしました。

テストを実行してみると、想定通りメッセージが送られてきました!

Amazon EventBridgeの設定

あとはEventBridgeでLambdaを誕生日に実行するよう設定してやれば
毎年自動でメッセージが送られるようになりました。

さいごに

これで誕生日を寂しく過ごすこともなくなりました。
LambdaとMessaging APIを組み合わせるだけで簡単にLINEと連携できるので
他にもいろんな面白い使い道がありそうですね。

以上、最後までありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA