[PYTHON] Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen

Dieser Artikel stammt aus dem JSL \ (Nippon System Giken ) Adventskalender 2019 \ -Qiita am 6. Dezember. Der Kalender des letzten Jahres ist hier! !!

TL;DR

Vorwort

Obwohl wir eine lange Geschichte haben, sind wir ein Unternehmen, das freie Arbeitsstile verkauft, die "volle Flex- und Remote-Arbeit ohne Kernzeit empfehlen". Die Zeit, um zur Arbeit zu gehen, ist anders, und etwa 30% sind Fernarbeiter. Daher kommt selten jeder, der ein Büro hat, zur Arbeit.

Wenn sich jedoch die Arbeitsweise ändert, gibt es ** gute und schlechte Dinge zu besprechen und Probleme zu lösen **. In diesem Artikel wird versucht, das Problem der Remote-Arbeit zu lösen.

Herausforderungen des Chat-Betriebs während der Fernarbeit

Vor kurzem sehe ich das Thema Slack-Betrieb jedes Unternehmens wie "@ hier", "@ Kanal" -Verbot. Benachrichtigungen sind nützlich, können aber auch den Programmierer ablenken.

In der Zwischenzeit gab es in unserem Slack eine solche "@ here" -Erwähnung (mein Beitrag ...)

スクリーンショット 2019-12-05 18.48.56.png

Wie wär es damit? Was die Situation betrifft, "ein wenig Eile" und "Ich möchte nur aktive Benutzer benachrichtigen", daher denke ich, dass es sich um eine allgemeine Verwendung von "@ hier" handelt.

Aber was ist mit Fernarbeitern? Für Remote-Mitarbeiter sollte es kein Problem sein, wenn der Nutzungsstatus des Besprechungs- und Empfangsraums des Firmengebäudes nicht geteilt wird.

Remote-Mitarbeiter benötigen diese Benachrichtigung also nicht.

Natürlich kann es Ihnen leid tun, dass nicht nur die Benachrichtigungsseite, sondern auch die Benachrichtigungsseite mit "@ hier" die Benachrichtigung an die entfernte Arbeitsperson überspringt.

Wenn es sich um ein Unternehmen handelt, das "Remote-Arbeit empfiehlt ... aber ich werde Ihnen viele unabhängige Benachrichtigungen geben !!", ist es keine komfortable Umgebung für Programmierer ...?

Wie Sie sehen, wird es mit zunehmender Anzahl von Remote-Mitarbeitern wichtig, ** Benachrichtigungsziele für Chats ** zu entwerfen.

Dynamische Erwähnung

Also dachte ich über ** dynamische Erwähnung ** nach. Ich dachte, dass dieses Problem gelöst werden könnte, wenn es Erwähnungen gäbe, die nur Benutzern mitgeteilt wurden, die bestimmte Bedingungen erfüllten.

In diesem Beispiel wären es ** "Erwähnungen, die nur denen mitgeteilt werden, die heute arbeiten" **.

Übrigens ist "@ hier" auch eine dynamische Erwähnung in dem Sinne, dass es nur die aktiven Benutzer im Kanal benachrichtigt.

Berücksichtigung der Umsetzung

Wir haben eine interne Zielplatine und deren REST-API. Wenn Sie dies verwenden, können Sie eine Liste der Personen abrufen, die im Büro sind. Es wäre also schön, wenn ich Slack irgendwie in Bezug auf die Liste der Leute erwähnen könnte, die im Büro sind.

Als ich nach einer netten API auf der Slack-Seite suchte, fand ich eine API namens "usergroups.users.update".

usergroups.users.update method | Slack

Sie können Benutzer in einer Benutzergruppe aktualisieren, indem Sie die Gruppen-ID an die Benutzergruppe und ein Array von Benutzer-IDs an Benutzer übergeben.

Damit

  1. Rufen Sie über die Zielkarten-API eine Liste der Personen ab, die sich im Büro befinden
  2. Konvertieren Sie die Liste in eine Slack-Benutzer-ID
  3. Führen Sie "usergroups.users.update" für die zuvor erstellte Benutzergruppe aus, um den Benutzer zu aktualisieren.
  4. Tun Sie dies regelmäßig

Es scheint, dass wir in der Lage sein sollten zu realisieren!

Technologie verwendet

Also habe ich mich für AWS Lambda entschieden.

Mit Lambda, auch wenn es an Wochentagen (20 Tage) + 1 Stunde vorher und nachher (10 Stunden) wie eine Minute funktioniert 20 * 10 * 60 = 12,000 Ich kann es mir also leisten, das kostenlose Kontingent von 1.000.000 Anfragen pro Monat zu erfüllen.

Ich habe auch "Kelch" verwendet, um Lambda einzusetzen

aws/chalice: Python Serverless Microframework for AWS

chalice ist ein Framework, mit dem Sie Lambda basierend auf einem Flask-ähnlichen Dekorateur schreiben und sogar periphere Dienste erstellen (löschen) können. Wenn Sie HTTP (s) empfangen möchten, ist Lambda problematisch, da es mit "APIGateway" zusammenarbeiten muss, sich aber um diesen Bereich kümmert.

Zum Beispiel ist es möglich, die periodische Ausführung, die diesmal erforderlich ist, mit der Syntax von "Kelch" zu schreiben.

Beispiel für eine regelmäßige Ausführung alle 5 Minuten


from chalice import Chalice, Rate

app = Chalice(app_name="helloworld")

# Automatically runs every 5 minutes
@app.schedule(Rate(5, unit=Rate.MINUTES))
def periodic_task(event):
    return {"hello": "world"}

Der endgültige Code lautet wie folgt (der Teil, der die API des Unternehmens verwendet, wird weggelassen).

src/update_usergroup.py


@app.schedule(Cron('0', '23-9', '?', '*', 'SUN-THU', '*'))
def update_in_office_usergroup(event):
    OAUTH_TOKEN = 'token_xxxx_xxxx'
    #Vorab erstellte Benutzergruppen-UID
    in_office_usergroup_uid = 'some_usergorup_uid'

    #~ Abkürzung ~

    #Liste der Slack-IDs von Benutzern im Büro, die über die API abgerufen wurden
    office_user_slack_ids = ['some', 'user', 'uids']

    try:
        data = urllib.parse.urlencode(
            (
                ("token", OAUTH_TOKEN),
                ("usergroup", in_office_usergroup_uid),
                ("users", ','.join(office_user_slack_ids)),

            )
        )
        data = data.encode("ascii")
        request = urllib.request.Request(
            "https://slack.com/api/usergroups.users.update",
            data=data,
            method="POST"
        )
        request.add_header(
            "Content-Type",
            "application/x-www-form-urlencoded"
        )

        with urllib.request.urlopen(request) as r:
            resp = json.loads(r.read())
        logger.info(resp)
        return {'ok': True}
    except Exception as e:
        logger.error(e)
        return {'ok': False}

Da ich Lambda verwende, verwende ich "urllib" ohne externe Pakete.

Zusätzlich wird die Cron-Formel um 9 Stunden verschoben, indem die UTC auf Sonntag-Donnerstag 23-9 Uhr (Montag-Freitag 9-18 Uhr in japanischer Zeit) eingestellt wird. (Ist das nicht ein guter Weg?)

Es wurde abgeschlossen, aber ...

Ich nannte es "@ in_office" und veröffentlichte es mit einem doy Gesicht.

スクリーンショット 2019-12-06 10.18.37.png

Es gibt jedoch Berichte, dass solche Benachrichtigungen häufig auftreten. ..

スクリーンショット 2019-12-06 10.20.00.png

Anscheinend werden beim Hinzufügen / Entfernen von Benutzergruppen Benachrichtigungen von Slackbot gesendet. Ich habe es gemacht, um unnötige Benachrichtigungen zu reduzieren, aber im Gegenteil, die Anzahl der Benachrichtigungen hat zugenommen. Das ist nutzlos ...

Ich dachte: "Gibt es eine Option zum Deaktivieren von Benachrichtigungen über die API?" Und ich habe nachgeschlagen, aber es schien nicht da zu sein.

Ich blieb hier stecken und obwohl es eine Funktion war, die ich gemacht habe, hörte ich auf, sie zu benutzen. Dies ist der ursprüngliche Baum Ami.

Zurückblicken

Der Hauptgrund ist das Fehlen einer technischen Überprüfung.

Ich fing an zu laufen, als ich bekam "Ich habe eine API! Ich habe eine Idee! Ich denke, ich kann es schaffen!" Und versuchte es nicht einmal mit einem kleinen Code. Kann die ausgewählte Technologie das Problem lösen? Ist es ein geeignetes Mittel zur Lösung des Problems? Es ist wichtig zu berücksichtigen.

Andererseits finde ich die Idee, Chat-Benachrichtigungen zu entwerfen, gut.

Nun, es ist eine persönliche Entwicklung, also ist es ein Haken, den ich nicht bestanden habe, und dies ist auch Teil der technischen Überprüfung!

Dynamische Erwähnung Ich denke, das ist eine ziemlich gute Idee. .. Wenn jemand, der diesen Artikel gelesen hat, es merkt, lassen Sie es mich bitte wissen.

Bonus

Als ich eine offizielle Anfrage in schlechtem Englisch stellte, erhielt ich eine höfliche Antwort. Die aktuelle Benutzergruppen-API (Oktober 2019 zum Zeitpunkt der Anfrage) kann Benachrichtigungen nicht deaktivieren, er möchte jedoch das Feedback-Team informieren, damit er dies in Zukunft tun kann.

Ich möchte noch einmal herausfordern, sobald es implementiert ist!

Recommended Posts

Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Eine Geschichte über das Ausprobieren von pyenv, virtualenv und virtualenvwrapper
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Ich bin gerade in Singapur. Eine Geschichte über das Erstellen eines LineBot und den Wunsch, einen unvergesslichen Job zu machen
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
[Google Photo & Slack Photo Bot] Eine Geschichte über das Erstellen eines Bots, der ein Foto in Google Photo erfasst und an Slack sendet.
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Eine Geschichte, die es aufgegeben hat, JavaScripthon unter Windows auszuführen.
Eine Geschichte über einen Anfänger im Deep Learning, der versucht, Gitarren mit CNN zu klassifizieren
Die Geschichte, den Versuch aufzugeben, mit Heroku eine Verbindung zu MySQL herzustellen
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Die Geschichte des Versuchs, den Client wieder zu verbinden
Die Geschichte eines Fehlers in PyOCR
Eine Geschichte, die Slack und Google Spreadsheet verbindet
pix2pix tensorflow2 Aufzeichnung von Versuch und Irrtum
Die Geschichte, deep3d auszuprobieren und zu verlieren
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
Ich habe ein Tool erstellt, um Slack über Connpass-Ereignisse zu informieren, und es zu Terraform gemacht
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
[Azure] Ich habe versucht, eine virtuelle Linux-Maschine mit Azure von Microsoft Learn zu erstellen
Der Fehler der mit tf.function dekorierten Funktion hat versucht, Variablen beim nicht ersten Aufruf zu erstellen. In tensorflow.keras
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden
Die Geschichte eines hochrangigen Technikers, der versucht, das Überleben der Titanic vorherzusagen
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
Die Geschichte des Versuchs, Tensorboard mit Pytorch zu verwenden
So erstellen Sie eine Rest-API in Django
Fehler beim Versuch, psycopg2 in Python zu installieren
[GCF + Python] So laden Sie Excel in GCS hoch und erstellen eine neue Tabelle in BigQuery
Verwenden Sie Slackbot als Relais und kehren Sie im JSON-Format von Flasche zu Slack zurück.
Eine Geschichte über den Versuch, mit der kostenlosen Stufe von AWS zur COVID-19-Analyse beizutragen, und das Scheitern
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Versuch und Irrtum, um die Erzeugung von Wärmekarten zu beschleunigen
Versuch und Irrtum, um Android-Screenshots zu beschleunigen
Über Importfehler von numpy und scipy in anaconda
Schwerwiegender Fehler im Launcher: Prozess kann nicht mit '"' erstellt werden
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
Erstellen Sie ein Plug-In, um Python Doctest mit Vim (1) auszuführen.
Hinweis: CGI (während des Versuchs und Irrtums) in der Vagrant-Umgebung
Schwerwiegender Fehler im Launcher: Prozess kann nicht mit '"' erstellt werden
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Eine Geschichte, die die Discord-Aktivität im Slack-Status widerspiegelt
Gruppieren Sie nach aufeinanderfolgenden Elementen einer Liste in Python
Geben Sie einen Binärspeicherauszug in Binärdatei und zurück in eine Binärdatei aus
Rufen Sie die Benutzer-ID und den Bildschirmnamen des Teilnehmers in Slack ab
Fehler und Lösung beim Versuch, einen mit Labellio erstellten Klassifikator mit meinem eigenen Ubuntu auszuführen
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
[Python] So löschen Sie eine Zeile / Spalte in einer Tabelle (Liste der Optionen für die Drop-Methode)
[Hinweis] Eine Geschichte über den Versuch, eine Klassenmethode mit zwei Unterbalken in der Python 3-Serie zu überschreiben.
Eine Geschichte, die mithilfe einer kostenlosen Testversion der Google Cloud Platform zu einer neuen Koronaanalyse beiträgt