[PYTHON] Erläuterung und Implementierung des in Slack, HipChat und IRC verwendeten XMPP-Protokolls

Das gemeinsame Merkmal von ICQ, IRC, Yahoo Messenger, HipChat, Slack und Google Talk, die in "Ao" bekannt sind, ist, dass alle das XML-basierte XMPP-Protokoll für die Kommunikation verwenden. Sofortnachrichtendienste ändern sich schnell, daher denke ich, dass es wichtig ist, den Kernteil unverändert zu lassen.

Wenn Sie das XMPP-Protokoll verwenden, können Sie einen Bot erstellen, der die meisten Nachrichtendienste verwenden kann. In diesem Artikel implementieren wir einen Bot, der mehrere Nachrichtendienste mithilfe der Jabber-Bibliothek unterstützt, die XMPP entwickelt und veröffentlicht hat.

Was zu machen

Ein Bot, der beim Start sowohl bei HipChat als auch bei Slack angemeldet ist und Befehle bereitstellt und ausführt, wenn er mit ihm spricht. Ein Sonderfall der Verwendung von Slack in Übersee und HipChat in Japan trat auf und es wurde beschlossen, es zu entwickeln. ~~ Es ist schwer während der Übergangszeit ~~ Ich denke, es ist gut, nacheinander neue Dinge einzuführen.

■ Slack スクリーンショット 2015-11-30 18.02.01.png

スクリーンショット 2015-11-30 16.14.11.png

■ HipChat スクリーンショット 2015-11-30 16.16.15.png

Eine Übersicht über das XMPP-Protokoll in 2 Minuten

■ Die Spezifikationen werden unter rfc3920 veröffentlicht. ■ Von Jabber entwickeltes XML-basiertes Kommunikationsprotokoll ■ Die folgenden 5-teiligen Informationen, die für die Verbindung erforderlich sind スクリーンショット 2015-11-30 17.37.57.png

Das Kommunikationsformat ist XML


Server: <stream>
<message>...</message>
Client: <stream>
<message>...</message>
Server: <message>...</message>
Client: <message>...</message>
Server: <message>...</message>
Client: <message>...</message>
Server: </stream>
Client: </stream>

■ Um Slack zu verwenden, aktivieren Sie XMPP Gate Way in Admin und zahlen Sie mit jedem Konto aus ■ In HipChat kann es mit den Standardeinstellungen verwendet werden.

XMPP wurde von Jabber erstellt

Sie können einen Bot, der XMPP spricht, einfach mithilfe der Jabber-Bibliothek jabberbot implementieren.

install

install


pip install jabberbot
pip install xmpppy
pip install lazy-reload
pip install requests
pip install simplejson

Bot für Slack und HipChat

bot.py


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

import sys
import time
import traceback
import logging
from jabberbot import botcmd, JabberBot, xmpp
import multiprocessing as mp


class ChatBot(JabberBot):
    """
    XMPP/Stellen Sie mit dem Jabber-Bot eine Verbindung zum Nachrichtendienst von HipChat her
    """

    _content_commands = {}
    _global_commands = []
    _command_aliases = {}
    _all_msg_handlers = []
    _last_message = ''
    _last_send_time = time.time()
    _restart = False

    def __init__(self, config):
        self._config = config
        channel = config['connection']['channel']
        username = u"%s@%s" % (config['connection']['username'],
                               config['connection'].get('host',
                                                        config['connection']['host']))
        self._username = username
        super(ChatBot, self).__init__(
            username=username,
            password=config['connection']['password'])

        self.PING_FREQUENCY = 50  # timeout sec
        self.join_room(channel, config['connection']['nickname'])
        self.log.setLevel(logging.INFO)

    def join_room(self, room, username=None, password=None):
        """
Chat Room beitreten
        """
        NS_MUC = 'http://jabber.org/protocol/muc'
        if username is None:
            username = self._username.split('@')[0]
        my_room_JID = u'/'.join((room, username))
        pres = xmpp.Presence(to=my_room_JID)
        if password is not None:
            pres.setTag(
                'x', namespace=NS_MUC).setTagData('password', password)
        else:
            pres.setTag('x', namespace=NS_MUC)

        #Lesen Sie beim Beitritt nicht den Nachrichtenverlauf
        pres.getTag('x').addChild('history', {'maxchars': '0',
                                              'maxstanzas': '0'})
        self.connect().send(pres)


    def callback_message(self, conn, mess):
        """
Wird ausgeführt, wenn eine Nachricht empfangen wird
        """
        _type = mess.getType()
        jid = mess.getFrom()
        props = mess.getProperties()
        text = mess.getBody()
        username = self.get_sender_username(mess)

        print "callback_message:{}".format(text)
        print _type
        # print jid
        print props
        print username
        super(ChatBot, self).callback_message(conn, mess)


        #Antworten Sie, wenn die Anfrage eine bestimmte Zeichenfolge enthält
        import time
        import random
        time.sleep(1)
        if 'Wunsch' in text:
            ret = ["Ryo. Es tut mir Leid",
                   "Bitte warte eine Weile",
                   "http://rr.img.naver.jp/mig?src=http%3A%2F%2Fimgcc.naver.jp%2Fkaze%2Fmission%2FUSER%2F20141001%2F66%2F6169106%2F58%2F186x211xe15ffb8d1f6f246446c89d7e.jpg%2F300%2F600&twidth=300&theight=600&qlt=80&res_format=jpg&op=r",
                   "http://e-village.main.jp/gazou/image_gazou/gazou_0053.jpeg "]
            self.send_simple_reply(mess, random.choice(ret))

        if 'Fehler' in text:
            ret = ["Ich werde es später mit meinem Verständnis beheben",
                   "Anerkannt",
                   "Wir werden nach dem Treffen danach antworten.",
                   "Die neueste Version wurde behoben, daher werde ich darüber nachdenken."]
            self.send_simple_reply(mess, random.choice(ret))

    def send_message(self, mess):
        """Send an XMPP message
        Overridden from jabberbot to update _last_send_time
        """
        self._last_send_time = time.time()
        self.connect().send(mess)

def bot_start(conf):
    print "++++++++"
    print conf
    print "++++++++"
    bot = ChatBot(conf)
    bot.serve_forever()


class ChatDaemon(object):
    config = None

    def run(self):
        try:
            # Start Slack Bot
            process_slack = mp.Process(target=bot_start, args=(self.config_slack,))
            process_slack.start()

            # Start HipChat Bot
            process_hipchat = mp.Process(target=bot_start, args=(self.config_hipchat,))
            process_hipchat.start()
        except Exception, e:
            print >> sys.stderr, "ERROR: %s" % (e,)
            print >> sys.stderr, traceback.format_exc()
            return 1
        else:
            return 0


def main():
    import logging
    logging.basicConfig()
    config_slack = {
        'connection': {
            'username': '{{name}}',
            'password': '{{password}}',
            'nickname': '{{name}}',
            'host': '{{TeamName}}.xmpp.slack.com',
            'channel': '{{RoomName}}@conference.{{TeamName}}.xmpp.slack.com',
        }
    }
    config_hipchat = {
        'connection': {
            'username': '{{name}}',
            'password': '{{password}}',
            'nickname': '{{nickname}}',
            'host': 'chat.hipchat.com',
            'channel': '{{RoomName}}@conf.hipchat.com',
        }
    }

    runner = ChatDaemon()
    runner.config_slack = config_slack
    runner.config_hipchat = config_hipchat
    runner.run()


if __name__ == '__main__':
    sys.exit(main())

Bot meldet sich beim Start an

スクリーンショット 2015-11-30 17.34.18.png

Ich habe mit HipChat und Slack gesprochen

スクリーンショット 2015-11-30 16.38.34.png

Ich habe die Nachricht erhalten

スクリーンショット 2015-11-30 16.38.06.png

Zahlung der Einstellungsinformationen

■ 1.Slack SLACK muss für XMPP Gateway in admin aktiviert sein https://{{TeamName}}.slack.com/account/gateways

■ 2.HipChat https://{{組織名}}.hipchat.com/rooms/show/{{room_id}}

Referenz

rfc3920 Technischer Hinweis zu XMPP (Jabber Protocol) XMPP-Einführungsseite für allgemeine Benutzer (vorläufig)

Zusammenfassung

Wenn Sie die Einführung eines neuen Sofortnachrichtendienstes in Betracht ziehen, kann dies Ingenieure glücklich machen, wenn Sie prüfen, ob er das XMPP-Protokoll unterstützt.

Wenn Sie "os.subprocess (" deploy cmd hogehoge ")" in die "callback_message" -Funktion schreiben, können Sie jeden Befehl implementieren, aber ich denke, Sie werden glücklicher sein, wenn Sie einen handelsüblichen HuBot verwenden.

Lassen Sie Bot den Chat-Dienst übernehmen und schreiben Sie den Code ╭ (・ ㅂ ・) و

Recommended Posts

Erläuterung und Implementierung des in Slack, HipChat und IRC verwendeten XMPP-Protokolls
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Erklärung und Implementierung von SocialFoceModel
Erläuterung der CSV und Implementierungsbeispiel in jeder Programmiersprache
Erläuterung und Implementierung von PRML Kapitel 4
Erklärung und Implementierung des ESIM-Algorithmus
Erklärung und Implementierung von einfachem Perzeptron
Überprüfen Sie die Komprimierungsrate und -zeit von PIXZ, die in der Praxis verwendet werden
Erklärung und Implementierung des Decomposable Attention-Algorithmus
Prognostizieren Sie den Stromverbrauch in 2 Tagen und veröffentlichen Sie ihn in CSV
[Einführung in Python] Eine ausführliche Erklärung der in Python verwendeten Zeichenkettentypen!
Warum die Python-Implementierung von ISUCON 5 Bottle verwendet
Korrigieren Sie die Argumente der in map verwendeten Funktion
[Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch)
Wird ab der Einführung von Node.js in der WSL-Umgebung verwendet
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Befehle, die häufig in der Entwicklungsumgebung während der Python-Implementierung verwendet werden
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Holen Sie sich Informationen von der Meteorological Agency und benachrichtigen Sie Slack über Wetterwarnungen in den 23 Bezirken von Tokio
Implementierung der schnellen Sortierung in Python
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Echtzeitanzeige des serverseitigen Verarbeitungsfortschritts im Browser (Implementierung des Fortschrittsbalkens)
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
Wahrscheinlichkeit der höchsten und niedrigsten Jungtierpreise in Atsumori
Benachrichtigen Sie den Inhalt der Aufgabe vor und nach der Ausführung der Aufgabe mit Fabric
[Python] Ich habe die Theorie und Implementierung der logistischen Regression gründlich erklärt
[Python] Ich habe die Theorie und Implementierung des Entscheidungsbaums gründlich erklärt
Mathematische Erklärung der Dichotomie- und Trisektionssuch- und Implementierungsmethode ohne Fehler
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Holen Sie sich den Titel und das Lieferdatum von Yahoo! News in Python