[PYTHON] So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams

Als ich kürzlich ein System mit Cisco Webex Teams entwickelte, hatte ich die Möglichkeit, einen Chatbot für Webex Teams zu erstellen, und ich werde mir selbst eine Notiz hinterlassen.

Zur Demonstration dieses Mal wird ngrok auch zum Veröffentlichen des Servers verwendet.

Der Fluss ist diesmal wie folgt. · Erstellen Sie ein Cisco Webex Developers-Konto ・ Erwerb des Zugriffstokens ・ Installation verschiedener Python-Bibliotheken ・ Vorbereitung von ngrok ·Implementierung ・ Funktionsprüfung

Die diesmal verwendete Entwicklungsumgebung ist wie folgt. ・ Himbeer Pi3 B + ・ Python3 ・ Ngrok · Flasche

Holen Sie sich ein Konto bei Cisco Webex Developers

Greifen Sie zunächst auf diese Site zu. https://developer.webex.com/

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

Klicken Sie oben rechts auf Anmelden, um mit der Registrierung fortzufahren.

Zugriffstoken erhalten

https://developer.webex.com/docs/api/getting-started Gehen Sie zur Einstiegsseite und holen Sie sich einen Token

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

Während der Demo-Phase müssen Sie diesen Token alle 12 Stunden wiederholen.

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

Klicken Sie auf My Webex Teams Apps. スクリーンショット 2020-01-02 4.26.44.png

Wählen Sie einen Bot. スクリーンショット 2020-01-02 4.21.14.png

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

Klicken Sie nach dem Ausfüllen der verschiedenen Formulare auf Addbot. スクリーンショット 2020-01-02 4.21.42.png

Installation verschiedener Python-Bibliotheken

terminal


$ pip3 install requests

terminal


$ pip3 install flask

Ngrok vorbereiten

https://qiita.com/kaba/items/82de7e53d99ad9c74cc0 Ich habe auf diese Seite verwiesen.

Implementierung

Dieses Mal werde ich als Beispiel versuchen, einen Bot zu erstellen, der nur Hallo Welt zurückgibt! Wenn ich mit Hi und dem Bot spreche. Fügen Sie den implementierten Code ein.

Ersetzen Sie zunächst das zuvor erhaltene Token durch YourToken.

token = 'YourToken'

Definieren Sie eine Funktion zum Posten einer Nachricht.

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

Zu diesem Zeitpunkt wird es je nach Verhalten beim Erkennen der Nachricht mehrmals verarbeitet. Sobald diese Funktion aufgerufen wird, vergeht sie für einen bestimmten Zeitraum. Wenn jemand von diesem Verhalten weiß, lehre mich bitte.

Hier ist es der Teil, der beim Zugriff auf / panel die Datei mainpage.html anzeigt. Es ist eine gute Idee, eine Erklärung zu schreiben, wie man es benutzt.

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

Sammeln Sie Nachrichten-ID, Personen-ID, E-Mail und Raum-ID aus den empfangenen Nachrichteninformationen

@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)

Hier prüfen wir, ob die Benutzer-ID, die die Nachricht erhalten hat, der Bot selbst ist. Außerdem wird die zuvor definierte post_message aufgerufen, sodass bei Empfang von Hi hallo world! Zurückgegeben wird.

    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"

Da sich die IP-Adresse von ngrok bei jedem Start ändert, wird auch die IP-Adresse gelesen.

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']

Fehlerbehandlung.

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

Das Endergebnis ist wie folgt.

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']

#Webhook-Aufzeichnung
header = {"Authorization": "Bearer %s" % token, "content-type": "application/json"}
requests.packages.urllib3.disable_warnings() #Entfernen Sie die SSL-Warnung
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) #Webhook-Aufzeichnung

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

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

Funktionsprüfung

terminal


$ ngrok http 5000

terminal


$ python3 main.py

Recommended Posts

So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
Wie man einen lockeren Bot macht
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Wie man ein Schießspiel mit toio macht (Teil 1)
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
Wie man ein einfaches Flappy Bird-Spiel mit Pygame macht
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
So fügen Sie ein Paket mit PyCharm hinzu
[Python] Wie man eine Klasse iterierbar macht
Machen Sie einen seltenen Gacha-Simulator mit Flask
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
Machen wir einen Twitter-Bot mit Python!
Wie man einen Janken-Bot macht, der leicht bewegt werden kann (Kommentar)
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Hochladen mit Heroku, Flask, Python, Git (4)
Wie man ein Dialogsystem für Anfänger erstellt
Lesen einer CSV-Datei mit Python 2/3
So senden Sie eine Nachricht mit Curl an LINE
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Machen Sie Twitter Trend Bot mit Heroku + Python
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So entwickeln Sie eine Cart-App mit Django
Erstellen Sie mit Flask einen einfachen Punktbildgenerator
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
Schritte zum Erstellen eines Twitter-Bots mit Python
Ich las "Wie man ein Hacking Lab macht"
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
Mattermost Bot mit Python gemacht (+ Flask)
Lassen Sie uns mit Flask eine Webanwendung zur Konvertierung von A nach B erstellen! Von Grund auf neu ...
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Eine neue Form der App, die mit GitHub funktioniert: So erstellen Sie GitHub-Apps
So verarbeiten Sie Kamerabilder mit Teams und Zoom
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Ich möchte mit einem Knopf am Kolben übergehen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
So erhalten Sie einen angemeldeten Benutzer mit Djangos forms.py
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
Hochladen mit Heroku, Flask, Python, Git (Teil 3)
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten