Bonjour spin I NYA. Les gens du côté et ceux du côté écrivent souvent Python, donc quand j'ai commencé à l'écrire, je suis devenu accro et j'ai créé Slackbot avec Python + Flask.
https://github.com/supistar/Botnyan
L'origine du problème est donc Ingress ^ 1 Je suis sûr que beaucoup d'entre vous connaissent déjà Ingress, donc je n'entrerai pas dans les détails, mais en raison de la nature du jeu, il est important pour les joueurs dans une zone spécifique de former une communauté et d'interagir et de développer des opérations à travers cette communauté. .. Dans cette communauté, certaines communautés migrent désormais vers Slack.
Au fur et à mesure que la transition vers Slack progressait, il y a eu de nombreux essais et erreurs pour rendre la communauté plus pratique. L'un d'eux est un message d'orientation pour rejoindre la communauté.
Slack a un aspect spécial, et un gros obstacle pour les utilisateurs est que l'application est basée en anglais. Pour les ingénieurs, l'anglais est un monde avant le petit déjeuner, mais tout comme les agents ne sont pas des ingénieurs, il n'est pas toujours vrai que tout le monde soit habitué à l'anglais.
Des barrières plus élevées pour rejoindre la communauté réduisent la participation globale, entravant la formation de la communauté et ruinant l'objectif du déménagement vers Slack en premier lieu.
Par conséquent, afin de réduire cette barrière, nous avons préparé un manuel avec des captures d'écran et un document avec des conseils, et des améliorations ont été apportées pour guider les nouveaux membres. Cela a créé des didacticiels et des pistes pour les nouveaux utilisateurs, ce qui leur permet de participer plus facilement.
Cependant, ce message de guidage a été effectué manuellement au début
--Oubliez le contenu du texte ――En premier lieu, où était le modèle du texte? (Il n'apparaît pas même si vous recherchez)
En raison de problèmes fréquents tels que, le rôle a été déplacé vers Slackbot, qui est fourni depuis le début avec Slack. Cela a rendu le message de guidage automatisé, mais ce Bot est tout à fait un auteur-compositeur ...
J'ai eu le problème, "Je veux résoudre ça d'une manière ou d'une autre ...", et le résultat est "Botnyan".
Botnyan est écrit basé sur Python + Flask et agit comme un bot sur Slack déclenché par Outgoing-Webhook.
L'opération est très simple:
--Outgoing-Si la publication contient le mot-clé spécifié dans les Webhooks, accédez au point de terminaison REST spécifié (Botnyan). --Botnyan accède à Google Docs associé au mot-clé spécifié --Botnyan <-> Google Docs se connecte via un compte de service. Obtenir le contenu du document au format de fichier texte
Il est devenu.
Depuis son introduction, il a été très bien accueilli par ses collègues agents.
Après l'avoir créé, j'ai entendu dire que la communauté voisine avait un problème similaire, j'ai donc décidé de publier ce qui était géré dans le référentiel privé en tant que source publique. Au début, je l'ai fait fonctionner dans l'environnement Apache + WSGI, mais j'ai apporté quelques modifications à l'original pour qu'il puisse également fonctionner dans Heroku.
Nous avons préparé README-jp pour la méthode d'introduction, alors jetez-y également un œil! https://github.com/supistar/Botnyan/blob/master/README-jp.md
Ici, je vais décrire brièvement le contenu technique utilisé dans Botonyan.
Flask vous permet de restreindre l'accès à Endpoints en utilisant plusieurs décorateurs.
Les Webhooks sortants de Slack accèderont au point de terminaison spécifié par POST
+ ʻapplication / x-www-form-urlencoded. Par conséquent, si vous souhaitez le limiter uniquement à ceux-ci, procédez comme suit. Puisque Cross-Origin est également autorisé ici, ajoutez également
@cross_origin ()`.
python
@slack.route("/webhook", methods=['POST'])
@cross_origin()
@consumes('application/x-www-form-urlencoded')
def webhook():
~~~
Les Webhooks sortants doivent avoir un point de terminaison qui peut accéder au public. L'authentification de base ne peut pas être appliquée, donc si vous créez un point de terminaison sans en être conscient,
Cela pourrait être le cas (´ ・ ω ・ `)
Cependant, Outgoing-Webhooks de Slack accorde des jetons aux requêtes. Tout d'abord, vérifions les jetons que Outgoing-Webhooks vous donnera. Jetez un œil aux intégrations de Slack en bas.
C'est parfait avec ce jeton. Ensuite, stockez ce jeton côté application et comparez-le avec le jeton inclus dans la demande réelle. Si le jeton n'est pas défini du côté de l'application, ou si le jeton est différent de celui de la requête, renvoyez une erreur avec ʻabort (401) `.
form = request.form
request_token = Utils().parse_dic(form, 'token', 400)
token = os.environ.get('SLACK_WEBHOOK_TOKEN')
if not token or token != request_token:
abort(401)
Pour être honnête, j'étais le plus inquiet à ce sujet: peur:
Ce serait plus facile si je mettais le fichier p12 directement dans le référentiel, mais je l'ai rejeté immédiatement parce que je l'ai rendu public.
La méthode alternative est de mettre la clé privée dans Config Variables
.
Tout d'abord, retirez la clé privée du fichier p12
cd path/to/p12directory
openssl pkcs12 -passin pass:notasecret -in privatekey.p12 -nocerts -passout pass:notasecret -out key.pem
openssl pkcs8 -nocrypt -in key.pem -passin pass:notasecret -topk8 -out google-services-private-key.pem
rm key.pem
# google-services-private-key.pem est la clé privée! Tu l'as fait!
Réglez ceci sur «Variables de configuration».
# heroku-Utilisation de la ceinture porte-outils...Par ici
heroku config:add GOOGLE_PRIVATE_KEY=`cat path/to/p12directory/google-services-private-key.pem`
Du côté du code Python, accédez-y avec ʻos.environ. Le reste est identique à la lecture d'un fichier p12. Si la clé privée n'est pas définie, il est plus facile à comprendre en appelant ʻabort ()
pour renvoyer un code d'état spécifique.
private_key = os.environ['GOOGLE_PRIVATE_KEY']
if not private_key:
abort(401)
credentials = SignedJwtAssertionCredentials(os.environ['GOOGLE_CLIENT_EMAIL'],
private_key,
'https://www.googleapis.com/auth/drive',
sub=os.environ['GOOGLE_OWNER_EMAIL'])
http = httplib2.Http()
credentials.authorize(http)
service = build('drive', 'v2', http=http)
C'est le cœur de Botnyan. Obtenez le fichier à l'aide de l'instance de service et de l'ID de document créés dans (3).
Cependant, si vous l'obtenez simplement, les fichiers au format Office tomberont, il est donc difficile à utiliser.
Alors prenons-le dans un format de fichier text / plain
. Si vous procédez comme suit, le contenu du document sera stocké sous forme de chaîne dans content
.
f = service.files().get(fileId=doc_id).execute()
if 'exportLinks' in f and 'text/plain' in f['exportLinks']:
download = f['exportLinks']['text/plain']
resp, content = service._http.request(download)
else:
content = 'Échec de lecture'
C'est très simple. Il renvoie simplement une réponse JSON similaire à la suivante en réponse à une requête Outgoing-Webhooks.
{"text": "C'est le contenu du document! ∧_∧"}
Il renvoie simplement JSON en utilisant le contenu obtenu dans (4). Spécifiez ʻapplication / json` pour le Content-Type de la réponse.
dic = {"text": content}
return Response(Utils().dump_json(dic), mimetype='application/json')
Cela ne veut pas dire que tout est résolu.
--Outgoing-Webhook ne peut actuellement pas recevoir les remarques de PrivateRoom --Il semble que vous puissiez le récupérer en utilisant l'adaptateur de mou de hubot (RTM), mais si vous l'utilisez, les sauts de ligne dans le document ne fonctionneront pas ...
De quel côté de l'agent suis-je ... sans ici: fantôme: Je pense que les problèmes de communication ne sont pas seulement dans l'équipe Ingress mais aussi au travail, donc si vous l'aimez, veuillez l'utiliser.
Je serais très heureux si cela aide! Alors! : cat2: