Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe

Einführung

Aus dem vorherigen "Ich habe versucht, Slackbot nach dem Studium von Python 3 zu verwenden" Wir haben Funktionen verbessert oder hinzugefügt.

Spezifikation

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

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

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

Umwelt etc.

Ich habe Pillow verwendet, um mit Bilddateien zu arbeiten.

Verfassung

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.

Implementierung

Diesmal nur die Änderungen. Im Gegensatz zum letzten Mal ist es eine Erklärung für jede Spezifikation.

Suche suchen

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.

Regenwolkensuche

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

スクリーンショット 2017-06-01 23.27.30.png

Am Ende

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.

Nachtrag (20170701)

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

Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, PLSA in Python 2 zu implementieren
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Einfaches Japanisch ⇒ Ich habe versucht, ein englisches Übersetzungswerkzeug zu erstellen
Ich habe eine Web-API erstellt
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
[TCP / IP] Versuchen Sie nach dem Studium, mit Python einen HTTP-Client zu erstellen
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich überarbeitete "Ich habe versucht, Othello AI zu machen, als Programmieranfänger Python studierten"
Ich möchte ein Spiel mit Python machen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, KI für Smash Bra zu machen
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe Python> autopep8 ausprobiert
Ich habe versucht zu debuggen.
Ich habe Python> Decorator ausprobiert
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
Python / PEP8> E128 Ich habe versucht, die für den visuellen Einzug unter eingerückte Fortsetzungszeile aufzulösen
[Python] Ich habe versucht, eine Shiritori-KI zu erstellen, die den Wortschatz durch Schlachten verbessert
[Einführung in Docker] Ich habe versucht, verschiedene Docker-Kenntnisse zusammenzufassen, die durch das Studium gewonnen wurden (Windows / Python).
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Als ich versuchte, Python3 in Atom einzuführen, blieb ich stecken
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren