[GO] Développer une application Slack pour survivre au désastre corona et améliorer la communication

Ce que j'ai fait

[Le niveau gratuit d'Azure a soudainement pris fin, nous procédons donc à la migration. ]

Il s'agit d'une application Slack appelée "comawari" qui communique avec des dessins animés au lieu de messages texte Slack. image.png

Vous pouvez ouvrir le modal sur Slack et sélectionner l'image sur laquelle mettre le dialogue et le publier. image.png

Depuis novembre 2020, nous utilisons les données d'image des sites suivants. Donnez-moi un blackjack Gibli

Comment ça fonctionne

Après l'authentification OAuth de Slack, nous publierons des bandes dessinées en utilisant le mécanisme appelé Commandes Slash et Interactivité.

OAuth Si vous demandez à API Slack le code transmis dans l'URL de redirection, vous pouvez obtenir le jeton d'accès, alors enregistrez-le dans un stockage sécurisé. image.png L'URL de redirection peut être spécifiée sur l'écran de gestion de l'application Slack.

Slash Commands L'API de Comawari, qui est activée lorsque la commande Slash est exécutée, atteint l'API de Slack pour ouvrir le mode modal. image.png

Publier

Lorsque l'utilisateur clique sur le bouton d'envoi de manière modale, l'API spécifiée dans Interactivité sur l'écran de gestion Slack est activée. Utilisez le jeton d'accès de l'utilisateur que vous avez envoyé et publiez pour afficher le dessin animé au nom de l'utilisateur. image.png

programme

Le serveur comawari est écrit en langage Go.

API Nous construisons une API en utilisant un framework appelé Gin. https://github.com/gin-gonic/gin Il est léger et facile à utiliser.

Intégration Slack

À partir des données de requête reçues par Gin, une requête est envoyée à l'API Slack via http dans la bibliothèque standard de golang. Par exemple, l'endroit pour obtenir le jeton d'accès est comme ceci.

//Convertissez le code envoyé en jeton d'accès
values := url.Values{}
values.Set("code", code)
values.Add("client_id", SlackClientID)
values.Add("client_secret", SlackClientSecret)

req, err := http.NewRequest(
	"POST",
	"https://slack.com/api/oauth.v2.access",
	strings.NewReader(values.Encode()),
)

Dessin d'image

Le dessin d'image du kimo de ce service est également dessiné à l'aide de l'image de la bibliothèque standard golang. Bien qu'il soit relativement facile de dessiner des caractères, il n'y a pas de fonction pour écrire verticalement, donc j'essaye de séparer les caractères un par un et de les dessiner en spécifiant les coordonnées X et Y.

Cette image est un dessin en temps réel, mais elle peut être dessinée à une vitesse inférieure à 100 ms, même avec la machine virtuelle à faible spécification d'Azure. image.png _ Dites bonjour au Blackjack / Hidemine Sato _

Données d'image d'origine

Pour l'image originale qui est à la base du manga, sélectionnez une image qui peut être utilisée gratuitement et enregistrez-la dans github avec le JSON qui définit la zone de texte. Lorsque comawari est lancé, il est cloné à partir de github et placé dans golang en mémoire pour être utilisé. Parmi eux, j'aimerais ouvrir le référentiel afin de pouvoir ajouter librement des images par pull request.

Infrastructure

Le serveur utilise la machine virtuelle (B1 standard) d'Azure pour lancer le service comawari avec Docker. Le Dockerfile ressemble à ceci.

FROM golang:1.15.2

ENV TZ Asia/Tokyo

RUN go get github.com/cespare/reflex

WORKDIR /root
RUN mkdir /root/.ssh
COPY ssh /root/.ssh/
RUN chmod 600 /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts

WORKDIR /data
RUN git clone [email protected]:rspepe/comawari-data.git

WORKDIR /go/src/github.com/rspepe/comawari
COPY src .

EXPOSE 80 443

CMD ["/usr/local/go/bin/go", "run", "/go/src/github.com/rspepe/comawari/main.go"]

Le serveur est opérationnel depuis quelques semaines, il fonctionne donc gratuitement. Même si le niveau gratuit est terminé, il semble que l'argent de poche soit assez bon, mais si le trafic augmente et que vous ne pouvez pas vous permettre le coût, vous aurez des ennuis.

Développement local

J'utilise ngrok pour obtenir une machine locale appelée depuis Slack. Pour savoir comment l'utiliser, je me suis référé à l'article d'une autre personne. https://qiita.com/mininobu/items/b45dbc70faedf30f484e

Examen de Slack

Pour la publier en tant qu'application Slack, elle doit être revue de la même manière que l'Apple Store. C'était assez difficile car je devais créer une page de destination et réfléchir aux déclarations de politique de confidentialité et au support utilisateur.

Points à souligner

Trop d'autorisations Slack requises par OAuth

Supprimez les autorisations qui ne sont pas nécessaires pour réaliser le service des autorisations de demande.

Permettre aux utilisateurs d'effacer les jetons d'accès

Ajout de la commande / deauth_coma pour supprimer le jeton d'accès lors de son exécution. Parce qu'il y a un risque de désautorisation en faisant semblant d'être une réponse par e-mail.

Assistance utilisateur

Une nouvelle commande / support_coma a été ajoutée pour créer un mécanisme pour m'envoyer des messages. Si vous nous contactez par e-mail, cela peut être traité comme du spam et ignoré.

Problèmes restants

Coût

Puisque j'ai créé un service amusant, j'aimerais le maintenir autant que possible, mais il semble qu'il deviendra difficile à maintenir à mesure que le coût d'exploitation du serveur augmentera. Si cela se produit, vous devriez également envisager la monétisation. Puisqu'il s'exécute dans un conteneur Docker, vous pouvez l'emporter n'importe où dans un environnement bon marché où Docker s'exécute.

Prend en charge les parenthèses

Il ne prend pas en charge les parenthèses telles que "" et []. Il semble qu'il ne soit pas nécessaire de le traiter car il n'apparaît pas dans les cadres de la bande dessinée, mais je me demande s'il existe une bonne façon de le gérer.

Police de caractère

Il ne prend pas en charge les langues telles que l'arabe et le chinois, et les caractères deviennent du tofu. Je souhaite trouver une police gratuite et l'améliorer afin qu'elle puisse être utilisée de différentes manières.

Exportation outre-mer

Bien qu'il ne soit disponible qu'en japonais, Slack est utilisé partout dans le monde, donc j'aimerais que les étrangers l'utilisent également. Cela semble difficile en termes de droits d'auteur, mais j'aimerais pouvoir faire quelque chose comme Iron Man.

Impressions

Je voulais faire ce service depuis quelques années, c'est donc un grand sentiment d'accomplissement. Auparavant, lorsque je contestais, j'utilisais HTML et JS pour écrire du texte verticalement au-dessus de l'image. Il a réussi à améliorer régulièrement la capacité de développement du golang et d'un excellent outil de communication appelé Slack. Nous continuerons à nous développer, convaincus que nous pouvons continuer à nous améliorer petit à petit et à faire de meilleures choses.

Merci

Nous tenons à remercier Hidemine Sato (signalé après coup au moment de la publication de cet article) pour avoir autorisé une utilisation secondaire dans la création de ce service, et Studio Ghibli pour nous avoir permis de l'utiliser dans les limites du bon sens. Merci beaucoup.

Recommended Posts

Développer une application Slack pour survivre au désastre corona et améliorer la communication
Comment développer une application de panier avec Django
[Python] Lancer un message sur le canal Slack
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Un moyen standard de développer et de distribuer des packages en Python
Créer un environnement Python et transférer des données vers le serveur
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
Ecrire un programme qui abuse du programme et envoie 100 e-mails
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
[Rails 6] Intégrez Google Map dans l'application et ajoutez un marqueur à l'adresse saisie. [Confirmation des détails]