Wie der Titel schon sagt, habe ich nach dem Studium von Python einen Bot für Slack gemacht. Da andere Leute in dem Artikel geschrieben haben, wird es eine Ebene sein, die ich in meinem eigenen Memorandum belassen werde. Es wird nicht beschrieben, wie Sie Slack registrieren und Heroku verwenden, bis Sie Bot verwenden. Da der Quellcode veröffentlicht ist, weisen Sie bitte auf Fehler beim Schreiben des Quellcodes hin.
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.
slackbot/ ├ plugins/ │ └ slackbot_restapi.py │ └ restapi.py │ └ gnaviapi.py │ └ run.py └ slackbot_settings.py └ Procfile (Heroku-Datei) └ runtime.txt (Datei für Heroku)
run.py
"""Slack Bot Program."""
# coding: utf-8
from slackbot.bot import Bot
def main():
"""
Slackbot
"""
bot = Bot()
bot.run()
if __name__ == '__main__':
main()
slackbot_settings.py
"""
Configuration file for slackbot
"""
API_TOKEN = 'YOUR_API_TOKEN'
DEFAULT_REPLY = 'Worüber redest du?'
PLUGINS = ['plugins']
Wie in [hier] geschrieben (https://github.com/lins05/slackbot). Führen Sie run.py aus und Slackbot beginnt zu arbeiten.
slackbot_restapi.py
plugins/slackbot_restapi.py
"""
Plugin Program
"""
from requests.exceptions import RequestException
from slackbot.bot import listen_to
from plugins.gnaviapi import GnaviApi
@listen_to('Reis')
def search_restraunt(message):
"""
Suchen Sie anhand der empfangenen Nachricht nach Guru Navi und geben Sie die URL zurück
"""
gnavi = GnaviApi('https://api.gnavi.co.jp/RestSearchAPI/20150630/')
key = 'YOUR_API_KEY'
search_word = message.body['text'].split()
if len(search_word) == 3:
params = {
'keyid': key,
'format': 'json',
'address': search_word[1],
'freeword': search_word[2]
}
try:
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')
Es nimmt den in Slack eingegebenen Inhalt auf und verarbeitet ihn. Die subtile Sucht hier war, dass ich nicht wusste, wie ich die in Slack eingegebene Nachricht aufnehmen sollte. Nach ein wenig Recherche
message.body['text']
Ich fand, dass ich es mit bekommen kann. Teilen Sie die aufgenommene Nachricht mit split () und verwenden Sie den Speicherort und das freie Wort als API-Parameter.
Ich habe es geschafft, indem ich Python-Klassen und Vererbung studiert habe. In restapi.py ist es eine Klasse, die nur eine Anfrage auslöst und eine Antwort entgegennimmt. In gnaviapi.py haben wir eine Methode hinzugefügt, um eine Nur-URL-Liste von Response zu erstellen und zurückzugeben. Die Notation der Listeneinbeziehung ist praktisch, nicht wahr? Es war etwas Frisches.
plugins/restapi.py
"""
REST API CLASS
"""
# -*- coding: utf-8 -*-
import requests
from requests.exceptions import RequestException
class RestApi():
"""
REST API CLASS
"""
def __init__(self, url):
self.url = url
self.response_data = None
def api_request(self, search_dict):
"""
API-Aufruf
"""
try:
self.response_data = requests.get(self.url, params=search_dict)
except RequestException:
raise Exception('API-Zugriff fehlgeschlagen')
plugins/gnaviapi.py
"""
Guru Navi API
"""
# -*- coding: utf-8 -*-
from plugins.restapi import RestApi
class GnaviApi(RestApi):
"""
Guru Navi API-Klasse
"""
def __init__(self, url):
super().__init__(url)
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 ...(´ ・ ω ・ `)')
return [rest_data['url'] for rest_data in json_data['rest']]
Es ist so.
Es scheint einfach zu erweitern, so dass Sie mit anderen APIs wie ATND und Punkten suchen können. Ich glaube, ich habe mehr Zeit damit verbracht, Heroku zu verwenden, als es in Python zu implementieren.
Recommended Posts