Die Aufgabe erscheint einfach, wenn Sie nichts darüber wissen und wenn Sie sich entscheiden.
An einem „wunderbaren“ Tag wurde mir klar, dass ich nicht an zahlreichen Foren teilnehmen möchte, aber ich möchte meinen eigenen Kanal erstellen und „Weisheit“ teilen.
Ich mag darin eingebettete Telegramm-Funktionen, einschließlich Bots, so dass der Kanal in Form eines Blogs dort erstellt wurde. Er begann nach Bots zu suchen, die ihm beim Schreiben von Nachrichten halfen. und da will ich es nicht finden. Nun, schreib es selbst. Klugen Leuten wird geraten, in Python zu schreiben.
Ich habe das erste Tutorial im Internet auf 149 Seiten gelesen. Ich kenne mich mit Pascal, FoxPro, Interbase aus und selbst vor 20 Jahren (ha ha 3 mal) habe ich meine Programme verkauft, und dann hat es irgendwie nicht geklappt, ich bin in den Handel gegangen. Die Arbeit als Programmierer hat mir übrigens sehr geholfen, Aufgaben für Programmierer zu erstellen. Aber zurück zu Python scheint es nichts Kompliziertes zu sein, denn es war auch möglich, auf BASIC zu programmieren, und dies ist nicht mein Hochschuldiplom mit einem Hardware-Software-Komplex des MIG-Verifikationsgenerators auf Assembler. Ein Problem, das alles schon lange her ist, also kehren wir zur Überschrift zurück - es scheint, dass es einfach ist, da ich noch nichts über die Aufgabe weiß, aber es ist einen Versuch wert.
Ich entschied, dass es am bequemsten ist, ein Projekt von einem Smartphone auf Android zu erstellen, da es immer zur Hand ist. Also setzen Sie:
- Pydroid 3 - IDE für Python 3 Eigentlich Python für Android.
- @BotFather, In Telegram installieren wir den Vater aller Bots - Sie benötigen ihn, um die ID Ihres Bots zu ermitteln und grundlegende Einstellungen vorzunehmen.
- Rebootr Anwendung zum Starten eines Projekts auf Heroku.
- GIT Eine Anwendung für das Online-Hosting von Repositories.
- Windscribe ohne VPN irgendwo?
- Termux Terminal Emulator und Linux-Umgebung.
Und was ist das Endergebnis? Die Programmierung auf einem Smartphone ist theoretisch möglich, in der Praxis jedoch nicht möglich. Überprüfen Sie den Code so oft wie möglich, beheben Sie den Fehler und untersuchen Sie die Leistung.
So eine lange Einführung und was ich von meinem Bot bekommen wollte. Anfangs schien es mir genug, am Ende der Nachricht einen Hashtag einzufügen. Dann kam der Gedanke, es mit einem Link zu meinem Kanal zu "verdecken", so dass es beim erneuten Posten eine zusätzliche Verlockung für die Kanalquelle geben wird. Dann fügte er die Automatisierung des Quelllinks hinzu, von wo ich die Nachricht bekomme. Als nächstes werde ich einen Exkurs machen. Werbung ist natürlich der Motor des Fortschritts. Aber manchmal geht seine Menge durch das Dach. Telegramm wurde von mir unter anderem deshalb gewählt, weil es die Möglichkeit gibt, letzteres zu bekämpfen. Ich respektiere die Leser meines Kanals und säubere daher die auf Ineta gefundenen interessanten Nachrichten von Werbung und sende sie an den Kanal. Gleichzeitig respektiere ich die Autoren und gebe fast immer einen Link zur Quelle in Form von "Read more ...". Aufgrund der Abneigung gegen Werbung lade ich Inhalte von YouTube herunter und lade sie in meinem Kanal als Videodatei hoch. Zu einem bestimmten Zeitpunkt wurde der Bot, der das Video heruntergeladen hatte, verrückt und begann, mir stündlich Werbung zu schicken. In meinem Bot gab es also die Möglichkeit, Videos von YouTube herunterzuladen. Vor kurzem traf ich übrigens den Autor dieses Bots, er war sehr überrascht, weil Ihm zufolge sendet er "nur" 20 Mal im Monat Werbung. Dasselbe geschah mit dem Bot, der das Wasserzeichen herstellt - es wurde in den Ofen geschickt, und ich hatte die Möglichkeit, ein Wasserzeichen herzustellen.
Um ein Programm von Grund auf neu zu schreiben, musste ich viele Informationen im Internet suchen. Ich hoffe, dass diejenigen, die in meine Fußstapfen treten, helfen werden. Woher habe ich die Informationen und was habe ich verwendet:
- Artikel über Habrr haben mir sehr geholfen. Daher werde ich nicht umschreiben, wie und was zu installieren ist. Alles ist da. Übrigens habe ich die Autoren persönlich kontaktiert und sie haben meine Hilfe nie abgelehnt.
- github Ein Online-Repository-Hosting-Service mit allen Funktionen der verteilten Versionskontrolle und Versionskontrolle. Grundierung
- Heroku ist eine Cloud-basierte PaaS-Plattform, die eine Reihe von Programmiersprachen unterstützt. Sehr schnell verließ ihn.
- pyTelegramBotAPI - Eine der Hauptbibliotheken beim Schreiben eines Bot für Telegramme.
- Bot Rechtschreibung Tutorial
- Python 3 für Anfänger
- Bots: Informationen für Entwickler
- HTML-Referenz
- Nirgendwo ohne VPN?
Ein zweiter Exkurs oder Kriegsplan wird sich zeigen. Als ich anfing, den Bot zu schreiben, war das erste, was ich mir ansah, der Code eines anderen. Wenn es keine Kamenty gibt, kann man kaum verstehen:
Die Erde zitterte wie unsere Brüste
Pferde in einem Haufen gemischt, Menschen,
Und Salven von tausend Kanonen
Verschmolzen zu einem langen Heulen ...
Lermontov schrieb über den Code. Der Haufen enthält Funktionen, Dekorateure. Es gibt keine Code-Schönheit, niemand kümmert sich um Ressourcen. Obwohl die Schönheit am ehesten vom seltsamen Masochisten gesehen wird. Die Bedeutung des Satzes eines vertrauten Programmierers "Sehen Sie sich das Programm an, vielleicht können Sie es herausfinden" erreichte mich sehr schnell. Die wichtigste Gehirnexplosion, die ich hatte, war, als mir endlich klar wurde, dass der Code ereignisgesteuert und nicht sequentiell ist. Dies ist eine andere Ebene.
Das zweite Problem ist das Fehlen einer guten Dokumentation. Auch in Basurm. Ich werde ein Beispiel geben. Ich sende ein Bild zu Telegrammen, und er schüttelt es schamlos. Es stellte sich heraus, dass ein ungültiges Argument in die Zeile geschrieben wurde:
file_info = bot.get_file(message.photo[-1].file_id)
Und was ist die Dokumentation? Wir gehen zur Quelle


Dies ist ein Array. Sie können entlang gehen, studieren, wo welche Größe zurückkommt. Vielen Dank, clevere Leute schlugen vor, was sie verschreiben sollten.
Obwohl, wovon spreche ich, auch wenn die Gurus ratlos sind.
Als ich den Wasserzeichencode geschrieben habe, habe ich eine kostenlose Schriftart verwendet und die Lösung angewendet, um die Meldung dreimal mit einem Pixelversatz anzuzeigen. Ich weiß nicht, wie schön die Lösung ist, aber sie funktioniert.
font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font)
Wie Sie sehen, wird die Position in Abhängigkeit von der Größe des Bildes und der Schriftgröße ausgewählt. Ich bin sofort auf einen interessanten Punkt gestoßen: Obwohl die Schriftart ein integraler Bestandteil der PIL-Bibliothek ist, sagt die erste Zeile, dass sie lokal funktioniert, in Docker jedoch nicht. Der Ausweg besteht darin, es in das Repository herunterzuladen, den Pfad zur Umgebungsdatei hinzuzufügen und einen anderen Pfad in das Programm zu schreiben.
Eine weitere für mich unverständliche Sache geschah mit dem Bild nach der Verarbeitung mit der PIL-Bibliothek (unmittelbar nach dem Wasserzeichen). Ich schicke es an meinen Bot:
with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi)
Alles ist toll, ich mag das Bild. Dann muss ich dem Bild einen Kommentar hinzufügen und sehen, ob alles zusammen schön aussieht? Wir schreiben:
bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ')
Aus irgendeinem Grund geht das ursprüngliche, unverarbeitete Bild in den Bot. Nun, lass uns versuchen zu täuschen: getupdates.offset -1 no sense, Telegram ist sich sicher, dass dies dasselbe Foto ist. Ok, wir machen das:
with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi)
Umschreiben:
bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ')
Das Ergebnis ist das gleiche - das Originalbild wird angezeigt. Und nur das Ersetzen der Nachricht im ersten Argument durch info ergab das gewünschte Ergebnis.
Ich gebe Ihnen auch einen interessanten Einstiegscode von YouTube (Hinweis: ohne Fehlerprüfung):
elif message.entities:
Für mich war der Stolperstein, dass Entities ein Array von Arrays sind und Sie das gesamte Array „durchgehen“ müssen, damit der Bot versteht, dass wir mit einem Link arbeiten. Es stellte sich außerdem heraus, dass Benutzer den Link von YouTube als "Teilen" an den Bot senden, sodass im Beispiel auch "youtu.be" geschrieben ist. Ich hatte keine Möglichkeit, eine Datei sofort an Telegram zu senden. Deshalb speichern wir sie, senden sie und löschen sie dann. Während des Testens wurde ich sofort informiert, dass die Leute riesige Dateien herunterladen würden - später musste ich eine Einschränkung einführen.
Bevor der Bot veröffentlicht wurde, wurde mir plötzlich klar, dass ich keine Zugriffsberechtigung für den Channel hatte. Zum Beispiel könnte jeder Bot-Benutzer, der meinen Kanal kennt, eine Nachricht dorthin senden, weil Der Bot ist ein Administrator. Ich musste dringend eine Kontrolle machen:
if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]:
Hier erhalten wir die Liste der Administratoren aus dem Channel und sehen, ob der Autor der Nachricht auch ein Administrator ist.
Ein paar Worte darüber, wie du mit Roskomnadzor kämpfen musstest. Da der Zugriff auf die API blockiert ist, müssen Sie den Datenverkehr durch unsere tapferen Verteidiger leiten, um den Bot lokal zu entwickeln. Sie können dies auf zwei Arten tun - über ein VPN oder über einen Proxy. Der einfachste und schnellste und „normale“ Weg ist der SSH-Tunnel: Wir stellen eine Verbindung zwischen dem Client und dem Proxy-Server her, wir erhalten einen Port auf dem lokalen Host, über den Datenverkehr von unserer Seite gesendet werden kann, und er wird von der anderen Seite (bereits irgendwo in Deutschland) ausgegeben. Der Einfachheit halber können Sie dieser Verbindung einen gewissen Grad an Automatisierung hinzufügen - ein Skript und eine Verknüpfung auf dem Desktop, über die sie bei Bedarf gestartet wird. Mit der „normalen“ Methode meine ich die Situation, in der wir die Ein- und Ausstiegspunkte selbst kontrollieren - auf der linken Seite befindet sich unser Laptop, auf der rechten Seite der VPS in Deutschland. In der Mitte kann der Verkehr beliebig oft abgefangen werden, er wird verschlüsselt und am Ausgang befinden wir uns in der Gerichtsbarkeit eines anderen Staates, und die Gesetze der Russischen Föderation gelten nicht für ihn. Als ein Plus erhalten wir eine zusätzliche Garantie, dass der Proxy-Server nicht geändert oder ausgeschaltet wird, bis wir es selbst tun. Das heißt Anders als bei jedem Onkel-VPN haben wir Ruhe und Vertrauen in die Zukunft.
Skript
/home/user/proxy.sh
Skriptcode
Nachdem wir eine Verbindung zum Server hergestellt haben und der Port offen ist, müssen wir irgendwie den Verkehr dorthin leiten. Wenn Sie den Weg des geringsten Widerstands beschreiten und nicht darüber nachdenken, wie Proxys in IDE \ docker \ python konfiguriert werden sollen, können Sie eine Einstellung vornehmen. Proxy-Ketten sind eine solche Einstellung. Wenn Sie mit diesem Dienstprogramm Software ausführen, wird der Datenverkehr über die in der Konfiguration registrierte Proxy-Kette umgeleitet.
/etc/proxychains.conf
In unserem Fall ist dies eine Kette und das Schreiben ist nicht schwierig.
socks5 127.0.0.1 1080
und eine andere Krücke, die verwendet wurde, um VPN nicht zu konfigurieren (Sarkasmus), ist eine Möglichkeit, eine Python-Anwendung von PyCharm aus zu starten. Um die Anwendung in einem einfachen Fall über Proxy-Ketten auszuführen, schreiben Sie einfach die Datei proxychains app.py und fertig. Die IDE benötigt jedoch immer einen Interpreter. Es ist einfach, dies zu umgehen. Erstellen Sie eine neue "Ausführungskonfiguration" und wählen Sie ein Shell-Skript aus. und füllen Sie die Felder aus

Danach sieht der Start aus IDE-Sicht folgendermaßen aus: proxychains python3 app.py - genau das brauchen wir. Wenn wir also ein Projekt starten wollen, müssen wir nur das Skript auf dem Desktop ausführen und dann auf den "Play" -Button in ide klicken, um den Bot zu starten. Der Rest der Magie wird von Proxychains und ssh erledigt.
Schließlich wird der Bot geschrieben, getestet. Was weiter? Einerseits möchte ich mich erklären, andererseits denke ich, dass es für jemanden wirklich nützlich sein kann. Und hier stehen wir vor einem weiteren Telegrammproblem; Es gibt keinen einzigen Katalog von Channels und Bots. Es ist gut möglich, dass es einen ähnlichen Bot gibt, aber ich wiederhole, dass ich ihn nicht gefunden habe. Und irgendwo in der Straßenbahn sitzt und leidet ein Mann, der eine Nachricht im Kanal schön arrangieren will und alles mit Stiften macht.
Wenn Sie meinen Bot bereits ausgeführt haben, haben Sie festgestellt, dass ein Hashtag #Advertising vorhanden ist. Wie so - Du fragst. Und hier ging ich auf das Problem mit den Endbenutzern ein - viele veröffentlichen Anzeigen auf ihren Kanälen und gewöhnten sich schnell daran, Nachrichten mit dem Bot zu schreiben, und sie baten mich, sie hinzuzufügen. Sie mögen vielleicht keine Werbung, kämpfen dagegen, aber dies sind harte und notwendige Realitäten für die Benutzer.
Das Projekt ist gemeinnützig, also können Sie den Bot selbst @SGK_espace_bot nennen.
Und hier ist das Video, wie man es benutztFür konstruktive Kritik wäre ich dankbar.