[PYTHON] Comment créer un BOT Cisco Webex Teams à l'aide de Flask

Récemment, lors du développement d'un système utilisant Cisco Webex Teams, j'ai eu l'opportunité de créer un chatbot pour Webex Teams, et je laisserai une note pour moi-même.

Aussi, pour la démonstration cette fois, ngrok sera utilisé pour publier le serveur.

Le flux cette fois est le suivant. · Obtenez un compte Cisco Webex Developers ・ Acquisition de jeton d'accès ・ Installation de diverses bibliothèques Python ・ Préparation de ngrok ·La mise en oeuvre ・ Contrôle de fonctionnement

L'environnement de développement utilisé cette fois est le suivant. ・ Raspberry Pi3 B + ・ Python3 ・ Ngrok ・ Flacon

Obtenez un compte Cisco Webex Developers

Tout d'abord, accédez à ce site. https://developer.webex.com/

スクリーンショット 2020-01-02 3.57.37.png

Cliquez sur S'inscrire dans le coin supérieur droit pour procéder à l'enregistrement.

Obtenez un jeton d'accès

https://developer.webex.com/docs/api/getting-started Accédez à la page de démarrage et obtenez un jeton

スクリーンショット 2020-01-02 4.19.06.png

Pendant la phase de démonstration, vous devrez reprendre ce jeton toutes les 12 heures.

スクリーンショット 2020-01-02 4.18.56.png

Cliquez sur Mes applications Webex Teams. スクリーンショット 2020-01-02 4.26.44.png

Sélectionnez un bot. スクリーンショット 2020-01-02 4.21.14.png

スクリーンショット 2020-01-02 4.21.29.png

Après avoir rempli les différents formulaires, cliquez sur Addbot. スクリーンショット 2020-01-02 4.21.42.png

Installation de diverses bibliothèques Python

terminal


$ pip3 install requests

terminal


$ pip3 install flask

Préparer ngrok

https://qiita.com/kaba/items/82de7e53d99ad9c74cc0 J'ai fait référence à ce site.

la mise en oeuvre

Cette fois, à titre d'exemple, je vais essayer de créer un bot qui ne renvoie que bonjour le monde! En parlant à Hi et au bot. Collez le code implémenté.

Tout d'abord, remplacez le jeton que vous avez obtenu précédemment dans YourToken.

token = 'YourToken'

Définissez une fonction pour publier un message.

def post_message(room_id,txt,token):
    global ms_flag
    if ms_flag == True:
        ms_flag = False
        m = MultipartEncoder({'roomId': room_id,'text': txt})
        r = requests.post('https://api.ciscospark.com/v1/messages', data=m,headers={'Authorization': 'Bearer %s' % token,'Content-Type': m.content_type})
    else:
        time.sleep(5)
        ms_flag = True

À ce stade, elle est gérée plusieurs fois en fonction du comportement lors de la détection du message, donc une fois cette fonction appelée, elle passe pendant un certain temps. Si quelqu'un connaît ce comportement, apprenez-moi s'il vous plaît.

Ici, c'est la partie qui affiche mainpage.html lors de l'accès à / panel. C'est une bonne idée d'écrire une explication sur la façon de l'utiliser.

@app.route("/panel",methods=['GET'])    
def main_page():
    return render_template("mainpage.html")

Collectez l'identifiant du message, l'identifiant de la personne, l'e-mail et l'identifiant de la salle à partir des informations du message reçu

@app.route("/",methods=['POST'])   
def handle_message():
    json = request.json
    
    message_id = json["data"]["id"]
    user_id = json["data"]["personId"]
    email = json["data"]["personEmail"]
    room_id = json["data"]["roomId"]
    bot_id = "yourbotid"

    print(message_id, file = sys.stdout)
    print(user_id, file=sys.stdout)
    print(email, file=sys.stdout)
    print(room_id, file=sys.stdout)

Ici, nous cherchons à savoir si l'ID utilisateur qui a reçu le message est le bot lui-même. De plus, le post_message défini précédemment est appelé de sorte que lorsque Hi est reçu, bonjour le monde! Est renvoyé.

    if user_id != bot_id:
        global token
        header = {"Authorization": "Bearer %s" % token}
        get_rooms_url = "https://api.ciscospark.com/v1/messages/" + message_id
        api_response = requests.get(get_rooms_url, headers=header, verify=False)
        response_json = api_response.json()
        message = response_json["text"]
        print(message, file= sys.stdout)
        if message == "Hi" or message == "bot Hi":
            post_message(room_id,"hello world!",token)
       
        return "Success"
    else:
        return "Pass"

De plus, comme l'adresse IP de ngrok change à chaque fois qu'il est démarré, il lit l'adresse IP.

term_output_json = os.popen('curl http://127.0.0.1:4040/api/tunnels').read() 
tunnel_info = json.loads(term_output_json)
public_url = tunnel_info['tunnels'][0]['public_url']

La gestion des erreurs.

if api_response.status_code != 200:
    print('Webhook registration Error !')
    exit(0)

Le résultat final est le suivant.

main.py


from __future__ import print_function 
import requests
import sys
import json
import os
import time
from flask import *
from requests_toolbelt.multipart.encoder import MultipartEncoder
import functools

token = 'YourToken'
ms_flag = True

app = Flask(__name__)

def post_message(room_id,txt,token):
    global ms_flag
    if ms_flag == True:
        ms_flag = False
        m = MultipartEncoder({'roomId': room_id,'text': txt})
        r = requests.post('https://api.ciscospark.com/v1/messages', data=m,headers={'Authorization': 'Bearer %s' % token,'Content-Type': m.content_type})
    else:
        time.sleep(5)
        ms_flag = True

@app.route("/panel",methods=['GET'])    
def main_page():
    return render_template("mainpage.html")


@app.route("/",methods=['POST'])   
def handle_message():
    json = request.json
    
    message_id = json["data"]["id"]
    user_id    = json["data"]["personId"]
    email      = json["data"]["personEmail"]
    room_id    = json["data"]["roomId"]
    bot_id     = "yourbotid"

    print(message_id, file = sys.stdout)
    print(user_id, file=sys.stdout)
    print(email, file=sys.stdout)
    print(room_id, file=sys.stdout)


    if user_id != bot_id:
        global token
        header = {"Authorization": "Bearer %s" % token}
        get_rooms_url = "https://api.ciscospark.com/v1/messages/" + message_id
        api_response = requests.get(get_rooms_url, headers=header, verify=False)
        response_json = api_response.json()
        message = response_json["text"]
        print(message, file= sys.stdout)
        if message == "Hi" or message == "bot Hi":
            post_message(room_id,"hello world!",token)
       
        return "Success"
    else:
        return "Pass"


term_output_json = os.popen('curl http://127.0.0.1:4040/api/tunnels').read() 
tunnel_info = json.loads(term_output_json)
public_url = tunnel_info['tunnels'][0]['public_url']

#Enregistrement Webhook
header = {"Authorization": "Bearer %s" % token, "content-type": "application/json"}
requests.packages.urllib3.disable_warnings() #Supprimer l'avertissement SSL
post_message_url = "https://api.ciscospark.com/v1/webhooks"

payload = {
    "resource": "messages",
    "event": "all",
    "targetUrl": public_url,
    "name": "BotDemoWebHook"
}

api_response = requests.post(post_message_url, json=payload, headers=header, verify=False) #enregistrement de webhook

if api_response.status_code != 200:
    print('Webhook registration Error !')
    exit(0)

if __name__ == '__main__':
    app.run(host='localhost', use_reloader=True, debug=True)

Contrôle de fonctionnement

terminal


$ ngrok http 5000

terminal


$ python3 main.py

Recommended Posts

Comment créer un BOT Cisco Webex Teams à l'aide de Flask
Comment créer un bot slack
Comment créer un dictionnaire avec une structure hiérarchique.
Comment créer un bot LINE à intelligence artificielle avec l'API de messagerie Flask + LINE
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Comment faire un jeu de tir avec toio (partie 1)
Comment déployer une application Web créée avec Flask sur Heroku
Comment faire une traduction japonais-anglais
Comment créer un robot - Avancé
Comment créer une fonction récursive
Comment faire un simple jeu Flappy Bird avec Pygame
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Comment ajouter un package avec PyCharm
[Python] Comment rendre une classe itérable
Créez un simulateur de gacha rare avec Flask
Comment créer un indicateur personnalisé Backtrader
Comment créer un plan de site Pelican
Faisons un bot Twitter avec Python!
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Comment télécharger avec Heroku, Flask, Python, Git (4)
Comment créer un système de dialogue dédié aux débutants
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Un mémorandum pour faire WebDAV uniquement avec nginx
Créer un bot Twitter Trend avec heroku + Python
Comment dessiner un graphique à 2 axes avec pyplot
Comment développer une application de panier avec Django
Créez un simple générateur d'images par points avec Flask
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Comment créer un plug-in QGIS (génération de package)
Étapes pour créer un bot Twitter avec Python
J'ai lu "Comment créer un laboratoire de piratage"
Essayez de créer un groupe de dièdre avec Python
Procédure de création d'application multi-plateforme avec kivy
Créer un bot LINE WORKS avec Amazon Lex
Made Mattermost Bot avec Python (+ Flask)
Créons une application Web de conversion A vers B avec Flask! De zéro ...
Si vous voulez créer un bot discord avec python, utilisons un framework
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
Comment traiter les images de caméra avec Teams et Zoom
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Je veux faire la transition avec un bouton sur le ballon
Faisons un outil de veille de commande avec python
Expliquez en détail comment créer un son avec python
Comment créer un sous-menu avec le plug-in [Blender]
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Essayez de créer une API RESTful avec MVC à l'aide de Flask 1.0.2
Créer une fonction pour décrire les polices japonaises avec OpenCV