[PYTHON] Bot LINE sans serveur qui peut être réalisé en 2 heures (acquisition de l'identifiant source)

Motivé

――Il est intéressant de voir les photos du lycée et du collège récemment ――Mais c'est ennuyeux de le trouver tous les jours

--Je veux commencer à toucher AWS

tl;dr L'objectif est ** dans une salle de groupe contenant Bot, lorsqu'un mot spécifique apparaît, une image est acquise aléatoirement à partir de l'image placée dans S3, et Bot renvoie la photo **

  1. Fire Lambda à partir du serveur LINE
  2. Obtenez l'URL de RDS
  3. Envoyez le POST avec l'URL au serveur LINE
  4. L'image S3 est publiée sur l'application

Est-ce le flux?

De plus, nous allons l'implémenter afin que nous puissions également acquérir l''identifiant source ', qui est un goulot d'étranglement dans la création d'un LINE Bot.

Diagramme de configuration (prévu pour être terminé)

Untitled Diagram.png

Dans cet article, comme première étape, j'aimerais utiliser Lambda pour vérifier la communication et jouer avec diverses choses.

Schéma de configuration (état actuel)

Untitled Diagram-2.png

Obtenez un compte LINE Bot

https://business.line.me/ja/

Tout d'abord, enregistrons un compte professionnel ici.

On vous demandera le type d'emploi, mais c'est généralement approprié et ok (je ne me souviens pas des détails, car j'ai créé un compte l'année dernière ,,,) L'occupation de l'écrivain est la beauté

Ensuite, il y a "Créer un compte professionnel" en bas de l'écran "Liste des comptes", alors allez ici. スクリーンショット 2017-08-31 0.37.26.png

Ensuite, on vous demandera quel type de service votre compte propose, mais ici sélectionnons le petit "Start Developer Trial" en bas de la ** API de messagerie **

apapapap.png

Cela fera de votre compte un essai pour les développeurs. La grande différence avec le plan gratuit général est

developper gratuit
pushAPI OK NG
Nombre d'amis pouvant être ajoutés 50 Sans limites

L'essai développeur suffit si vous en faites un passe-temps

Entrez le nom du compte, l'image, le type de travail, etc. et postulez Après cela, il est facile d'oublier cette partie, mais veuillez passer à ** LINE @ MANAGER **

Ensuite, vous devriez tomber sur cet écran (Paramètres du compte> Paramètres de l'API de messagerie) スクリーンショット 2017-08-31 0.52.46.png

Continuons comme c'est Maintenant, il fait beau et la création du compte Bot est terminée

Ici, notons ** CHANNEL_ACCESS_TOKEN ** pour connecter le serveur LINE et Lambda. スクリーンショット 2017-09-01 14.26.12.png

Création de la fonction Lambda & Lambda => Paramètre de connexion au serveur LINE

Ensuite, je voudrais créer un serveur sans serveur avec Lambda et également définir la connexion au serveur Lambda => LINE.

AWS Lambda vous permet d'exécuter votre code sans provisionnement ni gestion de serveur. Vous ne payez que pour le temps de calcul réel que vous utilisez, et vous ne payez pas lorsque le code n'est pas en cours d'exécution. Avec Lambda, vous pouvez exécuter pratiquement n'importe quel type d'application ou de service de backend sans avoir besoin de gestion. Une fois que vous avez téléchargé votre code, Lambda fait tout ce dont vous avez besoin pour exécuter et mettre à l'échelle votre code pour une haute disponibilité. Le code peut être configuré pour se déclencher automatiquement à partir d'autres services AWS, ou il peut être configuré pour appeler directement à partir de l'application Web ou mobile.

  1. Sélectionnez Lambda dans la console AWS
  2. Créer une fonction
  3. Dessin de conception: "Créer à partir de zéro"
  4. Déclencheur: ʻAPI Gateway`
  5. Nom de l'API: {facultatif}, sécurité: ʻopen, étape à déployer: prod`
  6. Nom: {facultatif}, Description: {facultatif}: Exécution: python3.6

Cette fois, j'utiliserai python3.6 (w parce que je l'aime récemment)

En fait, lorsque vous essayez de faire quelque chose pour une salle de groupe d'utilisateurs particulière à l'aide de l'API Messagein de LINE, vous obtenez un identifiant de destination. c'est,

Vous pouvez spécifier les identifiants de l'utilisateur, du groupe et de la salle de discussion source pour les événements Webhook comme identifiants de destination. Vous ne pouvez pas spécifier l'ID de ligne utilisé dans l'application LINE.

Il paraît que. Même si l'utilisateur qui développe le bot a son propre identifiant de destination écrit dans LINE Developers, il ne connaît pas du tout les identifiants des autres groupes d'utilisateurs.

Donc, tout d'abord, le code implémenté dans Lambda ** renverra l'identifiant de destination de l'utilisateur du groupe qui a envoyé au Bot **.

Voici l'exemple de code que j'ai créé


import urllib.request, json, os, ast

def lambda_handler(event, context):

    #Se préparer à frapper le serveur LINE
    url = "https://api.line.me/v2/bot/message/push"
    method = "POST"
    headers = {
        'Authorization': os.getenv("CHANNEL_ACCESS_TOKEN"),
        'Content-Type': 'application/json'
    }

    #Analyser la chaîne en type de dict
    apiParam = ast.literal_eval(event['body'])
    source = apiParam['events'][0]['source']

    sourceList = []
    for key, value in source.items():
        sourceList.append({"type": "text", "text": key + "#" + value})

    obj = {
        #Les demandes de la chambre sont renvoyées dans la chambre. D'autres reviennent à l'appelant.
        "to": source["roomId"] if "roomId" in source else source["userId"],
        "messages": sourceList
    }
    json_data = json.dumps(obj).encode("utf-8")

    #Préparer la requête http et le POST
    request = urllib.request.Request(url, data=json_data, method=method, headers=headers)
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
    return 0

Gestionnaire: index.lambda_handler Rôle: créer un rôle personnalisé => Ajoutez maintenant Accès en lecture seule aux objets S3 au modèle de politique. Faisons les autres de manière appropriée.

Définissez également les éléments suivants dans la partie variable d'environnement

CHANNEL_ACCESSS_TOKEN:{CHANNEL que j'ai noté sur l'écran LINE plus tôt_ACCESS_TOKEN}

Collez ceci et sauvegardons

Serveur LINE => Paramètres de connexion à Lambda

Enfin, nous allons configurer la connexion du serveur LINE à Lambda.

À partir de l'élément déclencheur Lambda créé précédemment (voir la figure ci-dessous)

スクリーンショット 2017-09-02 22.17.31.png

Je vais chercher l'URL, je suis Méthode: AMY, donc si vous frappez cette URL avec GET ou POST, le code écrit en Lambda sera exécuté.

Maintenant, définissez l'URL de ce déclenchement sur le serveur LINE.

Connectez-vous à LINE Developers et définissez-le sur URL Webhook

スクリーンショット 2017-09-02 22.22.58.png

À ce stade, assurez-vous d'ajouter le numéro de port 443. Semble être joué (pas essayé)

Ceci complète le LINE Bot par une journée ensoleillée.

Inscrivez-vous en tant qu'ami à partir du code QR de LINE Developers et envoyez quelque chose dans la salle appropriée 1to1 ça devrait ressembler à ça Ce sont les identifiants de destination, dans ce cas mon propre identifiant et l'identifiant de la chambre que j'ai envoyée sont affichés

スクリーンショット 2017-09-02 22.56.19.png

tips1 Puis-je utiliser une bibliothèque externe?

Dans Lambda, vous pouvez uniquement écrire du code et y accéder, donc dans l'état initial, vous ne pouvez utiliser que des bibliothèques de base. Ainsi, quand j'ai frappé l'API de Lambda, je ne pouvais pas utiliser urllib2 et utilisé urllib en le poussant. En fait, si vous téléchargez le code compressé et l'ensemble des bibliothèques, vous pouvez utiliser la bibliothèque, mais je l'introduirai la prochaine fois

tips2 Pourquoi analysez-vous à nouveau?

Une lecture rapide de la Référence API LINE La demande de webhook a été écrite comme suit.

{
  "events": [
      {
        "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
        "type": "message",
        "timestamp": 1462629479859,
        "source": {
             "type": "user",
             "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
         },
         "message": {
             "id": "325708",
             "type": "text",
             "text": "Hello, world"
          }
      }
  ]
}

D'autre part, les arguments de Lambda sont les suivants

def lambda_handler(event, context):

Ils sont inclus dans l'argument «événement».

{
    ~~~~~Abréviation~~~~~~~
    "body": "{"events":[{"type":"message","replyToken":"cd8477b1e2844fb7ac535ba8cfb7e604","source":{"userId":"Ue49159d045ba254087865fb1c09ce0e7","type":"user"},"timestamp":1504100774524,"message":{"type":"text","id":"6623088374597","text":"fewgvlkwgw"}}]}"
    ~~~~~Abréviation~~~~~~~
}

Il est stocké sous forme de chaîne de caractères ... Je pensais que c'était un type dict, et j'en étais accro ...

Alors

apiParam = ast.literal_eval(event['body'])

Voilà comment j'analyse

Impressions

――Parce qu'il est sans serveur, il y a peu d'éléments addictifs

Aperçu de la prochaine fois

la prochaine fois ** Édition à verrouillage RDS et S3 **, donc si vous envoyez "s'il vous plaît", nous ferons quelque chose qui répond aux photos aléatoires de RDS (S3)

Recommended Posts

Bot LINE sans serveur qui peut être réalisé en 2 heures (acquisition de l'identifiant source)
Analyse de texte pouvant être effectuée en 5 minutes [Word Cloud]
Une histoire que heroku, qui peut se faire en 5 minutes, a en fait duré 3 jours
Fonctions pouvant être utilisées dans l'instruction for
Construire un Sphinx qui peut être écrit avec Markdown
Analyse morphologique et tfidf (avec code de test) pouvant être effectuée en 1 minute environ
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Algorithmes de base utilisables par les pros de la compétition
Enregistrement d'image ANT qui peut être utilisé en 5 minutes
Il semble que le suivi des squelettes puisse être effectué avec RealSense
Goroutine (contrôle parallèle) utilisable sur le terrain
Goroutine utilisable sur le terrain (édition errgroup.Group)
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
J'ai étudié le prétraitement qui peut être fait avec PyCaret
Index d'évaluation pouvant être spécifié pour GridSearchCV de sklearn
Un enregistrement que GAMEBOY n'a pas pu être fait avec Python. (PYBOY)
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Gestion des chaînes de caractères dans la communication JSON
Résumé de l'entrée standard de Python pouvant être utilisée dans Competition Pro
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Module standard Python utilisable en ligne de commande