Рубрики
Без рубрики

Пеннильница Чатбот Архитектура

Все любят бесплатные вещи, программисты, а также! Запуск продвинутой облачной службы без оплаты … Помечено с AWS, Python, Chatbot, учебником.

Все любят бесплатные вещи, программисты, а также! Запуск продвинутой облачной службы без оплаты пенни не возможно. Используя 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:

  1. Line Messenger Server Получает и перенесите сообщение для зарегистрированного веб -ook (дверь)
  2. Дверь находит правильную функцию (шестерни), которая отвечает за обработку сообщения
  3. Функция отправляет ответное сообщение для Линия Messenger и хранит необходимые журнал в базу данных (карта памяти)
  4. 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 обратно сообщение:

  1. Создайте класс Botecho с учетными данными и событиями Line Messenger
  2. Проверьте Подпись сообщения
  3. 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.

Конечно, вы можете добавить способность бота, а не повторять сообщение. Просто используйте свое творчество в этом!

требования

  1. Создать новую виртуальную среду
  2. Установить Строка BOT API пакет
  3. PIP Freeze> требования.
  4. Вуаля!

СЭМ

Модель приложения без сервеса Предлагается AWS. Я расскажу эту деталью в другом посте. По сути, это удобный способ развертывания вашего приложения к услугам AWS в конфигурации скрипта. Это легко и прослеживается.

Тебе надо:

  1. Иметь AWS аккаунт (очевидно)
  2. Установите AWS-CLI и Войдите в свой AWS Счет
  3. Установите Сэм
  4. Создать шаблон.мым Файл в вашей папке.

Вот шаблон.мым Содержание:

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

Развертывать!

Простые команды:

  1. Сэм сборка
  2. Сэм развернул
  3. Прикрепите свой AWS API Gateway Вызвать URL к URL-адреса
  4. И твой эхобот хорош, чтобы пойти!

Все Сэм Развернутое приложение может быть проверено на 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”