[PYTHON] J'ai créé un Bot LINE avec Serverless Framework!

Qu'est-ce que Serverless Framework?

https___camo.githubusercontent.jpeg

Serverless Framework est un cadre permettant de configurer des applications avec FaaS (Function as a Service), DB et stockage dans le cloud. C'est un travail. En plus d'AWS, il prend également en charge GCP et Azure. Veuillez consulter cet article pour la méthode d'installation.

Précautions

-Comme la commande est censée être Mac, je pense que la méthode de paramétrage est différente pour Windows. ・ Vous ne pouvez pas faire cela à moins que vous n'ayez un compte AWS. -Les paramètres de Lambda et API Gateway sont trop simples, donc ceux qui sont nouveaux dans ce domaine peuvent ne pas le comprendre beaucoup.

Créer un bot LINE

Créez un robot LINE avec LINE Dvelopers . Une fois connecté, cliquez sur Créer au bas de l'écran. スクリーンショット 2020-11-04 12.49.01.png

Ensuite, l'écran de saisie du nom du fournisseur s'affiche, alors saisissez le nom que vous aimez. スクリーンショット 2020-11-04 12.53.55.png

Vous venez de créer un fournisseur. Ensuite, créez un canal (LINE Bot). Cette fois, nous allons créer un bot LINE à retourner, alors sélectionnez l'API de messagerie. スクリーンショット 2020-11-04 12.55.23.png

Un écran pour saisir l'icône et le nom du Bot LINE apparaîtra, alors saisissez-le. スクリーンショット 2020-11-04 12.59.58.png

Ceci termine la création de LINE Bot.

Configuration du système

Le système que nous créons cette fois donne l'impression que la fonction Lambda est exécutée sur le webhook lorsque l'utilisateur envoie un message au bot LINE. La zone entourée de rouge est implémentée par Serverless Framework. スクリーンショット 2020-11-04 13.08.13.png

Associer un compte AWS à un PC

Utilisez AWS-CLI pour définir les informations AWS sur votre PC. Consultez cet article

Let's Serverless Après avoir installé Serverless Framework sur votre PC, accédez à votre répertoire de travail dans le terminal et exécutez la commande suivante. L'option --template spécifie le langage de programmation utilisé par Lambda, et l'option --path spécifie le nom et l'emplacement du projet. Veuillez changer en conséquence.

$ serverless create --template aws-python3 --path line-bot

Lorsque vous exécutez la commande, un projet est créé avec la structure de répertoires suivante.

line-bot
    ├ .gitignore
    ├ handler.py
    └ serverless.yml

Réécrire serverless.yml

Réécrivez serverless.yml comme suit.

serverless.yml


service: line-bot
frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1  #Spécifiez la région de Tokyo

#Paramètres de la fonction Lambda
functions:
  callback:
    handler: handler.callback

    #Paramètres de la passerelle API
    events:
      - http:
          path: callback
          method: post

Ceci termine les paramètres API Gateway et Lambda. C'est trop facile ...

Implémenter la fonction Lambda

Ensuite, implémentez la fonction exécutée par Lambda.

Créer un environnement virtuel pour Python

Puisqu'il s'agit de Python, créez d'abord un environnement virtuel. Je crée un environnement virtuel avec venv, mais je pense qu'il y a des gens qui le créent avec conda ou virtualenv, veuillez donc changer cela si nécessaire.

$ python3 -m venv line-bot

Cela créera un répertoire appelé line-bot.

line-bot
    ├ line-bot/  <--Répertoire d'environnement virtuel
    ├ .gitignore
    ├ handler.py
    └ serverless.yml

Une fois généré, activez-le avec la commande suivante.

$ source line-bot/bin/activate

Bibliothèque utilisée pour LINE Bot

Une bibliothèque appelée line-bot-sdk est utilisée pour faire fonctionner LINE Bot.

$ pip3 install line-bot-sdk

Implémenté dans handler.py

Maintenant que vous êtes prêt, écrivons le code.

handler.py


from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageMessage
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot import (
    LineBotApi, WebhookHandler
)
import os

access_token = os.environ['LINE_CHANNEL_ACCESS_TOKEN']  //Obtenu à partir des variables d'environnement Lambda
secret_key = os.environ['LINE_CHANNEL_SECRET']          //Obtenu à partir des variables d'environnement Lambda

line_bot_api = LineBotApi(access_token)
handler = WebhookHandler(secret_key)

//Fonctions exécutées par les webhooks LINE Bot
def callback(event, context):
    try:
        signature = event["headers"]["x-line-signature"]
        event_body = event["body"]
        handler.handle(event_body, signature)
    except InvalidSignatureError as e:
        logger.error(e)
        return {"statusCode": 403, "body": "Invalid signature. Please check your channel access token/channel secret."}
    except Exception as e:
        logger.error(e)
        return {"statusCode": 500, "body": "exception error"}
    return {"statusCode": 200, "body": "request OK"}

//Fonction à retourner
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
    )

Ceci termine l'implémentation de la fonction Lambda.

Exigences de sortie.txt

Imprime une liste des bibliothèques utilisées par Python de Lambda. Exécutez la commande suivante à l'état activé.

$ pip3 freeze > requirements.txt

Lorsque vous déployez la bibliothèque répertoriée dans requirements.txt, ajoutez le plug-in à Serverless Framework pour que Lambda l'installe.

$ npm install --save serverless-python-requirements

La bibliothèque que vous utilisez localement est désormais disponible dans Lambda.

Déployer pour le moment

À ce stade, déployons une fois Vous pouvez déployer avec la commande suivante. sls est une abréviation de serverless.

$ sls deploy

Après cela, passons à l'écran de la console AWS et voyons Lambda dans la région de Tokyo. Ensuite, vous pouvez voir qu'il est réellement déployé.

Allez voir le jeton d'accès et la clé secrète du bot LINE

Pour exécuter la fonction Lambda implémentée, vous aurez besoin du jeton d'accès et de la clé secrète de LINE Bot, alors regardez-les sur l'écran de la console de LINE Developers.

Le jeton d'accès se trouve au bas des paramètres de l'API de messagerie. スクリーンショット 2020-11-04 14.40.37.png

La clé secrète se trouve au bas des préférences du canal. スクリーンショット 2020-11-04 14.38.04.png

Définir des variables d'environnement dans Lambda

Définissez la valeur vue ci-dessus dans la variable d'environnement Lambda. Il y a un endroit où vous pouvez définir des variables d'environnement au bas de cet écran, donc enregistrez-le de cette manière.

Clé valeur
LINE_CHANNEL_ACCESS_TOKEN ✖️✖️✖️✖️✖️✖️
LINE_CHANNEL_SECRET ✖️✖️✖️✖️✖️✖️

スクリーンショット 2020-11-04 14.30.44.png

Afficher l'URL de la passerelle API

Vous pouvez vérifier l'URL émise par API Gateway en cliquant sur ce qui suit, alors jetons un coup d'œil. スクリーンショット 2020-11-04 14.30.44.png

Définissez l'URL de la fonction Lambda dans le webhook LINE Bot

Entrez l'URL de la passerelle API dans le webhook sur l'écran des paramètres de l'API LINE Bot Messaging. スクリーンショット 2020-11-04 14.48.12.png Après la saisie, cliquez sur le bouton de vérification et lorsque l'écran de réussite s'affiche, c'est terminé. Je pense que le code QR de LINE Bot est affiché en haut, donc si vous ajoutez un ami à partir de là, vous pouvez jouer avec Umu-return Bot.

S'il reste coincé

Si vous cliquez sur la vérification ci-dessus et qu'une erreur de réponse s'affiche, je pense qu'il y a une erreur dans la fonction Lambda, donc à partir de la surveillance suivante スクリーンショット 2020-11-04 14.28.54.png

Si vous cliquez sur "Afficher le journal CloudWatch", vous pouvez voir le journal de la fonction Lambda, veuillez donc le consulter et le déboguer. スクリーンショット 2020-11-04 15.03.52.png

Recommended Posts

J'ai créé un Bot LINE avec Serverless Framework!
J'ai fait un robot de remplacement de tampon avec une ligne
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai essayé de faire LINE BOT avec Python et Heroku
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
Bot LINE sans serveur conçu avec IBM Cloud Functions
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un robot discord
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
J'ai fait une prévision météo de type bot avec Python.
〇✕ J'ai fait un jeu
Créer un LINE BOT avec Minette pour Python
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai fait un simple portefeuille de Bitcoin avec pycoin
Créer un bot LINE WORKS avec Amazon Lex
J'ai fait un graphique de nombres aléatoires avec Numpy
J'ai fait un jeu de cueillette avec Python
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
Système d'aide à la décision pour les personnes âgées réalisé avec LINE Messaging API + Serverless Framework
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
[Projet spécial Valentine] J'ai fait un diagnostic de compatibilité LINE!
[Super facile] Faisons un LINE BOT avec Python.
J'ai fait un jeu mono tombé avec Sense HAT
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
J'ai créé COVID19_simulator avec JupyterLab
J'ai créé Word2Vec avec Pytorch
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
J'ai fait un jeu de frappe simple avec tkinter de Python
Créez un bot LINE avec GoogleAppEngine / py. Version nue simple
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot