Aus dem vorherigen "Ich habe versucht, Slackbot nach dem Studium von Python 3 zu verwenden" Wir haben Funktionen verbessert oder hinzugefügt.
Geben Sie mithilfe der Guru Navi-API ein Suchwort in Slack ein und geben Sie die Treffer-URL zurück. Wenn Sie "Reis Shinagawa Yakitori" eingeben, wird die URL eines Geschäfts zurückgegeben, das wie ein Yakitori-Restaurant in Shinagawa aussieht. Da ich bei der Suche nach dem Schlüsselwort "Standort" nach Adresse gesucht habe, wird das Ergebnis des vom tatsächlichen Bild abweichenden Standorts zurückgegeben. Daher habe ich mithilfe des Bereichsmasters zur Suche gewechselt.
Es handelt sich um eine Suche nach Geschäftsnamen mithilfe der Guru Navi-API. Wenn Sie "Shinagawa LOL einkaufen" eingeben, wird die URL von Shinagawa LOL zurückgegeben. Es ist einfach eine Suche nach Geschäftsnamen. Wir können jedoch keine Fälle behandeln, in denen ein Leerzeichen zwischen ihnen besteht.
Gibt das Radarbild der Regenwolke mithilfe der Geocoder-API und der statischen Karten-API von Yahoo zurück.
Wenn Sie "rain Shinagawa" eingeben, wird ein Kartenbild mit Regenwolken in der Nähe von Shinagawa zurückgegeben. Verwenden Sie die Slack-API files.upload
, um das Kartenbild zurückzugeben.
Ich habe Pillow verwendet, um mit Bilddateien zu arbeiten.
slackbot/ ├ plugins/ │ └ slackbot_restapi.py │ └ restapi.py │ └ gnaviapi.py │ └ run.py └ slackbot_settings.py └ Procfile (Heroku-Datei) └ runtime.txt (Datei für Heroku)
Es hat sich nicht besonders geändert. Ich ändere gnaviapi.py und slackbot_restapi.py. Klassifizierung und irgendwie Organisation sind jedoch nicht geteilt w Ich denke, ich kann es etwas schöner schreiben.
Diesmal nur die Änderungen. Im Gegensatz zum letzten Mal ist es eine Erklärung für jede Spezifikation.
slackbot_restapi.py
"""
Plugin Program
"""
from io import BytesIO
import requests
from requests.exceptions import RequestException
from PIL import Image
from slackbot.bot import listen_to
from plugins.restapi import RestApi
from plugins.gnaviapi import GnaviApi
import slackbot_settings
@listen_to('Reis')
@listen_to('Geschäft')
def search_restraunt(message):
"""
Suchen Sie anhand der empfangenen Nachricht nach Guru Navi und geben Sie die URL zurück.
Ort: Bereich M Master Code(areacode_m)oder Adresse(address)
Schlüsselwörter: freie Wörter(freeword)oder Geschäftsname(name)
"""
url = 'https://api.gnavi.co.jp/RestSearchAPI/20150630/'
key = 'YOUR_GNAVI_API_TOKEN'
gnavi = GnaviApi(url, key)
search_word = message.body['text'].split()
if len(search_word) >= 3:
try:
params = gnavi.create_params(search_word)
gnavi.garea_middle_fech()
search_area = gnavi.garea_middle_search(search_word[1])
if len(search_area) == 0:
search_area = {'address': search_word[1]}
params.update(search_area)
gnavi.api_request(params)
for rest_url in gnavi.url_list():
message.send(rest_url)
except RequestException:
message.send('Ich bin nicht in Guru Navi eingestiegen, also suche es später noch einmal ...( ´Д`)y━ ━~~')
return
except Exception as other:
message.send(''.join(other.args))
return
else:
message.send('↓ Ich möchte, dass Sie so suchen ...( ̄Д ̄)Nein')
message.send('Reisplatz-Schlüsselwort (Zeichen werden durch Leerzeichen getrennt)')
message.send('Beispiel) Reis Shinagawa Yakitori')
Mit params = gnavi.create_params (search_word)
beurteilt es "Reis" oder "Speichern" und schaltet den Parameter, der an die API gesendet werden soll, auf freies Wort oder Speichernamen um.
Verwenden Sie "garea_middle_fech ()", um den Gebiets-M-Meister von Guru Navi zu durchsuchen und die Vorwahl zu erhalten.
garea_middle_search (search_word [1])
gibt die erste Vorwahl zurück, die dem in Slack eingegebenen Ortsnamen entspricht.
Wenn Sie die Vorwahl nicht erhalten können, suchen wir weiter nach der Adresse.
Der Rest ist der gleiche wie beim letzten Mal.
gnavapi.py
"""
Guru Navi API
"""
# -*- coding: utf-8 -*-
from requests.exceptions import RequestException
from plugins.restapi import RestApi
class GnaviApi(RestApi):
"""
Guru Navi API-Klasse
"""
def __init__(self, url, key):
super().__init__(url)
self.key = key
self.garea_s = None
def create_params(self, search_word):
"""
Ändern Sie die API-Parameter gemäß den in Slack eingegebenen Schlüsselwörtern.
"""
params = {
'format': 'json'
}
if search_word[0] == 'Reis':
params['freeword'] = search_word[2]
elif search_word[0] == 'Geschäft':
params['name'] = search_word[2]
return params
def url_list(self):
"""
Erstellen Sie aus Response eine Liste mit Restaurant-URLs und geben Sie diese zurück.
"""
json_data = self.response_data.json()
if 'error' in json_data:
raise Exception('Ich konnte es mit diesem Schlüsselwort nicht finden ...(´ ・ ω ・ `)')
if json_data['total_hit_count'] == '1':
return [(json_data['rest'])['url']]
else:
return [rest_data['url'] for rest_data in json_data['rest']]
def garea_middle_fech(self):
"""
Holen Sie sich den Bereich M Master von der Guru Navi API.
"""
garea = RestApi('https://api.gnavi.co.jp/master/GAreaMiddleSearchAPI/20150630/')
params = {
'keyid': self.key,
'format': 'json',
'lang': 'ja'
}
try:
garea.api_request(params)
self.garea_s = garea.response_data.json()
if 'error' in self.garea_s:
raise Exception('Ich kenne den Ort nicht ...(´ ・ ω ・ `)')
except RequestException:
raise RequestException()
def garea_middle_search(self, area_name):
"""
Aus dem Bereich M Master, Bereich_Ruft den Wert ab, der dem Namen entspricht.
(Da es streng ist, wenn es sich um eine exakte Übereinstimmung handelt, handelt es sich um eine teilweise Übereinstimmung.)
"""
result_dict = {}
for area_s in self.garea_s['garea_middle']:
if area_s['areaname_m'].find(area_name) >= 0:
result_dict = {'areacode_m': area_s['areacode_m']}
break
return result_dict
↑ Der Guru Navi API-Klasse wurde eine Methode zur Suche nach einem Bereichsmaster hinzugefügt.
slackbot_restapi.py
"""
Plugin Program
"""
from io import BytesIO
import requests
from requests.exceptions import RequestException
from PIL import Image
from slackbot.bot import listen_to
from plugins.restapi import RestApi
from plugins.gnaviapi import GnaviApi
import slackbot_settings
def search_restraunt(message):
"""
Kürzung!!!
"""
@listen_to('Regen')
def search_weather(message):
"""
Abrufen von Längen- und Breitengraden von der Geocoder-API basierend auf der empfangenen Nachricht.
Gibt das Regenwolkenradarbild von der statischen Karten-API basierend auf dem Breiten- und Längengrad zurück.
Standort-Adresse(query)
"""
url_geocoder = 'https://map.yahooapis.jp/geocode/V1/geoCoder'
url_staticmap = 'https://map.yahooapis.jp/map/V1/static'
key_yahoo = 'YOUR_YAHOO_API_TOKEN'
url_slackapi = 'https://slack.com/api/files.upload'
geocoder_api = RestApi(url_geocoder)
staticmap_api = RestApi(url_staticmap)
search_word = message.body['text'].split()
try:
geocoder_api_params = {
'appid': key_yahoo,
'query': search_word[1],
'output': 'json'
}
geocoder_api.api_request(geocoder_api_params)
geocoder_json = geocoder_api.response_data.json()
if 'Error' in geocoder_json:
raise Exception('Ich kenne den Ort nicht ...(´ ・ ω ・ `)')
coordinates = (((geocoder_json['Feature'])[0])['Geometry'])['Coordinates']
staticmap_api_params = {
'appid': key_yahoo,
'lon': (coordinates.split(','))[0],
'lat': (coordinates.split(','))[1],
'overlay': 'type:rainfall',
'output': 'jpg',
'z': '13'
}
staticmap_api.api_request(staticmap_api_params)
slackapi_params = {
'token': slackbot_settings.API_TOKEN,
'channels': 'C5CJE5YBA'
}
image_obj = Image.open(BytesIO(staticmap_api.response_data.content), 'r')
image_obj.save('/tmp/weather.jpg')
with open('/tmp/weather.jpg', 'rb') as weatherfile:
requests.post(url_slackapi, data=slackapi_params, files={
'file': ('weather.jpg', weatherfile, 'image/jpeg')})
except Exception as other:
message.send(''.join(other.args))
return
Im Gegensatz zur Guru Navi API scheint der Gebietsmaster nicht zu existieren, daher werden der Breiten- und Längengrad basierend auf der Adresse erfasst. Sobald Sie den Längen- und Breitengrad haben, ist der Rest einfach. Es war einfach, die Bilddaten ** "zu erhalten" ** zu erhalten. Bisher ...
Von hier aus war ich süchtig danach.
Ich hatte Angst, dass ich keine Bilddaten auf Slack hochladen könnte.
Zuerst dachte ich, ich würde gehen, wenn ich "image_obj = Image.open (BytesIO (staticmap_api.response_data.content)," r ")" senden würde, aber es ist völlig nutzlos.
Infolge verschiedener Versuche gelang es mir, die eigentliche Datei einmal zu speichern, mit kopen ()
zu lesen und die Daten zu senden.
Heroku scheint in der Lage zu sein, Dateien unter "/ tmp" zu speichern, daher habe ich sie als "image_obj.save (" / tmp / weather.jpg ") gespeichert und neu geladen.
Da image_obj
ein JpgImageFile
-Objekt war, wäre es dasselbe wie das file
-Objekt. Ist es die Ursache für die Niederlage? Ich war ungefähr 3 Tage besorgt, indem ich "PngImageFile" oder "image_obj = BytesIO (staticmap_api.response_data.content)" setzte und dann "getvalue ()" und "getbuffer ()" w verwendete
Ich überprüfe die Spezifikationen von "request.post ()", weiß aber nicht, warum "JpgImageFile" nicht gesendet werden kann. Ich werde weiter nachforschen, aber wenn jemand es weiß, lass es mich wissen.
Danke für deinen Kommentar
Vorher ändern
image_obj = Image.open(BytesIO(staticmap_api.response_data.content), 'r')
image_obj.save('/tmp/weather.jpg')
with open('/tmp/weather.jpg', 'rb') as weatherfile:
requests.post(url_slackapi, data=slackapi_params, files={
'file': ('weather.jpg', weatherfile, 'image/jpeg')})
Dieser Teil,
Nach der veränderung
output = BytesIO()
image_obj = Image.open(BytesIO(staticmap_api.response_data.content), 'r')
image_obj.save(output, 'jpeg')
requests.post(slackbot_settings.API_URL, data=slackapi_params, files={
'file': ('weather.jpg', output.getvalue(), 'image/jpeg')
})
Ich habe es korrigiert und verschoben, und es hat funktioniert! Warum hat es nicht so funktioniert wie es ist? Trotzdem danke!
Recommended Posts