Все любят бесплатные вещи, программисты, а также! Запуск продвинутой облачной службы без оплаты пенни не возможно. Используя AWS Free-Tier предложению, мне удалось создать простой чатбот Cloud-Power для Линия Messenger
** Обратите внимание, что эта архитектура, в основном подходящая для чата в общем использовании, чтобы держать счет низкого уровня **
** Проверьте исходный код на GitHub **
AWS Free Tier.
Если мы тщательно проверим всегда бесплатно AWS Free-Wier Предложения, есть полный сервис, чтобы создать простой чатбот:
- Исполнитель сценария ( AWS Lambda ) Бесплатный 1 миллион запросов в месяц
- Хранение ( AWS Dynamodb : NoSQL-стиловое хранение) Бесплатно 25 ГБ хранения
- Обработчик сообщений WebHook ( AWS API Gateway ) Бесплатный 1 миллион звонков в месяц, на 12 месяцев
Структура
По сути, существует 4 шага для обработки входящего сообщения пользователя в Line Messenger:
- Line Messenger Server Получает и перенесите сообщение для зарегистрированного веб -ook (дверь)
- Дверь находит правильную функцию (шестерни), которая отвечает за обработку сообщения
- Функция отправляет ответное сообщение для Линия Messenger и хранит необходимые журнал в базу данных (карта памяти)
- Line Messenger передает ответное сообщение пользователю
Довольно просто, не так ли? 😄 Есть 3 AWS Resources:
- AWS API Gateway служит Дверь получать и выполнять функцию
- AWS LAMBDA служит Функция Чтобы выполнить код для обработки сообщения
- AWS Dynamodb обрабатывает журналы сообщения и записывает журналы как Json. -СТОВАЯ ИНФОРМАЦИЯ. Этот ресурс изображен как Карта памяти на картинке
Почему лямбда?
Tl; доктор дешевле для использования с низким трафиком.
В отличие от общего способа вычислительной информации, не стоит арендовать один вычислительный ресурс в целую 24/7. AWS Lambda позволяет нам арендовать вычислительный ресурс только на необходимом событии в этом случае: обработка входящего сообщения.
AWS предлагает использовать AWS LAMBDA Только если вычисляющее время ресурса коротко ( ниже 15 минут ) и сервис имеет низкий трафик, периодическую активность, в противном случае будет отверстие в вашем кошельке 😅. Поэтому AWS LAMBDA Подходит в общем использовании Chatbots и для вычисления на боковых проектах.
Достаточно теории. Давайте погрузимся в технических вещах!
Счетные структуры
. ├── app.py ├── dynamodb.py ├── template.yml └── requirements.txt
Содержание
app.py
from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import InvalidSignatureError from linebot.models import TextSendMessage import json import requests from dynamodb import DynamoDB access_token = <> #replace with your access token channel_secret= < > #replace with your channel secret table_name = 'echobot' #DynamoDB table name key_name = 'userID' #database's primary key sec_key_name = 'timestamp' #databse's secondary key def lambda_handler(event,context): # create BotEcho object with parameters line_bot = BotEcho( event, access_token = access_token , channel_secret = channel_secret) # check the signature (originality of source) if line_bot.signature_check != 200: print("fail to signature check") return {'statusCode': line_bot.signature_check} # send the message back to the user response = line_bot.send_reply(line_bot.text_message) if response != 200: print('fail to send reply') return {'statusCode': response} return {'statusCode':200}
Основной файл – приложение
. Это первый скрипт, который выполняется каждый раз, есть полученное сообщение по AWS LAMBDA . AWS LAMBDA позвоню lambda_handler
Функция с 2 параметрами в качестве ввода: событие и контекст. Оба содержат информацию сообщений, отправленную Линия Messenger . Есть 3 шага в echo обратно сообщение:
- Создайте класс Botecho с учетными данными и событиями Line Messenger
- Проверьте Подпись сообщения
- Echo сообщение обратно отправителю
В том же файле ( app.py
), класс Botecho также определен:
class BotEcho: def __init__(self,event,access_token,channel_secret): self.event = event self.bot = LineBotApi(access_token) self.handler = WebhookHandler(channel_secret) self.body = json.loads(event['body'])['events'][0] self.sender_id = self.body['source']['userId'] self.text_message = self.body['message']['text'] self.log(sender=self.sender_id,to='self',message=self.text_message) @property def signature_check(self): signature = self.event['headers']['X-Line-Signature'] try: self.handler.handle(self.event['body'], signature) return 200 except InvalidSignatureError: return 400 def send_reply(self,message): self.log(sender='self',to=self.sender_id,message=message) response = self.bot.reply_message(self.body['replyToken'], \ TextSendMessage(text=message)) return response def log(self,sender,to,message): log_head = ['to','message'] log_value = [to, message] response = DynamoDB(table_name, key_name, sec_key_name)\ .put(sender,log_head,log_value) print(response) return response
Botecho получает событие
, Access_Token
, и Channel_Secret
Отказ Этот класс использует Line Bot API Python Package Отказ Есть 2 функции:
send_reply
: звонки Line Bot API отправить сообщениеЖурнал
: Записать информацию в AWS Dynamodb.
Конечно, вы можете добавить способность бота, а не повторять сообщение. Просто используйте свое творчество в этом!
требования
- Создать новую виртуальную среду
- Установить Строка BOT API пакет
PIP Freeze> требования.
- Вуаля!
СЭМ
Модель приложения без сервеса Предлагается AWS. Я расскажу эту деталью в другом посте. По сути, это удобный способ развертывания вашего приложения к услугам AWS в конфигурации скрипта. Это легко и прослеживается.
Тебе надо:
- Иметь AWS аккаунт (очевидно)
- Установите AWS-CLI и Войдите в свой AWS Счет
- Установите Сэм
- Создать
шаблон.мым
Файл в вашей папке.
Вот шаблон.мым
Содержание:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > Chatbot Echo demo # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: #shared configuration Function: Timeout: 3 Api: OpenApiVersion: 3.0.1 ### to remove the stage name deployment bug Parameters: #shared parameters StageName: # version staging config Default: 'prod' Type: String Resources: #AWS services list ChatbotAPI: # API Gateway https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html Type: AWS::Serverless::Api Properties: EndpointConfiguration: REGIONAL StageName: !Ref StageName DefinitionBody: swagger: "2.0" info: title: "ChatbotAPI" schemes: - "https" paths: /: post: produces: - "application/json" responses: "200": description: "200 response" schema: $ref: "#/definitions/Empty" x-amazon-apigateway-integration: uri: Fn::Sub: arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ChatbotFunction.Arn}/invocations responses: default: statusCode: "200" passthroughBehavior: "when_no_match" httpMethod: "POST" contentHandling: "CONVERT_TO_TEXT" type: "aws_proxy" definitions: Empty: type: "object" title: "Empty Schema" DynamoDBTable: #DynamoDB Table https://docs.aws.amazon.com/lambda/latest/dg/kinesis-tutorial-spec.html Type: AWS::DynamoDB::Table Properties: TableName: echobot #change to your table name AttributeDefinitions: - AttributeName: userID #change to db primary key and type AttributeType: S - AttributeName: timestamp #change to db secondary key and type AttributeType: S KeySchema: - AttributeName: userID #change to db primary key KeyType: HASH - AttributeName: timestamp #change to db primary key KeyType: RANGE ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 ChatbotFunction: # Lambda Function https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Type: AWS::Serverless::Function Properties: Handler: app.lambda_handler Runtime: python3.7 Events: endpoint: Type: Api Properties: #connect to our API Gateway RestApiId: !Ref ChatbotAPI Path: / Method: Post Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: #only allowed to put the record - dynamodb:Put Resource: !GetAtt DynamoDBTable.Arn
Развертывать!
Простые команды:
Сэм сборка
Сэм развернул
- Прикрепите свой AWS API Gateway Вызвать URL к URL-адреса
- И твой эхобот хорош, чтобы пойти!
Все Сэм Развернутое приложение может быть проверено на AWS CloudFormation
Ценообразование
Обратитесь к использованию наших услуг AWS:
- AWS LAMBDA Бесплатный 1 миллион запросов в месяц
- AWS Dynamodb Бесплатно 25 ГБ хранения
- AWS API Gateway Бесплатный 1 миллион звонков в месяц, на 12 месяцев
Чатбот, скорее всего, свободен в течение первых 12 месяцев и стоит немного копейки для AWS API Gateway использование. люблю это <3
Выводы
С чудесным AWS Free-Wier Предложения, разработчики могут удаться создать чатбот, который будет стоить очень мало или даже бесплатно.
Модель приложения без сервеса Или Сэм делает жизнь разработчиков простыми с простой конфигурацией развертывания.
Наконец, вы можете изменить способность Thatbot делать больше, чем echo обратно сообщение! Проверьте исходный код на GitHub Не стесняйтесь бросить мне сообщение, чтобы улучшить мою работу.
Спасибо!
” Что бы вы ни делали, работают от всей души, как для Господа, а не для мужчин »- Колоссянам 3:23
Оригинал: “https://dev.to/arnoldschan/penniless-chatbot-architecture-2g81”