Ich habe kürzlich in einer Community von Programmierern in
Telegram gesessen und ein sehr interessantes Profil festgestellt. Das Folgende war merkwürdig - auf dem Hauptfoto zeigte er die aktuelle Zeit. Ich war schrecklich interessiert daran, wie er dies erreicht hat, und ich habe mich um jeden Preis entschieden, dasselbe Programm zu schreiben.
Vorher habe ich oft mit Telegramm-Bots unter Verwendung der
PyTelegramBotAPI- Bibliothek gearbeitet, daher habe ich vorgeschlagen, dass eine solche Funktion in der Bot-API enthalten ist. Sicherlich war dies eine dumme Annahme in meinem Leben, weil Das Foto befand sich auf dem Profilbild des
Benutzers , nicht des Bots - und bald war ich davon überzeugt und fand keine Voraussetzungen für die Möglichkeit, das Profilfoto zu ändern.
Ich begann im Internet zu surfen und stieß auf ein ziemlich praktisches Tool -
Telethon . Er erlaubte mir nur, Telegram als
Benutzer und nicht als Bot einzugeben. Nun, ich denke, es war der allererste und größte Schritt in Richtung Ziel. Schauen wir uns als nächstes an, wie Sie die „Uhr“ in unserem Profilbild neu erstellen.
Erster Schritt. Erhalten Sie Zugriff auf die Telegramm-Anmeldung über den Code
Wir folgen dem
Link , geben die Telefonnummer ein und erhalten einen Bestätigungscode. Lesen Sie hier mehr darüber. Von dort erhalten wir also zwei Dinge, die uns wichtig sind - api_id und api_hash. Wir erstellen die
Datei config.py und geben dort den folgenden Code ein:
api_id = < API_ID> api_hash = < API_HASH>
Erstellen Sie nun die Datei
main.py , in die wir schreiben:
from telethon import TelegramClient, sync from .config import *
Es ist wichtig, dass sich
main.py und
config.py auf derselben Dateiebene befinden, d. H. in einem Ordner, andernfalls gibt die Zeile
von .config import * einen Fehler aus. Die
TelegramClient- Klasse ermöglicht es uns, uns als regulärer Benutzer bei Telegram anzumelden. Weiter schreiben wir in die gleiche Datei folgendes:
client = TelegramClient(< >, api_id, api_hash) client.start()
Daher können wir davon ausgehen, dass wir bei Telegram angemeldet sind.
SITZUNGSNAME Sie können nach eigenem Ermessen eine beliebige auswählen (z. B.
"Ananas" ). Wir sind also mit dem Telegramm verbunden. Jetzt ist es Zeit, über die Fotos nachzudenken ...
Schritt zwei Erstellen Sie eine Zeitquelle für Fotos
Vielleicht war dieser Schritt für mich der einfachste, weil Ich habe lange Zeit verschiedene Software entwickelt, die
Computer Vision verwendet, und daher ist die Arbeit mit Bildern etwas Alltägliches geworden. Hier ist alles einfach - wir installieren die
opencv- Bibliothek, mit der Sie mit Fotos Wunder wirken können. Erstellen Sie die Datei
utils.py und schreiben Sie sie ein:
def convert_time_to_string(dt): return f"{dt.hour}:{dt.minute:02}"
Wir benötigen diese Funktion, damit die Zeit im Format
H: MM auf dem Foto angezeigt wird (es gab andere Möglichkeiten, dies zu tun, aber ich habe diese bevorzugt).
Also fangen wir an, die Fotos selbst zu erstellen. Wir erstellen die Datei
generate_time_images.py und schreiben hinein:
from .utils import * import cv2 import numpy as np from datetime import datetime, timedelta
Diese Bibliotheken sollten ausreichen, um Fotos mit Zeitstempel zu erstellen. Als nächstes schreiben wir eine Funktion, um einen schwarzen Hintergrund zu erhalten, auf den wir die Zeit schreiben werden:
def get_black_background(): return np.zeros((500, 500))
Jetzt müssen Sie den Zyklus jede Minute in Tagen durchlaufen und ein Foto mit der Uhrzeit erstellen. Erstellen
Sie im
Voraus einen Ordner
time_images, in dem Sie die Fotos speichern. Also schreiben wir:
start_time = datetime.strptime("2019-01-01", "%Y-%m-%d")
Um eine Sammlung von Fotos zu erstellen, müssen Sie nur noch etwas ausführen:
generate_time_images.py ausführen. Nach dem Start sehen wir, dass viele Fotos im Ordner
time_images / erschienen sind . Sie sollten so etwas wie diese Fotos bekommen:
Schritt drei Fotos jede Minute aktualisieren
Telethon hat eine sehr praktische Sache -
UploadProfilePhotoRequest . Wir importieren es in unsere zuvor geschriebene
main.py :
from telethon.tl.functions.photos import UploadProfilePhotoRequest, DeletePhotosRequest from datetime import datetime from .utils import *
Natürlich sollten wir den Avatar zu keinem Zeitpunkt aktualisieren - machen Sie es einfach einmal pro Minute. Dazu müssen wir den Moment kennen, in dem die alte Minute endet und eine neue beginnt - in diesem Moment werden wir das Foto ändern. Wir schreiben noch eine kleine Funktion in
utils.py :
def time_has_changed(prev_time): return convert_time_to_string(datetime.now()) != prev_time
Ja, ja, wir übergeben eine Zeichenfolge mit dem Zeitpunkt der vorherigen Aktualisierung des Avatars. Natürlich gab es auch andere Möglichkeiten, es zu implementieren, aber ich habe alles in Eile geschrieben, sodass ich nicht viel über Optimierung nachdachte. Wir füllen weiterhin unsere
main.py :
prev_update_time = "" while True: if time_has_changed(prev_update_time): prev_update_time = convert_time_to_string(datetime.now()) client(DeletePhotosRequest(client.get_profile_photos('me'))) file = client.upload_file(f"time_images/{prev_update_time}.jpg") client(UploadProfilePhotoRequest(file))
Wir benötigen
DeletePhotosRequest , um frühere Avatare zu löschen, damit der Effekt entsteht, dass wir kein neues Foto hinzufügen - es ändert sich von selbst. Um den Prozessor nicht zu überlasten, können Sie
time.sleep (1) am Ende der Schleife hinzufügen
( natürlich zuerst
time.py importieren).
Fertig!
Wenn Sie
main.py ausführen, wird Ihr Avatar zu einer Uhr. Als originellere Option können Sie versuchen, den Text auf den Fotos folgendermaßen zu ändern: