Ceci est une ancienne révision du document !
Errbot
Errbot est un logiciel de bot multiplateforme, dont XMPP et IRC, (là où Eggdrop et Limnoria fonctionnent avant tout sur IRC).
On peut utiliser des “bots” sur les canaux de discussions pour divers usages. Nous avons sur nos canaux un bot qui ramène les dernières infos de certains flux RSS et est parfois animé de sa propre vie : Pendorid. Ce bot est mis en place grâce au logiciel Errbot
.
Cet article détaille comment gérer un bot avec Errbot. Il vaut mieux installer Errbot sur un serveur afin que le bot soit présent en permanence ensuite.
Installation
Il faut faire ce qui suit avec python3.
Sous Debian stable, python est encore par défaut à une vieiiiiiille version, alors que python3 est pourtant présent.
Donc, changeons ça :
rm /usr/bin/python ln -s /usr/bin/python3 /usr/bin/python
Si vous avez des erreurs sur python lors d'une mise à jour du système, remettez le lien symbolique sur python2 le temps de faire la mise à jour.
Puis installez pipenv
, avec l'utilisateur (pas en root !) afin de ne pas casser le système :
python -m pip install pip --upgrade --user python -m pip install pipenv --user
Source : http://sametmax.com/pipenv-solution-moderne-pour-remplacer-pip-et-virtualenv/
Note : avec Debian, il faudra peut-être remplacer la simple commande pipenv
par python -m pipenv
. Pourquoi faire simple ?
mkdir -p "~/errbot" cd "~/errbot" pipenv install errbot pipenv run errbot --init
Alternative sans pipenv
virtualenv --python $(which python3) ~/.errbot-ve source .errbot-ve/bin/activate ~/.errbot-ve/bin/pip install errbot mkdir ~/errbot cd ~/errbot errbot --init
source .errbot-ve/bin/activate
met dans un environnement virtuel, pour en sortir il suffit de faire deactivate
, et relancer la commande source .errbot-ve/bin/activate
pour y revenir.
Pour XMPP, il faut installer des trucs en plus :
pip install sleekxmpp pyasn1 pyasn1-modules
Actuellement, sleekxmpp a un bug, il faut installer une version précédente. Un problème de compatibilité a également été constaté avec les deux autres dépendances.
pip install sleekxmpp==1.3.1 pyasn1==0.3.7 pyasn1-modules==0.1.4
Si jamais ça coince dans le virtualenv, on doit sortir afin d'installer certains paquets, puis les réimporter dans le virtual-env :
deactivate pip install sleekxmpp pyasn1 pyasn1-modules source .errbot-ve/bin/activate cd ~/errbot pip install sleekxmpp pyasn1 pyasn1-modules errbot
Config.py
Le fichier ~/errbot/config.py contient la configuration du bot ; les exemples de ce qu'on peut y mettre sont dans http://errbot.io/en/latest/_downloads/config-template.py.
Voici ce qu'il contient chez nous (à un mot de passe près) :
- config.py
import logging # This is a minimal configuration to get you started with the Text mode. # If you want to connect Errbot to chat services, checkout # the options in the more complete config-template.py from here: # https://raw.githubusercontent.com/errbotio/errbot/master/errbot/config-template.py #Config de base BOT_DATA_DIR = '/home/lapinou/erbaut/data' BOT_EXTRA_PLUGIN_DIR = '/home/lapinou/erbaut/plugins' BOT_LOG_FILE = '/home/lapinou/erbaut/errbot.log' BOT_LOG_LEVEL = logging.INFO #IPV6 pour voir si ça passe XMPP_USE_IPV6 = True # Liste des admins autorisées à modifier le bot en ligne BOT_ADMINS = ('zatalyz@movim.eu', ) #Install auto des dépendances des plugins AUTOINSTALL_DEPS = True ## XMPP BACKEND = 'XMPP' BOT_IDENTITY = { # XMPP 'username': 'erbaut@jabber.fr', # The JID of the user you have created for the bot 'password': 'ACHANGER', } CHATROOM_PRESENCE = ('khanat@chat.khaganat.net','krypte@chat.khaganat.net',) # "nick" of the bot in the room CHATROOM_FN = 'Erbaut' ## Prefix configuration # autre nom auquel le bot répond (même si c'est dans une phrase ?) BOT_ALT_PREFIXES = ('pendorid',) # Evite que la casse change quelque chose BOT_ALT_PREFIX_CASEINSENSITIVE = True ## Contrôles d'accès et droits ACCESS_CONTROLS_DEFAULT = {} ACCESS_CONTROLS = { 'say': { 'allowrooms': ('khanat@chat.khaganat.net','krypte@chat.khaganat.net',), 'denyusers':('zatalyz@jabber.fr',) }, } HIDE_RESTRICTED_COMMANDS = True
Contrôle des ACL
La partie des contrôles d'accès est importante.
Par défaut, tout le monde a les accès :
ACCESS_CONTROLS_DEFAULT = {}
Mais en réalité, c'est les admins qui ont ces accès ouverts, hein…
On va ensuite définir des utilisateurs, des salons qui ont des accès, et définir qui peut faire quoi avec quels plugins
allowusers
etdenyusers
: autorise ou interdit les commandes à ces utilisateurs seulement.allowrooms
etdenyrooms
: autorise ou interdit ces commandes uniquement dans ces salons.allowprivate
: autorise ces commandes depuis un message direct avec le bot.allowmuc
: autorise ces commandes à l'intérieur des salons.
ACCESS_CONTROLS_DEFAULT = {} # autoriser l'accès à tout le monde par défaut ACCESS_CONTROLS = {'status': {'allowrooms': ('someroom@conference.localhost',)}, 'about': {'denyusers': ('*@evilhost',), 'allowrooms': ('room1@conference.localhost', 'room2@conference.localhost')}, 'uptime': {'allowusers': BOT_ADMINS}, 'help': {'allowmuc': False}, 'ChatRoom:*': {'allowusers': BOT_ADMINS}, }
On peut définir les noms explicitement (par exemple user@jabber.fr
), mais aussi par groupe dans le style unix : user@localhost
ou même *@localhost
. Le groupe d'utilisateur BOT_ADMINS
est aussi autorisé (incluant tout ce qui a été déclaré admin du bot).
Passer le bot en démon
La documentation officielle donne, pour lancer errbot en démon :
errbot --daemon
Je ne sais pas comment “marche” cette commande : si le serveur a un souci, est-ce qu'elle se relance au démarrage ? Ça parait incertain.
Cependant, sous la plupart des systèmes Linux, la bonne pratique consiste maintenant à passer par systemd.
Nous allons donc créer un service presque proprement.
Lancement automatique avec systemd
Version Tycho Brahe
C'est probablement presque la bonne façon de faire, sauf que ça ne marche pas pour moi avec pipenv… — zatalyz 2018/04/29 11:01
Afin de lancer le bot automatiquement à chaque redémarrage de la machine, il est possible de créer un service systemd. Et afin d'avoir plusieurs instances, on décide d'un répertoire qui contiendra le dossier de chaque instance.
Créons donc /etc/systemd/system/errbot@.service
:
[Unit] Description=Chat bot After=network.target network-online.target [Service] Type=simple User=khaganat Group=khaganat ExecStart=/path/to/.errbot-ve/bin/errbot --config=/path/to/config/%I/config.py [Install] WantedBy=multi-user.target
Il est alors possible d'activer une instance :
# systemctl enable errbot@monbot # systemctl start errbot@monbot
Avec l'exemple ci-dessus, la configuration utilisée sera /path/to/config/monbot/config.py
Version Zatalyz
Créer plutôt /etc/systemd/system/errbot.service
parce qu'avec le @ j'arrivais pas à faire enable
…
[Unit] Description=Chat bot Errbot After=network.target network-online.target [Service] Type=simple User=khaganat Group=khaganat WorkingDirectory=/home/khaganat/chatbot/errbot/ ExecStart=/usr/bin/python -m pipenv run errbot Restart=always KillSignal=SIGINT [Install] WantedBy=multi-user.target
Contrairement à la version de Tycho, ça ne sera pas multi-bot, mais à ce stade, je m'en fous.
Administrer le bot
Après pas mal d'errance, voici comment administrer le bot depuis xmpp lui-même.
Renseigner son identifiant jabber dans config.py
BOT_ADMINS = ('*@localhost','zatalyz@movim.eu',)
Puis ajouter le bot à ses contacts, et initier la conversation depuis les contacts, pas depuis le salon, sinon il croit qu'on est le salon ! Pour vérifier comment il nous voit, il suffit de lui envoyer la commande “!whoami”. C'est peut-etre lié au client jabber.
Commandes de base utiles
Pour avoir la liste des commandes de base
!help
Pour vérifier s'il sait qui on est :
!whoami
Pour voir les dernières infos du log du bot (pas le log des canaux hein, mais ce qui est passé en info au bot)
!log tail
Par défaut c'est assez long, on peut mettre un chiffre en paramètre pour limiter le nombre de lignes :
!log tail 10
Pages
La doc d'errbot est assez mal fichue, trouver les bonnes pages c'est la misère…
Plugins
Pour installer des plugins, il faudra que git soit présent sur le serveur où le bot fonctionne.
sudo apt install git
Installer un plugin
!repos install nomgithub/nomplugin
Désinstaller un plugin
!repos uninstall nomgithub/nomplugin
SayBot
https://github.com/log0ymxm/err-say est un plugin qui permet de faire causer le bot et il marche.
Pour l'installer :
!repos install log0ymxm/err-say
Il faut configurer les acl sinon elle n'a pas le droit de causer, par défaut.
Dans config.py, on renseigne pour la commande say :
ACCESS_CONTROLS = { 'say': { 'allowrooms': ('khanat@chat.khaganat.net','krypte@chat.khaganat.net',), }, }
Voir la configuration des ACL pour plus de détail.
La commande pour le faire causer :
!say salon:message
Par exemple :
!say krypte@chat.khaganat.net:hello !say krypte@chat.khaganat.net:/me n'aime pas causer
Moralité, va falloir un plugin d'alias… Car c'est vraiment long à écrire.
Autre point de détail : par défaut le plugin est configuré pour que seuls les administratrices puissent utiliser “say”.
Il faut modifier le fichier du plugin, dans votre dossier d'installation d'errbot (probablement errbot/data/plugins/log0ymxm/err-say/saybot.py
et passer admin_only=True
à admin_only=False
.
Configurez alors bien les ACL en autorisant explicitement certaines utilisatrices à faire causer le bot :
ACCESS_CONTROLS = { 'say': { 'allowrooms': ('khanat@chat.khaganat.net','krypte@chat.khaganat.net',), 'allowusers': ('georgette@movim.eu','marcek@jabber.fr',), }, }
Alias
https://github.com/rroemhild/err-alias
Pour l'installer :
!repos install rroemhild/err-alias
Créer un alias
!alias add raccourci commande
Enlever un alias
!alias remove raccourci
Alias à créer
!alias add y say krypte@chat.khaganat.net: !alias add s say khanat@chat.khaganat.net:
Appel !y message !s message
RSSReader
https://github.com/errbotters/err-rssreader/
Pour l'installer :
!repos install https://github.com/errbotters/err-rssreader
Pour lister les commandes et une explication de chacune :
!help rssreader
RSSReader Get newest content from your favorite RSS feeds via your Errbot. • !rssreader add - Add URL(s) of feed(s) to be checked for updates. • !rssreader feeds - Show all feeds that are checked for updates by RSSReader. • !rssreader rm - Remove feed(s) from the update loop. • !rssreader subs - Show channels which will receive new content from specific feeds. • !rssreader subscribe - Make a feed send updates to given channel(s). • !rssreader subscriptions - Show channels which will receive new content from specific feeds. • !rssreader unsubscribe - Unsubscribe channels/rooms from a specific feed.
Ajouter un flux RSS
!rssreader add addresse_du_flux
Cela va associer une ID au flux (feeds).
Pour Pendorid
!rssreader add https://khaganat.net/blog/feed.php !rssreader add https://khaganat.net/taf/feed.php !rssreader add https://khaganat.net/um1/feed.php !rssreader add https://khaganat.net/wikhan/feed.php !rssreader add https://khaganat.net/mediateki/feed.php !rssreader add https://khaganat.net/forum/index.php?action=.xml;type=rss;limit=10 !rssreader add https://git.khaganat.net/khaganat.atom
Puis !rssreader feeds
pour lister les flux et leur id. Ensuite, on souscrit sur les canaux aux flux qui nous intéressent :
!rssreader subscribe f0c0f2 khaganat@chat.khaganat.net
Pour voir les abonnements de chaque canaux aux flux :
!rssreader subscriptions
Logguer les salons (ressource externe)
Linkmauve nous a créé de quoi loguer les canaux. Téléchargez le fichier log.py.
Il faut installer le module slixmpp. On en profite aussi pour faire un dossier où seront les logs et le fichier du bot.
mkdir xmpplog cd xmpplog python -m pipenv install slixmpp
Mettez “log.py” dans ce dossier “xmpplog”. Les dossiers de logs se créeront automatiquement ici par la suite.
Sans pipenv, le script prends les arguments de cette façon :
./log.py -j nom@server.com -p "mot_de_passe" -r salon1@chat.khaganat.net salon2@chat.khaganat.net -n Pseudo
Avec les options suivantes :
-j
: le JID, donc nom d'utilisateur du bot-p
: mot de passe du compte (password), à mettre entre guillemet pour bien intérpréter s'il y a des espaces ou des tirets-r
: les divers salons (room), séparés par un espace-n
: le pseudo du bot (nickname), si c'est le même que celui donné à Errbot, il n'y aura qu'un seul bot visiblement connecté, mais les deux feront le job.
Avec pipenv, la commande est
python -m pipenv run python ./log.py -j nom@server.com -p "mot_de_passe" -r salon1@chat.khaganat.net salon2@chat.khaganat.net -n Pseudo
Oui c'est un peu long…
Si ça marche, on créé un service systemd dans /etc/systemd/system/botlogmauve.service
. Adaptez l'utilisateur, le groupe et les chemins.
[Unit] Description=Chat bot XMPP log After=network.target network-online.target [Service] Type=simple User=khaganat Group=khaganat WorkingDirectory=/home/khaganat/chatbot/xmpplogbot/ ExecStart=python -m pipenv run python ./xmpplogbot.py -j nom@server.com -p "mot_de_passe" -r salon1@chat.khaganat.net salon2@chat.khaganat.net -n Pseudo Restart=always KillSignal=SIGINT [Install] WantedBy=multi-user.target