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