[PYTHON] Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack

Cet article est tiré du JSL \ (Nippon System Giken ) Advent Calendar 2019 \ -Qiita le 6 décembre. Le calendrier de l'année dernière est ici! !!

TL;DR

Préface

Bien que nous ayons une longue histoire, nous sommes une entreprise qui vend des styles de travail gratuits qui "recommandent un travail flexible et à distance sans temps de base". Tout le temps pour aller travailler est différent et environ 30% sont des travailleurs à distance. Par conséquent, il est rare que tous ceux qui ont un bureau viennent travailler.

Cependant, lorsque la façon de travailler change, il y a ** de bonnes et de mauvaises choses à discuter et des problèmes à résoudre **. Cet article tente de résoudre le problème du travail à distance.

Défis du fonctionnement du chat pendant le travail à distance

Récemment, je vois le sujet du fonctionnement Slack de chaque entreprise tel que l'interdiction «@ here», «@ channel». Les notifications sont utiles, mais elles peuvent aussi distraire le programmeur.

Pendant ce temps, il y avait une telle mention @ here dans notre Slack (mon post ...)

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

Et ça? Pour ce qui est de la situation, "un peu pressé" et "je veux avertir uniquement les utilisateurs actifs", donc je pense que c'est un usage général de «@ here».

Mais qu'en est-il des travailleurs à distance? Pour les travailleurs à distance, cela ne devrait pas poser de problème si l'état d'utilisation de la salle de réunion et de la salle de réception du bâtiment de l'entreprise n'est pas partagé.

Les télétravailleurs n'ont donc pas besoin de cette notification.

Bien sûr, vous pouvez vous sentir désolé non seulement pour le côté notification, mais aussi pour le côté notification avec @ here pour ignorer la notification à la personne travaillant à distance.

Si c'est une entreprise qui "recommande le travail à distance ... mais je vous donnerai beaucoup de notifications non pertinentes !!"

Comme vous pouvez le constater, à mesure que le nombre de travailleurs distants augmente, il devient important de concevoir des ** destinations de notification pour les chats **.

Mention dynamique

J'ai donc pensé à la ** mention dynamique **. Je pensais que ce problème pouvait être résolu s'il y avait des mentions qui n'étaient notifiées qu'aux utilisateurs qui remplissaient certaines conditions.

Dans cet exemple, il s'agirait de ** "mentions notifiées uniquement à ceux qui sont au travail aujourd'hui" **.

À propos, «@ here» est également une mention dynamique dans le sens où il ne notifie que les utilisateurs actifs du canal.

Examen de la mise en œuvre

Nous avons un tableau de destination en interne et son API REST. Si vous l'utilisez, vous pouvez obtenir une liste des personnes qui sont au bureau. Ce serait donc bien si je pouvais en quelque sorte mentionner Slack dans la liste des personnes qui sont au bureau.

Quand je cherchais une belle API côté Slack, j'ai trouvé une API appelée ʻusergroups.users.update`.

usergroups.users.update method | Slack

Vous pouvez mettre à jour les utilisateurs d'un groupe d'utilisateurs en transmettant l'ID de groupe au groupe d'utilisateurs et un tableau d'ID utilisateur aux utilisateurs.

Alors

  1. Obtenez une liste des personnes qui sont au bureau à partir de l'API du tableau de destination
  2. Convertissez la liste en un ID utilisateur Slack
  3. Exécutez ʻusergroups.users.update` pour les groupes d'utilisateurs créés à l'avance pour mettre à jour les utilisateurs.
  4. Faites-le régulièrement

Il semble que nous devrions pouvoir le réaliser!

Technologie utilisée

J'ai donc décidé d'utiliser ʻAWS Lambda`.

Avec Lambda, même si cela fonctionne comme une minute en semaine (20 jours) + 1 heure avant et après (10 heures) 20 * 10 * 60 = 12,000 Je peux donc me permettre d’intégrer le quota gratuit de 1 000 000 demandes par mois,

J'ai également utilisé calice pour déployer Lambda

aws/chalice: Python Serverless Microframework for AWS

calice est un framework qui vous permet d'écrire Lambda basé sur un décorateur de type Flask et même de créer (supprimer) des services périphériques. Si vous voulez recevoir des Http (s), Lambda est gênant car il doit coopérer avec ʻAPIGateway`, mais il s'occupe de ce domaine.

Par exemple, il est possible d'écrire l'exécution périodique, qui est l'exigence cette fois, avec la syntaxe de «calice».

Exemple d'exécution périodique toutes les 5 minutes


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"}

Le code final est le suivant (la partie qui utilise l'API de l'entreprise est omise)

src/update_usergroup.py


@app.schedule(Cron('0', '23-9', '?', '*', 'SUN-THU', '*'))
def update_in_office_usergroup(event):
    OAUTH_TOKEN = 'token_xxxx_xxxx'
    #UID de groupe d'utilisateurs pré-créé
    in_office_usergroup_uid = 'some_usergorup_uid'

    #~ abrégé ~

    #Liste des identifiants Slack des utilisateurs qui sont dans le bureau obtenue à partir de l'API
    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}

Depuis que j'utilise Lambda, j'utilise ʻurllib` sans aucun paquet externe.

De plus, la formule cron est décalée de 9 heures en ajustant l'UTC pour qu'elle soit du dimanche au jeudi de 23 à 9 heures (du lundi au vendredi de 9 à 18 heures en heure japonaise). (N'est-ce pas un bon moyen?)

C'était terminé, mais ...

Je l'ai nommé @ in_office et l'ai sorti avec un visage de doy.

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

Cependant, certains rapports indiquent que de telles notifications sont fréquentes. ..

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

Apparemment, lorsque j'ajoute / supprime des groupes d'utilisateurs, les notifications volent de Slackbot. Je l'ai fait dans le but de réduire les notifications inutiles, mais au contraire, le nombre de notifications a augmenté. Cela ne sert à rien ...

J'ai pensé: "Y a-t-il une option pour désactiver les notifications via l'API?", Et je l'ai recherchée, mais elle ne semblait pas être là.

Je suis resté coincé ici, et bien que ce soit une fonction que j'ai créée, j'ai arrêté de l'utiliser. C'est l'arbre original Ami.

Regarder en arrière

La raison principale est le manque de vérification technique.

J'ai commencé à courir quand j'ai eu "J'ai une API! J'ai une idée! Je pense que je peux le faire!" Et je ne l'ai même pas essayée avec un petit code. La technologie choisie peut-elle résoudre le problème? Est-ce un moyen approprié pour résoudre le problème? Il est important d'en tenir compte.

D'un autre côté, je pense que l'idée de concevoir des notifications de chat était bonne.

Eh bien, c'est un développement personnel, donc c'est un hic que j'ai échoué, et cela fait aussi partie de la vérification technique!

Mention dynamique Je pense que c'est une très bonne idée. .. Si quelqu'un qui a lu cet article s'en rend compte, faites-le moi savoir.

prime

Lorsque j'ai fait une enquête officielle dans un anglais médiocre, j'ai reçu une réponse polie. L'API actuelle du groupe d'utilisateurs (octobre 2019 au moment de l'enquête) ne peut pas désactiver les notifications, mais il souhaite informer l'équipe de rétroaction afin qu'elle puisse le faire à l'avenir.

Je voudrais contester à nouveau une fois qu'il sera mis en œuvre!

Recommended Posts

Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
Une histoire d'essayer pyenv, virtualenv et virtualenvwrapper
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Une histoire sur la tentative d'implémentation de variables privées en Python.
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
Présentation de la création d'un socket serveur et de la création d'un socket client
Comment créer une grande quantité de données de test dans MySQL? ??
Je veux créer un fichier pip et le refléter dans le menu fixe
Créez une fonction pour obtenir le contenu de la base de données dans Go
[Google Photo & Slack Photo Bot] Une histoire sur la création d'un bot qui acquiert une photo dans Google Photo et l'envoie à Slack.
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
Une histoire d'essayer d'exécuter JavaScripthon sur Windows et d'abandonner.
L'histoire d'un débutant en apprentissage profond essayant de classer les guitares avec CNN
L'histoire de l'abandon d'essayer de se connecter à MySQL en utilisant Heroku
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
L'histoire d'essayer de reconnecter le client
L'histoire d'une erreur dans PyOCR
Une histoire reliant Slack et la feuille de calcul Google
pix2pix tensorflow2 Enregistrement d'essais et d'erreurs
L'histoire d'essayer deep3d et de perdre
L'histoire de la création de Botonyan qui renvoie le contenu de Google Docs en réponse à un mot-clé spécifique sur Slack
J'ai créé un outil pour informer Slack des événements Connpass et en ai fait Terraform
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
[Azure] J'ai essayé de créer une machine virtuelle Linux avec Azure de Microsoft Learn
Erreur de la fonction décorée par tf.function lors de la tentative de création de variables lors d'un autre appel. Dans tensorflow.keras
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
L'histoire d'un technicien de haut niveau essayant de prédire la survie du Titanic
Je veux créer une fenêtre avec Python
Comment créer un fichier JSON en Python
Histoire d'essayer d'utiliser Tensorboard avec Pytorch
Comment créer une API Rest dans Django
Erreur lors de la tentative d'installation de psycopg2 en Python
[GCF + Python] Comment importer Excel vers GCS et créer une nouvelle table dans BigQuery
Utilisez slackbot comme relais et retournez de bouteille à slack au format json.
Une histoire sur la tentative de contribuer à l'analyse COVID-19 avec l'offre gratuite d'AWS et l'échec
Créer un ensemble de données d'images à utiliser pour la formation
Essais et erreurs pour accélérer la génération de cartes thermiques
Essai et erreur pour accélérer les captures d'écran Android
À propos de l'erreur d'importation de numpy et scipy dans anaconda
Erreur fatale dans le lanceur: impossible de créer le processus avec '"'
Créer un plugin pour exécuter Python Doctest sur Vim (2)
[Go] Comment créer une erreur personnalisée pour Sentry
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Remarque: CGI (pendant les essais et erreurs) dans l'environnement Vagrant
Erreur fatale dans le lanceur: impossible de créer le processus avec '"'
Créez un lot d'images et gonflez avec ImageDataGenerator
Une histoire qui reflète l'activité Discord dans Slack Status
Regrouper par éléments consécutifs d'une liste en Python
Sortie d'un vidage binaire en binaire et retour dans un fichier binaire
Obtenez l'ID utilisateur et le nom d'écran du participant dans Slack
Erreur et solution en essayant d'exécuter un classificateur réalisé avec Labellio avec mon propre ubuntu
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Une histoire qui contribue à une nouvelle analyse corona à l'aide d'un essai gratuit de Google Cloud Platform