Hallo Spin ich NYA. Leute auf der Seite und Leute auf der Seite schreiben oft Python. Als ich anfing, es zu schreiben, war ich begeistert und habe Slackbot mit Python + Flask gemacht.
https://github.com/supistar/Botnyan
Der Ursprung der Sache ist so Ingress ^ 1 Ich bin mir sicher, dass viele von Ihnen Ingress bereits kennen, daher werde ich nicht auf Details eingehen. Aufgrund der Art des Spiels ist es jedoch wichtig, dass Spieler in einem bestimmten Bereich eine Community bilden und über diese Community interagieren und Operationen entwickeln. .. In dieser Community migrieren einige Communitys jetzt zu Slack.
Mit dem Übergang zu Slack gab es viele Versuche und Irrtümer, um die Community komfortabler zu gestalten. Eine davon ist eine Leitbotschaft beim Beitritt zur Community.
Slack hat einen besonderen Aspekt, und ein großes Hindernis für Benutzer ist, dass die Anwendung auf Englisch basiert. Für Ingenieure ist Englisch eine Welt vor dem Frühstück, aber so wie Agenten keine Ingenieure sind, ist es nicht immer so, dass jeder an Englisch gewöhnt ist.
Höhere Hindernisse für den Beitritt zur Gemeinschaft werden die allgemeine Beteiligung verringern, die Bildung der Gemeinschaft behindern und den Zweck des Umzugs nach Slack in erster Linie ruinieren.
Um diese Barriere zu verringern, haben wir ein Handbuch mit Screenshots und ein Dokument mit Tipps erstellt und Verbesserungen vorgenommen, um neue Mitglieder anzuleiten. Dadurch wurden Tutorials und Leads für Erstbenutzer erstellt, die ihnen die Teilnahme erleichtern.
Diese Leitmeldung wurde jedoch zunächst manuell erstellt
Aufgrund häufiger Probleme wie wurde die Rolle auf Slackbot verschoben, das von Anfang an mit Slack bereitgestellt wird. Dadurch wurde die Leitmeldung automatisiert, aber dieser Bot ist ein ziemlicher Songwriter ...
Ich hatte das Problem "Ich möchte das irgendwie lösen ..." und das Ergebnis ist "Botnyan".
Botnyan basiert auf Python + Flask und fungiert als Bot auf Slack, ausgelöst durch Outgoing-Webhook.
Die Bedienung ist sehr einfach:
--Outgoing - Wenn der Beitrag das in Webhooks angegebene Schlüsselwort enthält, greifen Sie auf den angegebenen REST-Endpunkt (Botnyan) zu. --Botnyan greift auf Google Text & Tabellen zu, die dem angegebenen Keyword zugeordnet sind --Botnyan <-> Google Text & Tabellen stellt eine Verbindung über ein Dienstkonto her. Dokumentinhalte im Textdateiformat abrufen
Es ist geworden.
Seit seiner Einführung wurde es von anderen Agenten sehr gut aufgenommen.
Nachdem ich es erstellt hatte, hörte ich, dass die Nachbargemeinde ein ähnliches Problem hatte, und beschloss, das, was im privaten Repository verwaltet wurde, als öffentliche Quelle zu veröffentlichen. Zuerst habe ich es in der Apache + WSGI-Umgebung zum Laufen gebracht, aber ich habe einige Änderungen am Original vorgenommen, damit es auch in Heroku funktioniert.
Wir haben README-jp für die Einführungsmethode vorbereitet, schauen Sie also auch dort nach! https://github.com/supistar/Botnyan/blob/master/README-jp.md
Hier finden Sie eine kurze Beschreibung des in Botonyan verwendeten technischen Inhalts.
Mit Flask können Sie den Zugriff auf Endpunkte mithilfe mehrerer Dekoratoren einschränken.
Ausgehende Webhooks in Slack greifen auf den durch "POST" + "application / x-www-form-urlencoded" angegebenen Endpunkt zu. Wenn Sie es daher nur auf diese beschränken möchten, gehen Sie wie folgt vor. Da Cross-Origin auch hier zulässig ist, fügen Sie ebenfalls "@cross_origin ()" hinzu.
python
@slack.route("/webhook", methods=['POST'])
@cross_origin()
@consumes('application/x-www-form-urlencoded')
def webhook():
~~~
Outgoing-Webhooks müssen über einen Endpunkt verfügen, der auf die Öffentlichkeit zugreifen kann. Die Standardauthentifizierung kann nicht angewendet werden. Wenn Sie also einen Endpunkt erstellen, ohne sich dessen bewusst zu sein,
Das könnte der Fall sein (´ ・ ω ・ `)
Slacks Outgoing-Webhooks gewährt jedoch Token für Anforderungen. Lassen Sie uns zunächst die Token überprüfen, die Outgoing-Webhooks Ihnen geben. Schauen Sie sich unten die Integrationen von Slack an.
Es ist perfekt mit diesem Token. Speichern Sie dieses Token dann auf der Anwendungsseite und vergleichen Sie es mit dem in der tatsächlichen Anforderung enthaltenen Token. Wenn das Token nicht auf der Anwendungsseite festgelegt ist oder wenn sich das Token von dem in der Anforderung unterscheidet, geben Sie einen Fehler mit "abort (401)" zurück.
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)
Um ehrlich zu sein, war ich darüber am meisten besorgt: ängstlich: Es wäre einfacher, wenn ich die p12-Datei direkt in das Repository stellen würde, aber ich habe sie sofort abgelehnt, weil ich sie öffentlich gemacht habe. Die alternative Methode besteht darin, den privaten Schlüssel in "Config Variables" zu setzen.
Nehmen Sie zuerst den privaten Schlüssel aus der p12-Datei heraus
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 ist der private Schlüssel! Du hast es geschafft!
Stellen Sie dies auf "Config Variables".
# heroku-Werkzeuggürtel verwenden...Diesen Weg
heroku config:add GOOGLE_PRIVATE_KEY=`cat path/to/p12directory/google-services-private-key.pem`
Greifen Sie von der Python-Codeseite aus mit "os.environ" zu. Der Rest entspricht dem Lesen aus einer p12-Datei. Wenn der private Schlüssel nicht festgelegt ist, ist es leicht zu verstehen, wenn Sie "abort ()" aufrufen, um einen bestimmten Statuscode zurückzugeben.
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)
Es ist der Kern von Botnyan. Rufen Sie die Datei mit der in (3) erstellten Dienstinstanz und Dokument-ID ab.
Wenn Sie es jedoch einfach erhalten, werden Dateien im Office-Format heruntergefahren, sodass die Verwendung schwierig ist. Also lasst es uns in einem Dateiformat von "text / plain" bekommen. Wenn Sie Folgendes tun, wird der Inhalt des Dokuments als Zeichenfolge in "Inhalt" gespeichert.
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 = 'Fehler beim Lesen'
Das ist sehr einfach. Ausgehend - Geben Sie einfach eine JSON-Antwort zurück, die der folgenden für Webhooks-Anforderungen ähnelt.
{"text": "Es ist der Inhalt des Dokuments! ∧_∧"}
Es wird nur JSON unter Verwendung des in (4) erhaltenen Inhalts zurückgegeben. Geben Sie "application / json" für den Inhaltstyp der Antwort an.
dic = {"text": content}
return Response(Utils().dump_json(dic), mimetype='application/json')
Das heißt nicht, dass alles gelöst ist.
--Outgoing-Webhook kann derzeit keine PrivateRoom-Bemerkungen erfassen
Welche Seite des Agenten bin ich ... ohne hier: Geist: Ich denke, dass Kommunikationsprobleme nicht nur im Ingress-Team, sondern auch in der Arbeit auftreten. Wenn es Ihnen gefällt, verwenden Sie es bitte.
Ich würde mich sehr freuen, wenn es hilft! Damit! : cat2: