Mattermost Bot mit Python gemacht (+ Flask)

Hinweis

Der Artikel war ungefähr 9 Monate lang eingeschlafen und wurde im Entwurf aufbewahrt, sodass die Informationen möglicherweise nicht mehr aktuell sind. .. .. Ich habe es so oft geschrieben, dass ich es als Gedenkgottesdienst veröffentlichen werde. ..

Hintergrund

Es wurde beschlossen, das interne Kommunikationstool auf Mattermost zu verschieben. Ich wünschte, ich könnte meinen vorhandenen Bot nach Mattermost migrieren Ich habe auch Bot for Mattermost in Python [^ 1] für meine eigene Studie neu implementiert. Ich habe bei der Implementierung von Bot viel recherchiert, daher werde ich die Informationen für mich selbst zusammenfassen.

Umgebung

--CentOS 7.7 (wichtigster Server) --Ubunta 18.04 LTS (Bot-Server)

Irgendwie hatte ich das Gefühl, ich wollte sowohl CentOS als auch Ubuntu berühren. Ubuntu 18.04 wird standardmäßig mit Python 3 geliefert, daher habe ich versucht, es zu verwenden. Kurz gesagt, es hat nichts zu bedeuten.

Umgebung

Einführung von Mattermost

Mattermost kann problemlos mit Docker installiert werden. Installieren Sie daher zuerst Docker.

CentOS


#Installieren Sie Docker
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce docker-ce-cli containerd.io

#Installationsbestätigung
$ docker --version
Docker version 19.03.5, build 633a0ea
$

#Starten Sie Docker
$ systemctl status docker
$ systemctl enable docker
$ systemctl start docker
$ systemctl status docker

#Funktionsprüfung
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

$

Sobald Docker installiert ist, können Sie Mattermost unten installieren und starten.

$ docker run --name mattermost-preview -d --publish 8065:8065 --add-host dockerhost:127.0.0.1 mattermost/mattermost-preview

Nach der Installation kann es wie folgt gestartet / gestoppt werden.

#Anlaufen
$ docker start mattermost-preview

#Halt
$ docker stop mattermost-preview

#Prozessbestätigung
$ docker ps

■ Referenz ・ Qiita: Installieren Sie Docker unter CentOS7

Wichtigste Einstellungen

Sobald Mattermost gestartet werden kann, kann über den Browser darauf zugegriffen werden.

http://xxx.xxx.xxx.xxx:8065

Wenn Sie darauf zugreifen können, erstellen Sie ein Administratorkonto. Jede E-Mail-Adresse ist in Ordnung. 192.168.56.101_8065_signup_email_02.png

Bilden Sie ein geeignetes Team. 192.168.56.101_8065_create_team_display_name.png 192.168.56.101_8065_create_team_team_url_MASK.png

Ins Japanische übersetzen.

Main Menu -> Account Settings -> Display -> Language 192.168.56.101_8065_bot-test_channels_town-square.png

Standardmäßig werden Verbindungsbeschränkungen auf private Netzwerke angewendet. Befindet sich der Kommunikationszielserver des Webhooks im selben Segment, muss die Kommunikationsberechtigung festgelegt werden. (Ich war hier ziemlich süchtig.)

Hauptmenü-> Systemkonsole-> Entwickler-> Nicht vertrauenswürdige interne Verbindungen zulassen 192.168.56.101_8065_admin_console_environment_developer.png

Standardmäßig können Sie kein Bot-Konto erstellen. Aktivieren Sie es daher.

Hauptmenü-> Systemkonsole-> Bot-Konto-> Bot-Konto-Erstellung aktivieren 192.168.56.101_8065_admin_console_integrations_bot_accounts.png

Erstellen Sie einen ausgehenden Webhook.

Hauptmenü-> Integration-> Outward Webhooks

Inhaltstyp: application / json (diesmal habe ich JSON gewählt) Kanal: Kanal zur Überwachung des Triggers Auslösewort: Ein Wort, das die Aktivierung des Webhooks auslöst Rückruf-URL: URL des Nachrichtenziels (Bot-Server) (Da diesmal Flask verwendet wird, wird der Standardport 5000 angegeben.) 192.168.56.201_8065_bot-test_integrations_outgoing_webhooks_add_01.png 192.168.56.201_8065_bot-test_integrations_outgoing_webhooks_add_02.png 192.168.56.201_8065_bot-test_integrations_outgoing_webhooks.png

Erstellen Sie ein Bot-Konto.

Hauptmenü-> Integration-> Bot-Konto 192.168.56.101_8065_bot-test_integrations_bots_add.png Hier werden Bot-Posting-Berechtigungen festgelegt.

192.168.56.101_8065_bot-test_integrations_confirm_type=bots&id=5o4eejp977fqzqdprd7ji13gac&token=3tpdq6cc1tfi3cshkrazr7a6be_MASK.png Notieren Sie sich unbedingt das Bot-Konto-Token, da es später auf dem Menübildschirm nicht mehr überprüft werden kann. Selbst wenn Sie es vergessen, können Sie es mit dem folgenden Befehl überprüfen.

$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from UserAccessTokens;"
+----------------------------+----------------------------+----------------------------+-------------+----------+
| Id                         | Token                      | UserId                     | Description | IsActive |
+----------------------------+----------------------------+----------------------------+-------------+----------+
| xxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxx | ?????????   |        1 |
+----------------------------+----------------------------+----------------------------+-------------+----------+
$

Überprüfen Sie, ob Sie mit dem Befehl curl von Ihrem Bot-Konto aus posten können. Überprüfen Sie zunächst die Kanal-ID des Buchungsziels.

Kanal-> Informationen anzeigen 192.168.56.101_8065_bot-test_channels_town-square_03.png 192.168.56.101_8065_bot-test_channels_town-square_02_MASK.png

Sie können dies auch mit dem folgenden Befehl überprüfen.

$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from Channels;"
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| Id                         | CreateAt      | UpdateAt      | DeleteAt | TeamId                     | Type | DisplayName | Name                                                   | Header | Purpose | LastPostAt    | TotalMsgCount | ExtraUpdateAt | CreatorId | SchemeId | GroupConstrained |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574487544576 | 1574487544576 |        0 | xxxxxxxxxxxxxxxxxxxxxxxxxx | O    | Off-Topic   | off-topic                                              |        |         | 1574487544652 |             0 |             0 |           | NULL     |             NULL |
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574489265292 | 1574489265292 |        0 |                            | D    |             | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |        |         | 1574489265315 |             1 |             0 |           | NULL     |             NULL |
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574487544570 | 1574487544570 |        0 | xxxxxxxxxxxxxxxxxxxxxxxxxx | O    | Town Square | town-square                                            |        |         | 1574487544611 |             0 |             0 |           | NULL     |             NULL |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
$

Geben Sie die Kanal-ID und das Bot-Token an und senden Sie mit dem Befehl curl eine POST-Anforderung an die API.

$ curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"[Channel ID]", "message":"This is a message from a bot"}' -H 'Authorization: Bearer [Bot Token]' http://xxx.xxx.xxx.xxx:8065/api/v4/posts

192.168.56.101_8065_bot-test_channels_town-square_04.png Ich konnte bestätigen, dass ich mit meinem Bot-Konto posten konnte.

■ Referenz ・ Üblicher Software-Ingenieur: So erstellen Sie ein Bot-Konto mit Mattermost

Antwort auf Webhook

Es schien einfach zu sein, es mit Flask zu machen, um es mit Python zu machen, also habe ich es mit Flask implementiert. POSTEN Sie JSON einfach an die API, wie Sie es mit Curl tun.

Ubuntu


$ sudo apt install python3-pip
$ pip3 -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
$
$ pip3 install flask
$ pip3 install requests

bottest.py


import json

import requests
from flask import Flask, request

BOT_TOKEN = '[Bot Token]'
CHANNEL_ID = '[Channel ID]'
MM_API_ADDRESS = 'http://xxx.xxx.xxx.xxx:8065/api/v4/posts'

app = Flask(__name__)

@app.route('/bot-test', methods=['POST'])  #Ausgehende Webhook-Rückruf-URL
def bot_reply():
    posted_user = request.json['user_name']
    posted_msg  = request.json['text']

    reply_headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + BOT_TOKEN,
    }

    reply_data = {
        "channel_id": CHANNEL_ID,
        "message": f"@{posted_user} Bot reply message.",
        "props": {
            "attachments": [
                    {
                "author_name": posted_user,
                "text": posted_msg,
                }
            ]
        },
    }

    reply_request = requests.post(
        MM_API_ADDRESS,
        headers = reply_headers,
        data = json.dumps(reply_data)
    )

    return reply_request

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')

Testen Sie, ob Sie eine Antwort erhalten können. Starten Sie den Testserver von Flask.

Ubuntu


$ python3 bottest.py

Veröffentlichen Sie eine Nachricht mit einem Auslösewort in Mattermost. 192.168.56.201_8065_bot-test_channels_town-square.png

Ich konnte bestätigen, dass ich mit dem Webhook als Auslöser vom Bot-Konto aus posten konnte. Sie müssen lediglich die Bot-Logik implementieren.

Übrigens sieht der JSON, der von Mattermosts Webhook stammt, so aus.

{
    'token': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'team_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'team_domain': 'bot-test', 
    'channel_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'channel_name': 'town-square', 
    'timestamp': 1234567890123, 
    'user_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'user_name': 'mmadmin', 
    'post_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'text': '#bot test', 
    'trigger_word': '#bot', 
    'file_ids': ''
}

■ Referenz ・ [NOBWAK'S LAIR: Machen wir SLACK / MATTERMOST BOT mit FLASK of PYTHON](http://april.fool.jp/blogs/2016/06/02/slackmattermost%E3%81%AEbot%E3%82%92python % E3% 81% AEflask% E3% 81% A7% E4% BD% 9C% E3% 82% 8D% E3% 81% 86 /) ・ Qiita: Erstellen Sie einen einfachen Bot mit Mattermost und Python + Flask

Bonus

Sobald der Bot fertig ist, benötigen Sie einen Webserver und einen WSGI-Server, um ihn als Webanwendung auszuführen. Nach vielen Recherchen habe ich mich für Nginx + Gunicorn entschieden. (Weil ich dachte, es sei das einfachste und einfachste) Dieser Bereich ist noch unklar, daher werde ich ihn schnell als Memo aufschreiben. ..

Gunicorn wird mit Pip installiert.

Ubuntu


$ sudo pip3 install gunicorn

gunicorn [Python-Skriptname]: Wird mit [Name der Flask-Instanz] gestartet. (Standardport ist 8000) (Im Folgenden wird eine App-Instanz in bottomest.py gestartet.)

#Führen Sie das Verzeichnis aus, in dem sich das Python-Skript befindet
$ cd /path/bot
$ sudo gunicorn bottest:app
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Starting gunicorn 20.0.2
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Listening at: http://127.0.0.1:8000 (1699)
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Using worker: sync
[YYYY-MM-DD hh:mm:ss +0900] [1703] [INFO] Booting worker with pid: 1703

Wenn Sie denselben Port wie der Testserver von Flask verwenden möchten, gehen Sie wie folgt vor (Wenn es schwierig ist, die Webhook-Einstellungen auf der Mattermost-Seite zu ändern)

$ sudo gunicorn bottest:app -b 0.0.0.0:5000

Sie können die Option chdir verwenden, ohne zum Speicherort des Python-Skripts wechseln zu müssen.

$ sudo gunicorn --chdir /path/bot bottest:app -b 0.0.0.0:5000

Wenn Sie gestoppt sind, drücken Sie Strg + C, um den Vorgang abzubrechen.

Wenn Sie Gunicorn alleine ausführen möchten, ist dies in Ordnung, aber Sie können nicht mit Nginx arbeiten, wie es ist. Installieren Sie zuerst Nginx.

Ubuntu


$ sudo apt install nginx
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
$

Stellen Sie Nginx ein. Für die Kommunikation mit Gunicorn ist eine Steckdose erforderlich. (Erstellt in / tmp unten)

/etc/nginx/sites-available/default


upstream bot-test {
    server unix:/tmp/bot-test.sock;
}

server {
    listen 5000;

    root path/bot;
    server_name localhost;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /bot-test {
        try_files $uri @flask;
    }

    location @flask {
        proxy_pass http://bot-test;
    }
}

Bestätigung des Nginx-Betriebs.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$
$ sudo systemctl status nginx
$ sudo systemctl restart nginx
$ sudo systemctl status nginx

Wenn die Nginx-Einstellungen korrekt sind, erstellen Sie eine Gunicorn-Konfigurationsdatei. Der Speicherort und der Name der Einstellungsdatei können beliebig sein Beschreiben Sie den zuvor in der Nginx-Konfigurationsdatei beschriebenen Socket.

$ vim gunicorn_conf.py

gunicorn_conf.py


bind = 'unix:/tmp/bot-test.sock'
daemon = True
reload = True

Geben Sie die Einstellungsdatei mit der Option -c an und klicken Sie auf OK, wenn sie gestartet werden kann

$ sudo gunicorn bottest:app -c gunicorn_conf.py

Beenden Sie den Vorgang, wenn Sie gestoppt sind.

$ sudo pkill gunicorn

Um ehrlich zu sein, mache ich den zusätzlichen Teil mit dem Geist, den ich vorerst bewegen sollte Es muss einen besseren Weg geben. ..

■ Referenz ・ Qiita: Gunicorn + Flask + Nginx + Systemd ・ [Tagebuch von "Student mit der falschen Abteilung zur Eingabe": Verfahren zum manuellen Bereitstellen von Ubuntu + Nginx + Gunicorn](https: //nnsnodnb.hatenablog) .jp / entry / ubuntu-nginx-gunicorn-deploy) ・ Qiita: Memo, um Python zu einem Daemon zu machen

[^ 1]: Räder wieder montieren https://www.slideshare.net/RansuiIso/python-115121978 https://www.youtube.com/watch?v=kO4FNg648qE

Recommended Posts

Mattermost Bot mit Python gemacht (+ Flask)
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe einen Blackjack mit Python gemacht!
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe Wordcloud mit Python gemacht.
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Mit Flask erstellte SNS Python-Grundlagen
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Ich habe eine funktionale Sprache mit Python ausprobiert
Was ich mit Python-Arrays gemacht habe
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe eine WEB-Bewerbung bei Django gemacht
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
〇✕ Ich habe ein Spiel gemacht
Machen Sie Twitter Trend Bot mit Heroku + Python
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe meinen Hund "Monaka Bot" mit Line Bot gemacht
Erstellen Sie mit Minette für Python einen LINE BOT
Ich möchte ein Spiel mit Python machen
Vorgehensweise zum Erstellen eines mit Python erstellten LineBot