Wagen für ein Rechenzentrum

So stellen Sie Python Telegram Bot mithilfe von Webhooks auf der Google Cloud Platform bereit


Anstelle des Vorworts


Bild

- Schreiben Sie einen Telegrammbot. Jetzt schreiben sogar Schulkinder “, sagte sie.
"Und warum nicht", dachte ich damals ("Nun gut", würde ich jetzt sagen).


Wir saßen in Bean und diskutierten bei einer Tasse Kaffee die Möglichkeiten, Ideen mit Modellen für künstliche Intelligenz in einem engen und nicht sehr engen Freundeskreis zu testen. Lena, meine ehemalige Kollegin und in jeder Hinsicht keine Blondine, die gerade ihren Abschluss als Magistratin gemacht hatte, argumentierte wie folgt. Durch das Erstellen eines Bots können Sie Zeit und Energie auf der Benutzeroberfläche sparen, indem Sie sich beim maschinellen Lernen auf den Kern konzentrieren. Sie müssen zugeben, dass es an diesem schönen Sonntagmorgen unmöglich war, einer solchen Logik von „Sportlerin, Komsomol-Mitglied und einfach schön“ zu widerstehen. Es ist gelöst. Telegrammbot bedeutet Telegrammbot.


Zunächst kroch ich in Google und fand eine große Anzahl von Links, "wie man einen Bot in 30 Minuten macht". Es hat mich so sehr inspiriert, dass ich nicht über die Namen hinausging und anfing, einen Kernel zu erstellen. In allererster Näherung musste ich ein Suchabfrageverarbeitungssystem mit NLP (Natural Language Processing) schreiben. Das Schreiben des Kernels dauerte einige, ziemlich vernünftige Zeit (dennoch kann Coca-Colas Erfahrung nicht getrunken werden). Und ein paar Tage später war ich bereit, die erste Testversion des Kernels in ein paar Stunden in ein paar andere Sende-Empfangs-Befehle zu packen und all dies in Telegram zum Nutzen meiner Freunde auszuführen. Aber da war es.


Plötzlich traten eine ganze Reihe von Problemen auf. Nachdem ich ein paar Tage im Internet gesucht und mit Kollegen im Geschäft gesprochen hatte, wurde mir klar, dass das Offensichtliche nicht offensichtlich ist und eine weitere „Anweisung“ nicht schaden wird. Also erschien dieser Artikel.


Anstelle des Eintritts. Bibliotheken


Es gibt mehrere Python-Bibliotheken für Telegramm-Bots. Das Telegramm selbst bezieht sich auf drei von ihnen: Python-Telegramm-Bot , pyTelegramBotAPI , AIOGram . Links zu diesen Bibliotheken und Beispiele in anderen Sprachen finden Sie auf der Telegramm-Website hier . Natürlich gibt es immer noch die Telegramm-API selbst . Im Verlauf meiner Experimente habe ich zwei Varianten der Telegramm-API und pyTelegramBotAPI ausprobiert. Und während beim zweiten angehalten.


Im Allgemeinen sind die Eindrücke der Bibliotheken wie folgt. Alle sind sehr ähnlich, was nicht überraschend ist. Python-Telegramm-Bot, so schien es mir, hat die beste Dokumentation von allen, obwohl die Arbeit daran aufgehört hat (ich hoffe, ich irre mich). Es ist ersichtlich, dass die Arbeit an pyTelegramBotAPI fortgesetzt wird. Eine neue Funktionalität wird angezeigt. AIOGram wirkt jünger und grüner. In letzterem hat mir das nicht gefallen. Anstelle der Dokumentation zu Webhooks gab es einen Link zur Telegramm-Website. Aber alles fließt, alles ändert sich. Und die endgültige Entscheidung muss noch getroffen werden.


Wir werden in diesem Artikel nicht auf das Thema Bibliotheken zurückkommen.


Wie ich bereits bemerkt habe, gibt es im Internet viele Handbücher zum Bot des Bots selbst, die sich mit der Erstellung einfacher und komplexerer Programme befassen. Für die Zwecke dieses Artikels ist dies nicht prinzipiell. Nehmen wir zur Veranschaulichung zwei Beispiele aus dem offiziellen pyTelegramBotAPI-Github:


  1. Telegrammbot mit Polling ;
  2. Telegrammbot mit Webhook .

Die umstrittensten Themen bei Telegramm-Bots sind SSL-Zertifikate, Webhooks und Diploing. Um dies herum und konzentrieren Sie unsere Aufmerksamkeit. Im Folgenden werde ich Schritt für Schritt Anweisungen geben, mit denen Sie Ihren Telegramm-Bot auf einfachste und zuverlässigste Weise für einen minimalen Zeitraum und sogar völlig kostenlos (zumindest im ersten Jahr) auf einem der besten Cloud-Dienste der Welt platzieren können. Die Erstellung von SSL-Zertifikaten, deren Registrierung im Telegramm und andere damit zusammenhängende Themen werden ebenfalls hervorgehoben. Bei Bedarf werde ich erklären, warum wir diese oder jene Option verwenden, diese oder jene Teams.


Umfrage gegen Webhook


Bild

Ohne die Konfrontation zwischen Polling vs Webhook und einigen (teilweise erfundenen) Schwierigkeiten mit Webhook wäre dieser Artikel nicht notwendig gewesen. Da dies von grundlegender Bedeutung ist, schauen wir uns das genauer an.


Was ist ein Bot und wie kommuniziert er mit Telegram? Offensichtlich ist ein Bot ein Programm, das auf Ihrem Computer oder Server ausgeführt wird. Die Kommunikation mit dem Telegramm erfolgt durch Senden und Empfangen von Nachrichten. Und wenn beim Senden von Nachrichten alles klar ist, können Sie eine Option senden (die Adresse „wo“, die wir kennen). Es gibt zwei Möglichkeiten, Bot-Nachrichten von Telegram zu empfangen.


Die erste ist eine Abfrage (wörtliche Übersetzung des Wortes Polling) des Telegrammservers nach Nachrichten für den Bot. Die zweite ist eine "Mailbox" mit einer IP-Adresse (Webhook kann als Webfalle übersetzt werden), an die Nachrichten vom Telegrammserver gelangen.


Die einfachste Analogie zu echter Post. Lassen Sie Mail (Post) der Telegrammserver sein, und Sie sind Ihr Bot. Im ersten Fall (Umfrage) müssen Sie dann zur Korrespondenz zur Post gehen. Und wenn Sie Nachrichten unverzüglich empfangen möchten, müssen Sie nicht gehen, sondern ohne Pause buchstäblich hin und her rennen. Wie wir verstehen, ist es verboten, in der Post zu leben und auf Nachrichten zu warten! Im zweiten Fall teilen Sie der Post Ihre Privatadresse mit und warten zu Hause ruhig auf die Korrespondenz, trinken Tee oder rauchen Bambus.


Natürlich scheint für eine Person die erste Option die schwerwiegendste zu sein. Aber wenn wir zwischen uns nach Nachrichten rennen und ein Stück Eisen mit einem Code senden, ist es uns egal. Und so wäre es, wenn nicht für ein Problem. Von Zeit zu Zeit schließt die Mail (der Telegrammserver) manchmal zum Mittagessen und bewegt sich dann. Und bei Ihrer ersten Option (Umfrage) tritt eine Tragödie auf, die in der realen Welt der Bots mit ihrem Schweben und Scheitern endet.


Im zweiten Fall passiert das "Postfach" mit der Adresse (Webhook) nicht. Denn weder Sie noch Ihr Bot gehen irgendwohin, sondern warten einfach. Und es ist Ihnen egal, wohin die Post umgezogen ist, denn der Postbote bringt Ihnen Post.


In Bezug auf die Codemenge (siehe Link oben) scheint die erste Option einfacher zu sein. Und der zweite ist logischer, aber schwieriger. Für die Implementierung müssen Sie eine Adresse abrufen, die Authentizität bestätigen und den Webserver erhöhen, an den Nachrichten aus dem Telegramm gesendet werden.


Für die erste Option ist es natürlich möglich, dem Code eine Ausnahmebehandlung hinzuzufügen. Wenn die Mail beispielsweise geschlossen ist, warten Sie und warten Sie. Aber das Internet behauptet, dass alle gleichen Bots mit Polling nur zum Spielen sind.


Anfangs glaubte ich nicht, dass das Problem so ernst war. Und er hat eine Option mit Umfragen gewählt und vorgeschlagen, dass ich sie eines Tages auf Webhooks umschreiben werde. Das hat aber nicht funktioniert. Auf meinem Heimcomputer mit macOS arbeitete der Bot ein und zwei Stunden lang problemlos (natürlich mit einem VPN) und stürzte nicht ab. Aber sobald ich es auf den Cloud-Server unter Linux übertragen habe, konnte es 20 Minuten lang nicht funktionieren. Ich habe versucht, dieses Problem auf unterschiedliche Weise und mit unterschiedlichen Einstellungen zu lösen, habe jedoch nur einen anderen Fehlercode erhalten. Selawy, das ist Telegramm. Nachdem ich einen Tag verloren hatte, musste ich unverzüglich Webhooks aufnehmen. Am Ende wollte ich den Bot jetzt auf dem Server starten und nicht in einem Jahr.


Code auf Webhook umschreiben


Der Webhook ist nicht so beängstigend wie er gemalt ist.


Wenn Sie bereits einen Bot-Code mit Abfrage haben, ist das Kopieren in Webhook nicht schwierig. Vergleichen Sie die Codes aus den Beispielen der pyTelegramBotAPI-Bibliothek. Sie finden Code-Schnittpunkte. Die Zeilen 13-25 des ersten Beispiels entsprechen den Zeilen 56-67 des zweiten Beispiels . Dies ist eine logische Einheit, die für die Verarbeitung von Befehlen, Nachrichten und Antworten verantwortlich ist. In diesem Fall ist das Beispiel zu einfach, aber es spiegelt die Hauptessenz wider.


# Handle '/start' and '/help' @bot.message_handler(commands=['help', 'start']) def send_welcome(message): bot.reply_to(message, """\ Hi there, I am EchoBot. I am here to echo your kind words back to you. Just say anything nice and I'll say the exact same thing to you!\ """) # Handle all other messages with content_type 'text' (content_types defaults to ['text']) @bot.message_handler(func=lambda message: True) def echo_message(message): bot.reply_to(message, message.text) 

Daher muss der logische Block des Bots unverändert bleiben, und der Rest sollte unter Verwendung des banalen Copy-Past-Codes außerhalb des logischen Blocks aus dem zweiten Beispiel (d. H. Kopierzeilen 1-55 und 70-87) geändert werden. Wenn Sie sich den Code ansehen, den Sie kopieren, können Sie leicht feststellen, dass Ihr Bot mithilfe der aiohttp- Bibliothek einen http-Server installiert und den für diesen Port zugewiesenen Port überwacht , während das Python- SSL- Modul für die Verschlüsselung und die Zertifikate verantwortlich ist. Neben aiohttp gibt es noch andere ähnliche Bibliotheken, Beispiele hierfür finden Sie hier .


Also. Wir haben einen Bot mit Webhook. Es muss noch auf den Server hochgeladen und ausgeführt werden, wobei gleichzeitig Daten empfangen werden, um die leeren Werte im Code API_TOKEN, WEBHOOK_HOST, WEBHOOK_PORT, WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV einzugeben. Hinter jedem dieser Werte steht ein bestimmtes Verfahren mit einer geheimen Bedeutung.


Bot im Telegramm registrieren


Beginnen wir mit dem Bot-Token. Um es zu erhalten, gehen Sie zum Telegramm-Messenger und stellen Sie eine Verbindung zum @ BotFather-Bot her. Geben Sie den Befehl "/ newbot" ein. Als Antwort fordert BotFather uns auf, den Namen und den Benutzernamen unseres Bots einzugeben, und sendet ein begehrtes Token der Form „712308912: DLGSteczdUnPdnNYLzNikaGOhome7l9q3vova“ (natürlich haben Sie ein anderes). Wir speichern den Token, zeigen ihn niemandem. Im Code weisen wir es der Variablen API_TOKEN zu.


Wo posten? Google Cloud Platform gegen Heroku


Ein paar Worte zur Qual der Wahl eines Cloud-Dienstes. Es gibt viele Beispiele im Internet, in denen Telegramm-Bots auf Heroku gehostet werden. Heroku ist eine PaaS-Plattform (Platform as a Service). Sie laden den Code auf GitHub und von dort auf Heroku hoch . Und Ihr Bot beginnt sofort zu arbeiten. Server, Python und Bibliotheken müssen nicht installiert werden, alles wurde bereits für Sie erledigt. Zumindest im Idealfall. Diese Lösung wurde mir auch von einem meiner Freunde empfohlen. Aber ich habe es abgelehnt.


Soweit ich weiß, ist die Hauptbotschaft für Heroku-Empfehlungen in vielen „30-Minuten-Bot“ -Handbüchern die Verfügbarkeit eines kostenlosen Tarifplans für Heroku. Wenn Sie genau hinschauen, stellt sich heraus, dass dieser Plan sehr begrenzt ist und es Ihnen nicht ermöglicht, einen kostenlosen Bot bereitzustellen, der Tag und Nacht funktioniert.


Im Gegensatz zu Heroku bietet die Google Cloud Platform (GCP) ein ganzes Jahr lang kostenlose Arbeit für alle Dienste innerhalb von 300 US-Dollar. Für diesen Betrag für das Jahr können Sie viele Dinge ausprobieren. Meiner Meinung nach ist dies ein großartiges Geschenk, insbesondere für diejenigen, die sich mit Datenwissenschaft beschäftigen. Und natürlich ist GCP auch PaaS, eine vollständige Liste der Dienste finden Sie hier . Es gibt serverlose Lösungen wie bei Heroku. Ich habe einen konservativeren Weg für mehr Kontrolle in der Zukunft gewählt, nämlich die Compute Engine- Serverlösung auf GCP.


Google Cloud-Plattform


Projekt, Instanz, statische IP, Port


Erstellen Sie ein Projekt und einen Server


Wir gehen zu GCP, wählen "Kostenlos loslegen" und folgen den Anweisungen. Wenn wir alles richtig machen, haben wir ein Konto mit einem Betrag von 300 USD und sogar das erste erstellte Projekt. Wir wählen dieses Projekt aus oder erstellen ein anderes im oberen Menü, was nicht schwierig ist. Wechseln Sie dann im sich öffnenden Seitenmenü zur Registerkarte "Compute Engine / VM-Instanz".


Bild

Klicken Sie auf "INSTANZ ERSTELLEN" und wählen Sie beispielsweise die Serverkonfiguration aus, wie im folgenden Screenshot gezeigt. Sie können eine Mikrokonfiguration auswählen, die dann nur 4 US-Dollar pro Monat kostet. Sie können auch mischen, Geld wird von einem Geschenk von Google mit 300 US-Dollar abgebucht.


Bild

Als Ergebnis bekommen wir.


Bild


IP-Adresse statisch machen


In der Spalte "Externe IP" sehen wir die Adresse, die wir in die Variable WEBHOOK_HOST in unserem Bot eingeben (in diesem Beispiel ist es 35.224.231.90). Wir werden später ein SSL-Zertifikat an diese Adresse erhalten. Wenn Sie den Bot längere Zeit verwenden möchten (auch wenn Sie den Server in GCP ändern), empfehle ich, diese IP-Adresse statisch zu machen, um sie beim Wechsel von einer Instanz zu einer anderen zu speichern. Dies erfolgt im Abschnitt „VPC / Externe IP-Adressen“.


Bild

Wir ändern das Feld "Typ" von "Ephemeral" in "Statisch" und geben einer statischen Adresse einen Namen, damit Sie später nicht verwirrt werden, wenn Sie später ein Dutzend IP-Adressen haben.


Bild

Bild

Bild


Port öffnen


Damit der Webhook ordnungsgemäß funktioniert, müssen wir den Port öffnen, an dem das Telegramm klopft. Derzeit (Juli 2019) unterstützt Telegram die folgenden Ports: 443, 80, 88, 8443. Weitere Informationen finden Sie im vollständigen Telegrammhandbuch zu Webhooks hier . Wir werden Port 8443 öffnen. In unserem Bot ist dieser Wert bereits der Variablen WEBHOOK_PORT zugewiesen. Es bleibt die Konfiguration der Firewall-Regel in GCP für unsere Webhook-Bot-Instanz. Wie kann man das machen? Gehen Sie zur Registerkarte "VPC / Firewall-Regeln" und klicken Sie auf "CREATE FIREWALL RULE".


Bild

Und erstellen Sie eine Regel, wie im folgenden Screenshot gezeigt.


Bild


Wir verbinden uns mit dem Server, installieren Bibliotheken


Damit ist die grundlegende Servereinrichtung auf der Google Cloud Platform abgeschlossen. Wir haben ein Konto bei GCP eingerichtet, ein Projekt erstellt, einen Server (eine Instanz) basierend auf Ubuntu 19.04 als Teil des Projekts erstellt, eine IP-Adresse reserviert und Port 8443 geöffnet.


Es ist wenig übrig. Hoffentlich können wir auf eine detaillierte Beschreibung des Installationsteils von Python und der Bibliotheken verzichten. Deshalb kurz.


Gehen Sie zur GCP-Registerkarte "Compute Engine / VM Instance" und klicken Sie im Feld "Connect" auf "SSH".


Bild

Auf Ihrem lokalen Computer sollte ein Terminal mit Zugriff auf die Instanz in GCP geöffnet werden. Dies ist eine normale Ubuntu-Umgebung. Installieren Sie conda oder virtualenv , erstellen Sie eine virtuelle Umgebung und installieren Sie Python 3 mit den Hauptbibliotheken. Zusätzlich installieren wir die Bibliotheken, die für den Betrieb unseres Bots erforderlich sind:
pip install pyTelegramBotAPI
pip install aiohttp


Schließen Sie das Terminal nach der Installation nicht, wir benötigen es.


Erhalten eines selbstsignierten SSL-Zertifikats für IP


Ich muss sagen, dass im Internet rund um das Thema SSL-Zertifikate für Telegramm ein solider Horror ist. Wie Mikhail Lermontov diesbezüglich sagte:


„Pferde auf einem Haufen verwechselt, Leute,
Und Salven von tausend Kanonen
Verschmolzen zu einem langen Heulen ... "


Wenn Sie lesen, was sie im Internet schreiben, stellt sich heraus, dass falsch empfangene Zertifikate schuld sind, wenn der Bot nicht mit Webhooks funktioniert. Und doch können sie nicht auf IP registriert werden. Im Allgemeinen akzeptiert Telegram keine selbstsignierten Zertifikate. Und selbst wenn er das Zertifikat akzeptiert, bedeutet dies nicht, dass Ihr Bot funktioniert und Telegram nicht einmal einen Fehler sendet.


Das sind Horrorgeschichten. Warum schreibe ich das? Neben der Tatsache, dass diese Horrorgeschichten mich einen weiteren verlorenen Tag gekostet haben, musste ich sogar auf „The Hobbit“ verzichten. Mein Bot weigerte sich zunächst, an Webhooks zu arbeiten. Dies geschah aufgrund meiner Fehler beim Platzieren auf dem Server (dann wusste ich das nicht). Aber wegen der obigen Horrorgeschichten suchte ich nach dem Problem, das nicht da war, und konzentrierte mich darauf, Probleme mit SSL-Zertifikaten zu lösen, die nicht da waren. Aber ich habe unschätzbare Erfahrungen gesammelt. Ich habe für die kommenden Jahre Zertifikate sowohl für Domain-Namen als auch für IP registriert, sowohl selbstsigniert als auch bezahlt, sowohl in Form von zwei Dateien als auch in Form von vier. Ich fand heraus, welche Zertifikate eingehen und wie man daraus Ketten macht. Ich hoffe, das ist jemals nützlich.


Eines ist gut, Sie müssen nicht auf diesen Rechen treten, ich habe es bereits für Sie getan. Ich gebe voll und ganz zu, dass es einen Grund für solche Horrorgeschichten gab, da es keinen „Rauch ohne Feuer“ gibt. Aber für den heutigen Tag scheint sich die Situation beruhigt zu haben.


Im Moment erhalten wir ein SSL-Zertifikat auf die für uns bequemste Weise, nämlich auf IP (und nicht auf einem Domain-Namen), selbstsigniert (d. H. Kostenlos) und kosten nur eine Zeile ohne Websites.


Bereiten Sie im Terminal (das wir noch nicht geschlossen haben) ein separates Verzeichnis vor, in dem wir die Zertifikatdatei und den privaten Schlüssel speichern. Gehen Sie in dieses Verzeichnis und rufen Sie den folgenden Befehl auf.


 $ openssl req -newkey rsa:2048 -sha256 -nodes -keyout url_private.key -x509 -days 3560 -out url_cert.pem 

Als Antwort erhalten Sie Anfragen, einige einfache Felder auszufüllen. Füllen Sie sie im folgenden Beispiel aus. Aber geben Sie natürlich den Code Ihres Landes, Ihrer Region, Ihrer Stadt und Ihres Firmennamens (falls vorhanden) korrekt an, ersetzen Sie Ihre IP-Adresse und Ihre E-Mail-Adresse.


Bild

Als Ergebnis erhalten Sie zwei Dateien in dem Verzeichnis, aus dem Sie diesen Befehl ausgeführt haben. Eine Datei url_cert.pem ist Ihr Zertifikat und der zweite private Schlüssel ist url_private.key. Im Bot-Code werden ihnen jeweils die Variablen WEBHOOK_SSL_CERT und WEBHOOK_SSL_PRIV zugeordnet. Vergessen Sie nicht, die Zugriffspfade zu diesen Dateien zusammen mit den Namen einzugeben. Laden Sie Kopien herunter und bewahren Sie sie zum späteren Nachschlagen auf.


Schließen Sie das Terminal nicht.


Registrieren Sie den Webhook im Telegramm


Registrieren eines Webhooks mit einem selbstsignierten Zertifikat


Vielleicht ist dies der aufregendste Teil von „Was wird das Telegramm sagen?“. Fahren Sie ohne Präambeln einfach den folgenden Befehl in Ihr Terminal. Ersetzen Sie die IP-Adresse durch Ihre und berühren Sie nicht Port 8443. Fügen Sie das von BotFather empfangene Token zwischen "/ bot" und "/ setWebhook") anstelle von YOUR-TOKEN ein. Führen Sie den Befehl in dem Verzeichnis aus, in dem die Zertifikate gespeichert sind.


 $ curl -F "url=https://35.224.231.90:8443" -F "certificate=@url_cert.pem" https://api.telegram.org/botYOUR-TOKEN/setWebhook 

Wenn alles korrekt ist, erhalten Sie im Terminal eine kurze Nachricht vom Telegramm, dass der Webhook installiert ist.


Registrieren eines Webhooks mit dem „richtigen“ Zertifikat


Wenn Sie kein selbstsigniertes Zertifikat haben, können Sie webhook mit dem folgenden Befehl direkt im Browser installieren.


 https://api.telegram.org/botYOUR-TOKEN/setWebhook?url=https://YOUR.DOMAIN:8443/YOUR-TOKEN/ 

Bitte beachten Sie, dass Ihr Token zweimal angezeigt wird. Darüber hinaus ist es wichtig, dass YOUR.DOMAIN wie im Zertifikat angegeben angegeben wird. Zum Beispiel. Ich habe die Domain mydreem.com registriert. Der Registrar hat mir ein SSL-Zertifikat für die Domain www.mydreem.com ausgestellt. Anstelle von YOUR.DOMAIN müssen Sie das letzte www.mydreem.com angeben.


Wie überprüfe ich, ob Webhook installiert ist?


Mit dem folgenden Befehl können Sie überprüfen, ob Webhook über den Browser installiert ist:


 https://api.telegram.org/botYOUR-TOKEN/getWebhookInfo 

Dies funktioniert in allen Fällen. Als Antwort sollten Sie so etwas erhalten, falls der Webhook installiert ist und der Bot ausgeführt wird:


 {"ok":true,"result":{"url":"https://35.224.231.90:8443/712308912:DLGSteczdUnPdnNYLzNikaGOhome7l9q3vova/","has_custom_certificate":true,"pending_update_count":0,"max_connections":40}} 

Oder so, wenn Webhook installiert ist, der Bot aber nicht funktioniert (nicht ausgeführt wird):


 {"ok":true,"result":{"url":"https://35.224.231.90:8443/712308912:DLGSteczdUnPdnNYLzNikaGOhome7l9q3vova/","has_custom_certificate":true,"pending_update_count":2,"last_error_date":1564506964,"last_error_message":"Connection refused","max_connections":40}} 

Wie setze ich den Webhook zurück?


Manchmal müssen Sie möglicherweise das Zertifikat des Bots ändern, z. B. wenn Sie auf einen anderen Server (eine andere Domäne) wechseln. Dann bleibt das Token erhalten und das Zertifikat ändert sich (der Webhook wird neu installiert). Oder es wird notwendig, den Bot nicht auf dem Webhook, sondern auf dem Polling auszuführen (wenn der Webhook installiert ist, funktioniert das Polling nicht). In beiden Fällen ist ein Befehl zum Zurücksetzen des Webhooks hilfreich:


 https://api.telegram.org/botYOUR-TOKEN/setWebhook 

Jetzt ist alles bereit, um den Code auf den Server hochzuladen und den Bot zu starten. Wenn Sie mit zehn Fingern ein Meister des Spiels auf der Kommandozeile sind, wird es für Sie nicht schwierig sein. Und in einer Minute wird Ihr Bot funktionieren. Wenn nicht, wird der nächste Abschnitt dazu beitragen, das Hochladen / Herunterladen von Dateien auf Ihren Server und deren Verwaltung etwas zu vereinfachen.


Cloud Shell oder "Drop Dead Beautiful"


Für mich als Person, die weit von der Systemadministration entfernt ist, ist es schwer zu verstehen, warum wir im Zeitalter des Triumphs der künstlichen Intelligenz immer noch wie früher auf dem EU / SM-Computer mit den Befehlszeilenservern kommunizieren. Angenommen, es gibt Gründe, die bloßen Sterblichen unbekannt sind. Dann muss ein Phänomen wie Cloud Shell in GCP mit großer Freude akzeptiert werden. Dieses Werkzeug ermöglicht es, wenn auch mit Krücken, die Arbeit der Uneingeweihten etwas zu erleichtern. Obwohl es schaden kann, wenn Sie einige der Nuancen nicht kennen.


Cloud Shell bietet Zugriff auf Cloud-Ressourcen über die Befehlszeile direkt über den Browser. Sie können einfach Verwalten Sie Ihre Projekte und Ressourcen, ohne das Google Cloud SDK oder andere Tools in Ihrem System zu installieren (die letzten beiden Sätze werden von ihrer Seite übernommen und von mir "leicht" durchgestrichen). Informationen zum Verwalten Ihrer Projekte über die Befehlszeile finden Sie hier . Aber die Hauptsache für uns ist nicht das. Starten Sie Cloud Shell (siehe das unten stehende GIF von Google).


Bild

Sie sind bei Cloud Shell angemeldet. Wenn Sie nun in Form eines Bleistifts auf die Schaltfläche klicken, wird der Texteditor der Beta-Version geöffnet.


Bild

Im Menü "Hilfe / Info" können Sie feststellen, dass es sich um "Theia-Editor-für-Cloudshell-Vorschau 0.0.1" handelt. Am Ende des Artikels werde ich nicht auf die Funktionen der Arbeit mit diesem Editor eingehen. Ich werde nur wichtige Punkte hervorheben. Dies ist nicht nur ein Editor für mehrere Sprachen (nur mit Python überprüft), sondern auch ein Dateimanager. Sie können die Dateifreigabe zwischen Cloud Shell und Ihrem lokalen Computer problemlos organisieren. Sie können Dateien und Verzeichnisse innerhalb des Cloud Shell-Bereichs mit der Maus übertragen.


Bitte beachten Sie, dass ich nirgendwo darüber geschrieben habe, dass Sie mit dem Editor Dateien auf Ihrem Server (Instanz) bearbeiten und verwalten können. Aber auch das reicht aus, um unser Leben leichter zu machen. Und mehr dazu weiter unten. Und jetzt erzähle ich Ihnen etwas Wichtiges über Cloud Shell. Dies muss verstanden werden, um nicht in das Chaos zu geraten, wie es mir passiert ist.


Cloud Shell ist ein Debian-basierter Server mit 5 GB Speicherplatz und 1,7 GB RAM. Einige Softwareprogramme sind bereits vorinstalliert (einschließlich Python). Cloud Shell kann leicht mit Ihrer Instanz verwechselt werden, Conda darauf installieren, env erstellen und den Bot ausführen. Und wenn der Bot abfragt, funktioniert es. Wenn Sie einen Webhook verwenden, funktioniert dies nicht, da alle Ports in Cloud Shell geschlossen sind. Und wie viele Ports in der Instanz nicht geöffnet werden, wird in der Cloud Shell nicht angezeigt.


Aufgrund meiner jugendlichen Unerfahrenheit und Nachlässigkeit bin ich in diese Falle geraten und habe lange versucht zu verstehen, warum Telegram meinen Bot nicht mit einem Webhook sieht. Dann war ich sehr verärgert. Aber die Frau erwärmte sich und die Söhne beruhigten sich, und dieser Artikel erschien.


Cloud Shell existiert übrigens außerhalb von Raum und Zeit (ein Witz, der der Wahrheit nahe kommt). Wenn Sie alle Instanzen und Projekte von zu Hause aus löschen, bleibt Ihre Cloud Shell weitere 120 Tage lang mit allem, was Sie hochgeladen haben, bestehen. Verwechseln Sie dies nicht mit dem Sichern Ihrer Server.


Also. Vorgewarnt, dann bewaffnet. Und jetzt können wir über Annehmlichkeiten sprechen und ein paar nützliche Befehle kennenlernen.


Wenn Sie beispielsweise Cloud Shell als Terminal für den Zugriff auf Ihren Server verwenden möchten (z. B. Webhook-Bot), müssen Sie Ihre Instanz in der Befehlszeile aktivieren:


 $ gcloud compute ssh webhook-bot --zone us-central1-a 

Danach befinden Sie sich in der Befehlszeile Ihres Servers. Sie können mit dem Befehl "exit" zur Cloud Shell zurückkehren. Angenommen, Sie möchten einige Dateien aus der Cloud Shell in eine Instanz kopieren. Geben Sie dazu an der Cloud Shell-Eingabeaufforderung (keine Instanz) den folgenden Befehl ein:


 $ gcloud compute scp --recurse ~/telebot/my_favorite_robot.py webhook-bot:~/telebot --zone us-central1-a 

Wenn Sie die Quelle mit dem Ziel ändern, wird von der Instanz in die Cloud Shell kopiert. Im folgenden Beispiel kopieren wir die Datei "ex1.py" aus dem Verzeichnis "/ examples" des Servers "webhook-bot" in das Verzeichnis "/ telebot2" der Cloud Shell:


 $ gcloud compute scp --recurse webhook-bot:~/examples/ex1.py --zone us-central1-a ~/telebot2 

Diese und andere Dateifreigabebefehle finden Sie hier . Sie können nicht nur Dateien, sondern auch ganze Verzeichnisse austauschen. Als Ergebnis erhalten wir das folgende Schema, das unser Leben einfacher macht. Vom lokalen Computer kopieren wir Dateien, indem wir in Cloud Shell über den Dateimanager des Editors „theia-editor-for-cloudshell-Preview 0.0.1“ auf einige Schaltflächen mit der Maus klicken. Und dann leiten wir dies über die Befehlszeile auf unseren Server (Instanz) um. Wenn wir etwas schnell bearbeiten müssen, können wir dies im selben Editor in Cloud Shell tun und Dateien mit demselben Befehl auf den Server hochladen. Es stellt sich ziemlich schnell heraus.


Ich glaube, dass es in jeder Hinsicht elegantere und bequemere Möglichkeiten gibt, Dateien für einen Cloud-Server auf GCP auszutauschen und zu verwalten (ohne zusätzliche Programme auf dem lokalen Computer zu installieren). Vielleicht durch Cloud Storage . Ehrlich gesagt habe ich nur ein paar Stunden damit verbracht, dieses Thema zu suchen und zu experimentieren. Daher wäre ich Ihnen dankbar, wenn Sie Ihre Ideen oder Arbeitslösungen in den Kommentaren mitteilen würden.


Also. Wir haben die Dateien auf den Server (Instanz) hochgeladen. Wenn Sie den Bot noch nicht gestartet haben, müssen Sie dies tun, indem Sie zum Serverterminal gehen, die erforderliche virtuelle Umgebung aktivieren und einen Befehl wie "python my_webhook_bot.py" eingeben. Alles sollte funktionieren. Damit der Bot beim Schließen des Terminals weiter funktioniert, muss er im Hintergrund gestartet werden. Zum Beispiel "nohup python my_webhook_bot.py &". Die Suche, wie man den Prozess aus dem Hintergrund holt und abschließt, überlasse ich Ihnen, es sei denn, Sie wissen es natürlich bereits.


Fazit


Ich hoffe, dieser Artikel war hilfreich für Sie. Er hat geholfen, Zeit zu sparen und die Fehler zu vermeiden, die ich beim Schreiben eines Telegramm-Bots mit Webhooks und beim Platzieren auf dem Server gemacht habe. Alles, was in dem Artikel beschrieben wurde, habe ich selbst durchgearbeitet, und zum Zeitpunkt des Schreibens von Juli bis August 2019 hat es einfach so funktioniert. Mein besonderer Dank gilt Mikhail Krutikov für das gemeinsame Surfen auf den Flächen der GCP-Dienste und für die Unterstützung bei der Verwirklichung einer Reihe wichtiger Wahrheiten. Ich bin offen für Fragen, Diskussionen und bin dankbar für den Rat in den Kommentaren zu diesem Artikel. Oder schreiben Sie mir in Telegram @Eduard_Lanchev .


Bis zum letzten Moment war die Frage offen, ob ich einen Link zu meinem Telegramm-Bot geben sollte. Freunde haben mich überzeugt, dass es sich gelohnt hat. Sie können mit meinem Bot unter @AelitaSoccerBot chatten . Der Bot steht ganz am Anfang der Reise und es bleibt noch viel zu tun. Schreiben Sie daher, wenn etwas nicht stimmt, schreiben Sie, wenn Sie Ihre Erfahrungen teilen oder Ratschläge geben möchten. Meine Dankbarkeit wird keine Grenzen innerhalb angemessener Grenzen haben. Hinweis Bis Ende 2019 war der Bot aufgrund von Zeitmangel für seine Unterstützung und Entwicklung deaktiviert.


Und am Ende möchte ich allen Botovods und meinen Kollegen, Datenwissenschaftlern, viel Erfolg wünschen!


Nützliche Links


  1. Telegramm-Bot-API
  2. Beispiele für Bot-Codes
  3. Python-Telegramm-Bot
  4. pyTelegramBotAPI
  5. AIOGram
  6. ssl - TLS / SSL-Wrapper für Socket-Objekte
  7. Heroku
  8. Google Cloud-Plattform
  9. Google Compute Engine
  10. Marvins wunderbarer Leitfaden für alle Dinge Webhook
  11. Conda
  12. Virtualenv
  13. Wolkenhülle
  14. Das Befehlszeilentool gcloud compute
  15. Übertragen von Dateien mit dem Befehlszeilentool gcloud
  16. Google Cloud-Speicher

Source: https://habr.com/ru/post/de462141/


All Articles