Python appelant l'API Google Cloud Vision depuis LINE BOT via AWS Lambda

Cet article, Et a essayé de faire presque la même chose avec python. Ce n'est qu'après avoir utilisé LINE BOT que vous réaliserez son plaisir et son potentiel. Très amusant et pratique, ça!

Je suis très curieux de savoir ce qui va se passer après la fin du procès, mais avant tout, je vais le mettre en œuvre ^^

handler.py

# coding:utf-8
# !/usr/bin/python

import line
import json


def lambda_handler(event, context):
    print(json.dumps(event, indent=4, separators=(',', ': ')))
    content = event.get("result")[0].get("content") #En fait, il y a plusieurs résultats. S'il s'agit de lambda, il est pour le moment multi-threadé. (Bien que vous puissiez le mettre dans SQS)
    line.set_return_text(content)
    line.send_to_line(content)

Pour le moment, l'entrée d'AWS Lambda. Vous obtiendrez un json rempli d'informations de LINE dans l'événement, alors créez une réponse à partir de là et envoyez-la au serveur LINE.

line.py

# coding:utf-8
# !/usr/bin/python

import vision
import json
import os
import requests

CONTENT_TYPE_TEXT = 1  # Text message
CONTENT_TYPE_IMAGE = 2  # Image message
CONTENT_TYPE_VIDEO = 3  # Video message
CONTENT_TYPE_AUDIO = 4  # Audio message
CONTENT_TYPE_LOCATION = 7  # Location message
CONTENT_TYPE_STICKER = 8  # Sticker message
CONTENT_TYPE_CONTACT = 10  # Contact message

LINE_BOT_API_EVENT = 'https://trialbot-api.line.me/v1/events'
LINE_HEADERS = {
    'Content-type': 'application/json; charset=UTF-8',
    'X-Line-ChannelID': 999999999,  # Channel ID
    'X-Line-ChannelSecret': 'hogehoge',  # Channel secre
    'X-Line-Trusted-User-With-ACL': 'hogehoge'  # MID (of Channel)
}

def set_return_text(content):
    content_type = content.get("contentType")
    if content_type == CONTENT_TYPE_TEXT:
        content["text"] = u"'" + content.get("text") + u"'Est-ce une question difficile?" + os.linesep + \
                          u"Je suis bon en photographie!"
    elif content_type == CONTENT_TYPE_IMAGE:
        image = get_message_content(content)
        content["text"] = vision.get_image_text(image)
    else:
        content["text"] = u"Je suis désolé, je ne suis pas sûr>_<" + os.linesep + \
                          u"Je suis bon en photographie!"
    content["contentType"] = CONTENT_TYPE_TEXT


def send_to_line(content):
    data = {
        'to': [content.get('from')],
        'toChannel': 1383378250, #FIX
        'eventType': "138311608800106203", #FIX
        'content': content
    };
    r = requests.post(LINE_BOT_API_EVENT, headers=LINE_HEADERS, data=json.dumps(data))
    print(r.content)


def get_message_content(content):
    url = 'https://trialbot-api.line.me/v1/bot/message/%s/content' % content.get("id")
    r = requests.get(url, headers=LINE_HEADERS)
    return r.content

Emballez vos identifiants dans LINE_HEADER. C'est solide maintenant, mais en réalité, si vous intégrez les informations d'authentification à partir de requestTemplate ou stageVariable d'API Gateway, le référentiel ne sera pas sale.

Lorsqu'une photo est envoyée, il obtient les données de la photo à partir de cet identifiant et les transmet à vision.py pour obtenir le message de réponse.

vision.py

# coding:utf-8
# !/usr/bin/python

# Copyright 2016 Google, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import base64
import os

from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials

DISCOVERY_URL = 'https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'
GOOGLE_APPLICATION_CREDENTIALS = {
    "type": "service_account" #Divers omis. Obtenez vos identifiants dans la Google Developer Console.
}

def get_image_text(image):
    request = get_vision_service().images().annotate(body={
        'requests': {
            'image': {
                'content': base64.b64encode(image)
            },
            'features': [
                {"type": "FACE_DETECTION", "maxResults": 5},
                {"type": "LABEL_DETECTION", "maxResults": 5},
                {"type": "TEXT_DETECTION", "maxResults": 5},
                {"type": "LANDMARK_DETECTION", "maxResults": 5},
                {"type": "LOGO_DETECTION", "maxResults": 5},
                {"type": "SAFE_SEARCH_DETECTION", "maxResults": 5}
            ],
            'imageContext': {
                'languageHints': [
                    "ja",
                    "en"
                ]
            }
        },
    })
    response = request.execute()

    annotation = response['responses'][0].get('safeSearchAnnotation')
    if annotation.get("adult") == "POSSIBLE" or annotation.get("adult") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Je ne pense pas qu'il devrait en être ainsi!"
    if annotation.get("medical") == "POSSIBLE" or annotation.get("medical") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Ce genre de chose ..."
    if annotation.get("spoof") == "POSSIBLE" or annotation.get("spoof") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Vous ne pouvez pas être victime d'une arnaque! ??"
    if annotation.get("violence") == "POSSIBLE" or annotation.get("violence") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Oh, la violence n'est pas bonne! Est inutile! Gya!"

    text = u""
    annotations = response['responses'][0].get('labelAnnotations')
    if annotations != None:
        text = text + u'Je pense que c'est une image comme celle-ci.' + os.linesep
        for annotation in annotations:
            text = text + u'[ ' + annotation.get("description") + u' ]' + os.linesep
        text = text + os.linesep

    annotations = response['responses'][0].get('textAnnotations')
    if annotations != None:
        text = text + u"Vous pouvez voir ces personnages." + os.linesep
        for annotation in annotations:
            text = text + u'[ ' + annotation.get("description") + u' ]' + os.linesep
        text = text + os.linesep

    annotations = response['responses'][0].get('faceAnnotations')
    if annotations != None:
        text = text + str(len(annotations)) + u"J'ai trouvé une personne sur la photo!" + os.linesep
        count = 1
        for annotation in annotations:
            text = text + str(count) + u'L'oeil est'
            if annotation.get("joyLikelihood") == "POSSIBLE" or annotation.get("joyLikelihood") == "LIKELY" or annotation.get("joyLikelihood") == "VERY_LIKELY":
                text = text + u"ça a l'air drôle!" + os.linesep
            elif annotation.get("sorrowLikelihood") == "POSSIBLE" or annotation.get("sorrowLikelihood") == "LIKELY" or annotation.get("sorrowLikelihood") == "VERY_LIKELY":
                text = text + u"L'air triste ...!" + os.linesep
            elif annotation.get("angerLikelihood") == "POSSIBLE" or annotation.get("angerLikelihood") == "LIKELY" or annotation.get("angerLikelihood") == "VERY_LIKELY":
                text = text + u"Es-tu fâché?" + os.linesep
            elif annotation.get("surpriseLikelihood") == "POSSIBLE" or annotation.get("surpriseLikelihood") == "LIKELY" or annotation.get("surpriseLikelihood") == "VERY_LIKELY":
                text = text + u"je suis surpris!!" + os.linesep
            elif annotation.get("underExposedLikelihood") == "POSSIBLE" or annotation.get("underExposedLikelihood") == "LIKELY" or annotation.get("underExposedLikelihood") == "VERY_LIKELY":
                text = text + u"Est-ce une sous-exposition?" + os.linesep
            elif annotation.get("blurredLikelihood") == "POSSIBLE" or annotation.get("blurredLikelihood") == "LIKELY" or annotation.get("blurredLikelihood") == "VERY_LIKELY":
                text = text + u"C'est flou>_<" + os.linesep
            elif annotation.get("headwearLikelihood") == "POSSIBLE" or annotation.get("headwearLikelihood") == "LIKELY" or annotation.get("headwearLikelihood") == "VERY_LIKELY":
                text = text + u"Portez-vous un chapeau?" + os.linesep
            else:
                text = text + u"d'habitude?" + os.linesep
            count = count + 1
        text = text + os.linesep

    annotations = response['responses'][0].get('landmarkAnnotations')
    if annotations != None:
        text = text + u"Oh, c'est peut-être l'endroit!" + os.linesep
        for annotation in annotations:
            text = text + u'[ ' + annotation.get("description") + u' ]' + os.linesep
        text = text + os.linesep

    annotations = response['responses'][0].get('logoAnnotations')
    if annotations != None:
        text = text + u"Oh, je connais ce logo." + os.linesep
        for annotation in annotations:
            text = text + u'[ ' + annotation.get("description") + u' ]' + os.linesep
        text = text + os.linesep

    print text
    return text


def get_vision_service():
    credentials = ServiceAccountCredentials.from_json_keyfile_dict(GOOGLE_APPLICATION_CREDENTIALS)
    return discovery.build('vision', 'v1', credentials=credentials,
                           discoveryServiceUrl=DISCOVERY_URL)

Les informations d'identification sont obtenues dans ServiceAccountCredentials au lieu de GoogleCredentials dans Sample. Je ne voulais pas le sauvegarder (je voulais le transmettre via API Gateway). Comme line.py, il n'est pas encore implémenté.

Impressions

Je pense que LINE BOT peut offrir une commodité similaire à Slack à de nombreux utilisateurs, je pense donc qu'il y a un grand potentiel.

Même si ce n'est qu'en interne, ce que vous faites en entreprise, comme le provisionnement des ressources AWS, la vérification du statut d'accès et ce que les développeurs ont fait en utilisant pleinement les outils, même les non-développeurs peuvent le faire en Suisse. Je sens que je peux l'utiliser.

Pour l'instant, mettons dans une implémentation qui rend le message drôle à partir du résultat obtenu par LABEL_DETECTION de l'API Vision!

Recommended Posts

Python appelant l'API Google Cloud Vision depuis LINE BOT via AWS Lambda
Utiliser l'API Google Cloud Vision de Python
LINE BOT avec Python + AWS Lambda + API Gateway
Exemple d'API Google Cloud Vision pour python
Utiliser l'API Google Analytics de Python
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: API Google Cloud Vision)
Détectez les caractères japonais à partir d'images à l'aide de l'API Cloud Vision de Google avec Python
Extraction de texte avec l'API GCP Cloud Vision (Python3.6)
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
J'ai essayé d'utiliser l'API Google Cloud Vision
Version Amazon API Gateway et AWS Lambda Python
Créer un robot LINE de retour de perroquet avec AWS Cloud9
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
Procédure de création d'un Line Bot sur AWS Lambda
Procédure de transcription vocale à l'aide de Python et de l'API Google Cloud Speech
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
Tweet d'AWS Lambda
Création d'un BOT «Présentation non officielle du produit remis à neuf par Apple» avec l'API de messagerie LINE (v2) + API Gateway + lambda (python)
Appelez l'API Bing Image Search v5 depuis Python pour collecter des images
Remarques sur l'accès à SQS depuis AWS VPC Lambda via un point de terminaison
Je souhaite envoyer un message de Python à LINE Bot
Essayez de juger des photos de plats à l'aide de l'API Google Cloud Vision
Obtenez des données de l'API d'analyse avec le client API Google pour python
J'ai essayé l'API Google Cloud Vision pour la première fois
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
[Python] Scraping dans AWS Lambda
AWS CDK-Lambda + API Gateway (Python)
Interroger Athena depuis Lambda Python
Conseils relatifs aux API Google Drive (Python)
Utilisez l'API e-Stat de Python
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Diffusez la reconnaissance vocale à l'aide de l'API gRPC Google Cloud Speech avec python3 sur Mac!
Jusqu'à ce que vous essayiez l'API Google Cloud Vision (détection d'images dangereuses)
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Manipulation des données Kintone avec le pilote ODBC Python & C Data d'AWS Lambda
Comment se connecter à Cloud Firestore à partir de Google Cloud Functions avec du code Python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Touchons l'API Vision de Google de Python pour le moment
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.