在Lambda上使用line-bot-sdk-python创建鹦鹉返回BOT


介绍

我找不到有关使用line-bot-sdk-python使用lambda创建BOT的文章,所以我创建了它。
目标是创建一个鹦鹉返回机器人。
我是AWS的超级初学者,所以请评论这些缺点。

环境

  • Windows 10
  • Python3.6

①创建工作目录

为了将库与

lambda一起使用,您需要一次以zip格式上传文件,因此请创建一个文件夹,以便轻松地将其上传到lambda。
目前,我将在C\:Users\ユーザー名\Documents\aws\parrot中创建它。

②图书馆介绍

移至工作文件夹

1
cd C\:Users\ユーザー名\Documents\aws\parrot

通过添加

-t选项指定安装目的地,以安装库。

1
python -m pip install line-bot-sdk -t .

③创建要在lambda中使用的函数

我认为很多

文件夹已经完成,但是让我们在C\\:Users\ユーザー名\Documents\aws\parrot中的名称为lambda_function.py的lambda中创建一个函数。
内容是这样的。

lambda_function.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import os
import sys
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
from linebot.exceptions import (
    LineBotApiError, InvalidSignatureError
)
import logging

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

channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
    logger.error('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    logger.error('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)


def lambda_handler(event, context):
    if "x-line-signature" in event["headers"]:
        signature = event["headers"]["x-line-signature"]
    elif "X-Line-Signature" in event["headers"]:
        signature = event["headers"]["X-Line-Signature"]
    body = event["body"]
    ok_json = {"isBase64Encoded": False,
               "statusCode": 200,
               "headers": {},
               "body": ""}
    error_json = {"isBase64Encoded": False,
                  "statusCode": 500,
                  "headers": {},
                  "body": "Error"}

    @handler.add(MessageEvent, message=TextMessage)
    def message(line_event):
        text = line_event.message.text
        line_bot_api.reply_message(line_event.reply_token, TextSendMessage(text=text))

    try:
        handler.handle(body, signature)
    except LineBotApiError as e:
        logger.error("Got exception from LINE Messaging API: %s\n" % e.message)
        for m in e.error.details:
            logger.error("  %s: %s" % (m.property, m.message))
        return error_json
    except InvalidSignatureError:
        return error_json

    return ok_json

请注意,如果您没有在handler.handle(body, signature)上方写@handler.add(MessageEvent, message=TextMessage),则会失败,因为您没有看到这样的功能,因此请小心。

2/5更改
@Aki_fujita的评论中有一个报告,因此我进行了查找。

https://developers.line.biz/ja/news/2021/01/18/reminder-update-webhook-client-and-root-certificate/#header-field-name-2
看起来LINE一侧的标头字段名称的处理已发生了一些变化。
当我阅读参考资料时,似乎原因是由于HTTP / 2中的限制,字段名称只能小写。
由于我过去制作的应用程序运行正常,因此似乎没有统一的更改,但是正如LINE所宣布的那样,我重写了" X-Line-Signature"或" x-line-Signature",以便可以处理。
我尚未确认操作,所以对不起,如果您无法使用...

更新结束

④合并成ZIP

选择工作文件夹中的所有文件,然后将它们压缩在一起。
2018-08-16 (1).png
像这样,我选择全部并将其压缩成一个zip。

⑤用aws创建lambda

打开

aws控制台,然后转到lambda位置。并创建一个这样的lambda。
2018-08-16.png
该角色没有所需的权限,因此不添加任何内容。

继续时上载代码。
将代码输入类型更改为ZIP文件上传,然后上传刚刚创建的zip文件。
2018-08-16 (2).png

接下来,在环境变量中设置访问令牌等。
在LINE Developers网站和

上为您的机器人创建LINE帐户

  • 重新获得访问令牌
  • 使用webhook
  • 不要使用自动助理消息

让我们这样做。 Webhook URL将在下一章中设置。
将在那里显示的通道密码和访问令牌复制到lambda的环境变量,然后按保存。
2018-08-16 (3).png

lambda的工作已经结束。

⑥设置AWS API Gateway

设置API网关以接收来自LINE的webhook。
从AWS服务中选择API Gateway,然后选择创建一个API。

创建为新的API。
2018-08-17 (1).png

创建比操作新的资源
2018-08-17 (3).png

我是这样创建的。
2018-08-17 (4).png

接下来,创建一个方法
2018-08-17 (5).png

因为它是通过POST发出的,所以选择POST。
2018-08-17 (6).png

选择代理集成,因为它使用

标头信息。
2018-08-17 (7).png

在下一个屏幕上,选择方法要求并进行设置,如下图所示。
2018-08-17 (12).png

最后部署。
2018-08-17 (15).png

让我们适当地进行一个阶段。
2018-08-17 (16).png

选择POST并检查URL
2018-08-17 (17).png

在LINE Developers中将此URL设置为Webhook URL,就完成了! :relaxed:

演示版

demo.jpg

参考文献

https://qiita.com/Hironsan/items/0eb5578f3321c72637b4
https://qiita.com/hiyuzawa/items/10e7bf2f6ad5d1c7fc9c
https://qiita.com/_mogaming/items/2bd83204e212e35b2c6c