Python ruft die Google Cloud Vision API von LINE BOT über AWS Lambda auf

Dieser Artikel Und versuchte fast das gleiche mit Python zu machen. Erst nach der Verwendung von LINE BOT werden Sie den Spaß und das Potenzial erkennen. Sehr lustig und praktisch, das!

Ich bin sehr gespannt, was nach dem Ende des Prozesses passieren wird, aber zuerst werde ich es umsetzen ^^

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") #Tatsächlich gibt es mehrere Ergebnisse. Wenn es Lambda ist, ist es vorerst Multithreading. (Obwohl Sie es in SQS setzen können)
    line.set_return_text(content)
    line.send_to_line(content)

Vorerst der Eingang zu AWS Lambda. In diesem Fall erhalten Sie einen JSON mit Informationen von LINE. Erstellen Sie daher eine Antwort von dort und senden Sie sie an den LINE-Server.

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"'Ist das eine schwierige Frage?" + os.linesep + \
                          u"Ich kann gut fotografieren!"
    elif content_type == CONTENT_TYPE_IMAGE:
        image = get_message_content(content)
        content["text"] = vision.get_image_text(image)
    else:
        content["text"] = u"Es tut mir leid, ich bin nicht sicher>_<" + os.linesep + \
                          u"Ich kann gut fotografieren!"
    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

Packen Sie Ihre Anmeldeinformationen in LINE_HEADER. Es ist jetzt solide, aber in Wirklichkeit ist das Repository nicht verschmutzt, wenn Sie die Authentifizierungsinformationen aus requestTemplate oder stageVariable von API Gateway einbetten.

Wenn ein Foto gesendet wird, werden die Fotodaten von dieser ID abgerufen und an vision.py übergeben, um die Antwortnachricht abzurufen.

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" #Verschiedene weggelassen. Rufen Sie Ihre Anmeldeinformationen über die Google Developer Console ab.
}

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"Ich denke nicht, dass es so sein sollte!"
    if annotation.get("medical") == "POSSIBLE" or annotation.get("medical") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Derartiges ..."
    if annotation.get("spoof") == "POSSIBLE" or annotation.get("spoof") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Sie können nicht betrogen werden! ??"
    if annotation.get("violence") == "POSSIBLE" or annotation.get("violence") == "LIKELY" or annotation.get(
            "adult") == "VERY_LIKELY":
        return u"Oh, Gewalt ist nicht gut! Ist nutzlos! Gya!"

    text = u""
    annotations = response['responses'][0].get('labelAnnotations')
    if annotations != None:
        text = text + u'Ich denke, es ist ein Bild wie dieses.' + 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"Sie können diese Zeichen sehen." + 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"Ich habe eine Person auf dem Bild gefunden!" + os.linesep
        count = 1
        for annotation in annotations:
            text = text + str(count) + u'Das Auge ist'
            if annotation.get("joyLikelihood") == "POSSIBLE" or annotation.get("joyLikelihood") == "LIKELY" or annotation.get("joyLikelihood") == "VERY_LIKELY":
                text = text + u"Sieht spaßig aus!" + os.linesep
            elif annotation.get("sorrowLikelihood") == "POSSIBLE" or annotation.get("sorrowLikelihood") == "LIKELY" or annotation.get("sorrowLikelihood") == "VERY_LIKELY":
                text = text + u"Sieht traurig aus ...!" + os.linesep
            elif annotation.get("angerLikelihood") == "POSSIBLE" or annotation.get("angerLikelihood") == "LIKELY" or annotation.get("angerLikelihood") == "VERY_LIKELY":
                text = text + u"Bist du wütend?" + os.linesep
            elif annotation.get("surpriseLikelihood") == "POSSIBLE" or annotation.get("surpriseLikelihood") == "LIKELY" or annotation.get("surpriseLikelihood") == "VERY_LIKELY":
                text = text + u"Ich bin überrascht!!" + os.linesep
            elif annotation.get("underExposedLikelihood") == "POSSIBLE" or annotation.get("underExposedLikelihood") == "LIKELY" or annotation.get("underExposedLikelihood") == "VERY_LIKELY":
                text = text + u"Ist das Unterbelichtung?" + os.linesep
            elif annotation.get("blurredLikelihood") == "POSSIBLE" or annotation.get("blurredLikelihood") == "LIKELY" or annotation.get("blurredLikelihood") == "VERY_LIKELY":
                text = text + u"Es ist unscharf>_<" + os.linesep
            elif annotation.get("headwearLikelihood") == "POSSIBLE" or annotation.get("headwearLikelihood") == "LIKELY" or annotation.get("headwearLikelihood") == "VERY_LIKELY":
                text = text + u"Trägst du einen Hut?" + os.linesep
            else:
                text = text + u"gewöhnlich?" + os.linesep
            count = count + 1
        text = text + os.linesep

    annotations = response['responses'][0].get('landmarkAnnotations')
    if annotations != None:
        text = text + u"Oh, vielleicht ist das der richtige Ort!" + 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, ich kenne dieses 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)

Anmeldeinformationen werden in ServiceAccountCredentials anstelle von GoogleCredentials in Beispiel abgerufen. Ich wollte es nicht speichern (ich wollte es über API Gateway übergeben). Wie line.py ist es noch nicht implementiert.

Impressionen

Ich denke, dass LINE BOT vielen Benutzern Slack-ähnlichen Komfort bieten wird, daher habe ich das Gefühl, dass es ein großes Potenzial gibt.

Selbst wenn es nur intern ist, was Sie im Geschäft tun, wie die Bereitstellung von AWS-Ressourcen, die Überprüfung des Zugriffsstatus und was Entwickler unter vollständiger Nutzung von Tools getan haben, können auch Nicht-Entwickler die LINE-Schnittstelle verwenden. Ich habe das Gefühl, ich kann es benutzen.

Lassen Sie uns vorerst eine Implementierung einfügen, die die Nachricht aus dem Ergebnis von LABEL_DETECTION der Vision API lustig macht!

Recommended Posts

Python ruft die Google Cloud Vision API von LINE BOT über AWS Lambda auf
Verwenden Sie die Google Cloud Vision-API von Python
LINE BOT mit Python + AWS Lambda + API Gateway
Google Cloud Vision API-Beispiel für Python
Verwenden Sie die Google Analytics-API von Python
Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: Google Cloud Vision API)
Erkennen Sie japanische Zeichen anhand von Bildern mithilfe der Cloud Vision-API von Google mit Python
Textextraktion mit GCP Cloud Vision API (Python3.6)
Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Amazon API Gateway und AWS Lambda Python-Version
Lassen Sie einen Papagei LINE Bot mit AWS Cloud9 zurückgeben
[Python] Verwenden der Linien-API [1. Erstellung des Beauty-Bots]
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
Sprachtranskriptionsverfahren mit Python und Google Cloud Speech API
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Tweet von AWS Lambda
"Inoffizielle Apple Refurbished Product Introduction" BOT mit LINE Messaging API (v2) + API Gateway + Lambda (Python)
Rufen Sie die Bing Image Search API v5 von Python auf, um Bilder zu sammeln
Hinweise zum Zugriff auf SQS von AWS VPC Lambda über den Endpunkt
Ich möchte eine Nachricht von Python an LINE Bot senden
Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Ich habe die Google Cloud Vision-API zum ersten Mal ausprobiert
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[Python] Scraping in AWS Lambda
AWS CDK-Lambda + API-Gateway (Python)
Fragen Sie Athena von Lambda Python ab
Google Drive API-Tipps (Python)
Verwenden Sie die e-Stat-API von Python
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Streamen Sie die Spracherkennung mithilfe der gRPC-API von Google Cloud Speech mit Python3 auf dem Mac!
Bis Sie die Google Cloud Vision-API ausprobieren (Erkennung schädlicher Bilder)
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Bearbeiten von Kintondaten mit dem Python & C Data ODBC-Treiber von AWS Lambda
Herstellen einer Verbindung zum Cloud Firestore über Google Cloud-Funktionen mit Python-Code
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Lassen Sie uns vorerst Googles Vision API von Python berühren
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.