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.
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!