Le mécanisme qui correspond au script hubot de Hubot s'appelle un plugin dans Errbot.
Ici a des plugins tiers, Je vais y arriver parce que c'est un gros problème.
Le plugin nécessite deux fichiers.
Le fichier de plug-in est un ** fichier de métadonnées de plug-in **. Il décrit la spécification de la version de Python, l'explication lors de l'exécution de la commande d'aide, etc.
Le module python est une ** entité plugin **. Écrivez la logique ici.
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!'
La classe d'entité du plugin hérite de BotPlugin. Il effectue divers traitements au moment de l'initialisation, mais je vais l'omettre cette fois.
Le nom de la méthode décoré avec le décorateur botcmd
devient la commande telle quelle.
! Hello
est la commande telle qu'elle est.La méthode qui devient la commande bot nécessite deux arguments.
Si la méthode décorée en botcmd
renvoie une chaîne, elle parlera tel quel.
C'est facile et agréable.
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):
#Trouvez la ville spécifiée dans l'argument
city_id = self.find_city_id(args)
if city_id is None:
return u'{}Est une zone non identifiée'.format(args)
resp = requests.get(
self.WEATHER_HACK_API_URL,
{'city': city_id}
)
wt_json = resp.json()
return u'{}: {}Est{}'.format(
wt_json['title'],
wt_json['forecasts'][0]['dateLabel'],
wt_json['forecasts'][0]['telop']
)
def find_city_id(self, city_name):
"""Trouvez une ville qui renvoie la météo avec l'API de Livedoor
"""
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)
À ce stade, args est à peu près considéré comme le nom de la ville et la météo est renvoyée, "Si vous lancez plusieurs villes par division spatiale, divisez-les et renvoyez la météo de chaque ville ensemble." C'est également possible. Si vous utilisez ArgumentParser, vous pouvez gérer les arguments de manière flexible, il semble donc qu'il existe plusieurs possibilités.
Recommended Posts