Line Messaging API + PythonとLambdaを使って、オウム返しBotをつくるのまとめ

6 min read読了の目安(約5800字

LineでAPIがあることを知りまして

API(Application Programming Interface)とLambdaの挙動の勉強を兼ねてBOTを作成してみました

謝辞:このお二人の記事にとても助けられました

というかこの2つの記事をそのまま実行したので、
詳しくはこちらをご覧くださいませ

AWS Lambda + Python + LINE Botで傘が必要か教えてもらう
API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]

非常にわかりやすく丁寧に書かれており、BOT作成の喜びと
わかりやすい記事を読んでいく快感が得られました

自分の知識不足により途方に暮れた〜ようやくできた話

まずはこちらを読み進めていき、なるほどな、と思いながら
オウム返しBOTまでの手順を踏んでいきました

AWS Lambda + Python + LINE Botで傘が必要か教えてもらう
LINE Developersでチャンネル作成〜Lambda、APIGatewayのトリガー追加まで何事もなく行きました

Botでオウム返しができなかった...

何が足りないんだろう(自分の知識と読解力なんですけど)と、
途方に暮れつつ、他の記事を見ていきました

そこでこの記事を見つけました
API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]
最初に自分が書き写した記述に一番近い内容でしたので、この記事を読み進めていきました

こちらはAPIGatewayをトリガーとして追加ではなく、新規作成しており、
こちらの作り方も、なるほどな、と思いながら
「こんにちは!」と自動で返してくれるBOT作成まで、無事作ることができました!
若干手こずった自分のチャンネルを自分のトークに追加する方法もこちらでわかりやすかったです

再度オウム返しBOTを作ってみる

「こんにちは!」と自動で返してくれはしましたが、自分の作りたかったのはオウム返しBOT

そこで、お世話になった2つの記事をガッチャンコしながら、何があればオウム返しができ、
何を省けばスッキリしたコードになるのか、試行錯誤を開始しました

ようやく出来上がったのがこちら!

ほーら、ホカホカのコードができましたよー。さぁ、食べましょ食べましょ!「パ〜プ〜」あ!とうふ屋さんが来てる!とうふ買うのをすっかり忘れてた!お兄ちゃん、ちょっととうふ買ってきて!いやいや言わないで、すぐだから!ねっ!おつりはあげるから!ほら、はやくしないと!とうふ屋さん行っちゃうから!...ありがとう!さ、あらためて食べましょ食べましょ!
import json
import urllib.request

def lambda_handler(event, context):
    for message_event in json.loads(event['body'])['events']:
        url = 'https://api.line.me/v2/bot/message/reply'
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + 'あなたの取得したチャンネルアクセストークン'
        }
        body = {
            'replyToken': json.loads(event['body'])['events'][0]['replyToken'],
            'messages': [
                {
                    "type": "text",
                    "text": message_event['message']['text'],
                }
            ]
        }
        req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers)
        with urllib.request.urlopen(req) as res:
            logger.info(res.read().decode("utf-8"))
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

linesmapho.jpg

改行もできる

kaigyo.jpg

絵文字は(emoji)となる

emoji.jpg

かわいい絵文字ですね〜!これどこで売っているんでしょうか???ここです!!![クリッククリック!!!]

どの部分を変えたのか

json.loadseventについて

  • Lambdaに渡されるJSONメッセージは全て event に格納されています。
    • 基本event['要素名'][配列の要素番号]辞書型の”キー”を指定することで”値”を取得することができます。
    • また、配列になっている場合はその配列の"要素番号"を指定することで配列の要素を取得できます。

【AWS】LambdaのJSON入力と仲良くする(Python版)
ありがとうございます

Webhookイベントオブジェクトの例のような形になっているJSONをデコードしてevents0番目replyTokenを取得したんですよね

  • Lambdaではevent.bodyでリクエストボディを取得
    • デフォルトではこのbodyは文字列なので、Content-Type:application/jsonの場合も「JSON文字列」になります。
    • そのため、一度JSONをパースする

API GatewayからLambdaを呼び出すときにevent.bodyをオブジェクトで受け取る
ありがとうございます

  • JSONをパースするとは?
    • JSON(JavaScript Object Notation)は名前の通り、JavaScriptのオブジェクトの表記法をベースとしたデータ形式であるため、例えばブラウザ側からJavaScriptなどでサーバー側のJavaなどに渡される
    • JavaでJSONを受け取ろうとすると、当然、そんなデータの形(JSON)は理解できないってことになるため、Javaで処理できるようにJSONをパース(解析)することが必要

JSON(JavaScript Object Notation)をパースするとは? quicktypeというサービスがアツいらしい
ありがとうございます

  • そもそもAPIとは?
    • Application Programming Interface
    • ソフトウェアにAPIという外部とやりとりする窓口を作り、外部アプリとコミュニケーションや連携ができる状態にする

今さら聞けないIT用語:やたらと耳にするけど「API」って何?
ありがとうございます

その他、調べて知ったこと一覧

  • 応答トークンというもの(房総半島みたいな響き)があり、これはLine側が自動で割り振って送ってくれるもの(だと思う)
  • 'Bearer 'のところの半角スペースっているのだろうか?と思ったら、いるものでした
  • 記述をしたらデプロイボタンを押すのと、この時点でテストをしてエラーがでても、実際は動きました
    image (10).png
  • APIのほかにSDKというもの(あるシステムに対応したソフトウェアを開発するために必要なプログラムや文書などをひとまとめにしたパッケージ)があり、LineにもLINE Messaging API SDKというパッケージが用意されている
  • Herokuといもの(アプリケーションの開発から実行、運用までのすべてをクラウドで完結できる PaaS(サービスとしてのプラットフォーム))があり、それを介して、LineBotを作ることもできる
  • BotでLineスタンプを送る場合、送信可能なラインスタンプ一覧こちらにがありました

image.png

かわいい絵文字ですね〜!これどこで売っているんでしょうか???ここです!!![クリッククリック!!!]