Der Mechanismus, der Hubots Hubot-Skript entspricht, wird in Errbot als Plugin bezeichnet.
Hier enthält Plugins von Drittanbietern. Ich werde es schaffen, weil es eine große Sache ist.
Das Plugin benötigt zwei Dateien.
Die Plug-Datei ist eine ** Plugin-Metadatendatei **. Es beschreibt die Python-Versionsspezifikation, die Erklärung beim Ausführen des Hilfebefehls usw.
Das Python-Modul ist eine ** Plugin-Entität **. Schreiben Sie die Logik hier.
hello.plug
[Core]
Name = Hello
Module = hello
[Python]
Version = 2+
[Documentation]
Description = Hello plugin
hello.py
# -*- coding:utf8 -*-
from __future__ import division, print_function, absolute_import
from errbot import BotPlugin, botcmd
class Hello(BotPlugin):
@botcmd
def hello(self, msg, args):
return 'Hello world!'
Die Entitätsklasse des Plugins erbt von BotPlugin. Zum Zeitpunkt der Initialisierung werden verschiedene Verarbeitungsschritte ausgeführt, diesmal werde ich jedoch darauf verzichten.
Der Name der Methode, die mit dem Dekorator botcmd
dekoriert wurde, wird so wie er ist zum Befehl.
! Hallo
der Befehl wie er ist.Die Methode, die zum Befehl bot wird, erfordert zwei Argumente.
Wenn die mit botcmd
dekorierte Methode einen String zurückgibt, spricht sie so wie sie ist.
Es ist einfach und schön.
weather.py
# -*- coding:utf8 -*-
from __future__ import division, print_function, absolute_import
from errbot import BotPlugin, botcmd
import requests
from xml.etree import ElementTree
class Weather(BotPlugin):
WEATHER_HACK_AREA_URL = \
'http://weather.livedoor.com/forecast/rss/primary_area.xml'
WEATHER_HACK_API_URL = \
'http://weather.livedoor.com/forecast/webservice/json/v1?'
@botcmd
def weather(self, msg, args):
#Suchen Sie die im Argument angegebene Stadt
city_id = self.find_city_id(args)
if city_id is None:
return u'{}Ist ein unbekannter Bereich'.format(args)
resp = requests.get(
self.WEATHER_HACK_API_URL,
{'city': city_id}
)
wt_json = resp.json()
return u'{}: {}Ist{}'.format(
wt_json['title'],
wt_json['forecasts'][0]['dateLabel'],
wt_json['forecasts'][0]['telop']
)
def find_city_id(self, city_name):
"""Finden Sie mit der Livedoor-API eine Stadt, die das Wetter zurückgibt
"""
resp = requests.get(self.WEATHER_HACK_AREA_URL)
tree = ElementTree.fromstring(resp.content)
cities = {
elm.attrib['title']: elm.attrib['id']
for elm in tree.findall('.//city')
}
return cities.get(city_name, None)
Zu diesem Zeitpunkt wird args grob als der Name der Stadt angesehen und das Wetter wird zurückgegeben. "Wenn Sie mehrere Städte nach Raum werfen, teilen Sie sie und geben Sie das Wetter jeder Stadt zusammen zurück." Es ist auch möglich. Wenn Sie ArgumentParser verwenden, können Sie flexibel mit Argumenten umgehen, sodass es anscheinend verschiedene Möglichkeiten gibt.
Recommended Posts