J'ai récemment siégé dans une communauté de programmeurs à
Telegram et j'ai remarqué un profil très intéressant. Ce qui suit était curieux - sur la photo principale, il représentait l'heure actuelle. J'étais terriblement intéressé par la façon dont il y était parvenu et j'ai décidé à tout prix d'écrire le même programme.
Avant cela, je travaillais souvent avec des bots Telegram en utilisant la bibliothèque
PyTelegramBotAPI , j'ai donc suggéré qu'une telle fonction se trouve dans l'API bot. Certes, c'était une hypothèse stupide dans ma vie, car la photo était sur la photo de profil de l'
utilisateur , pas sur le bot - et bientôt j'en suis devenu convaincu, ne trouvant aucune condition préalable pour pouvoir changer la photo de profil.
J'ai commencé à surfer sur Internet et suis tombé sur un outil plutôt pratique - le
téléthon . Il m'a juste permis d'entrer dans Telegram en tant
qu'utilisateur , et non en tant que bot. Eh bien, je suppose que c'était le tout premier et le plus grand pas vers l'objectif. Ensuite, regardons comment recréer «l'horloge» sur notre photo de profil.
Première étape. Accédez à la connexion Telegram à partir du code
Nous suivons le
lien , entrons le numéro de téléphone, après quoi nous obtenons un code de confirmation. En savoir plus à ce sujet
ici . Donc, nous obtenons deux choses qui sont importantes pour nous à partir de là - api_id et api_hash. Nous créons le
fichier config.py et y entrons le code suivant:
api_id = < API_ID> api_hash = < API_HASH>
Créez maintenant le fichier
main.py dans lequel nous écrivons:
from telethon import TelegramClient, sync from .config import *
Il est important que
main.py et
config.py soient au même niveau de fichier, c'est-à-dire dans un dossier sinon la ligne
de .config import * donnera une erreur. La classe
TelegramClient est exactement ce qui nous permettra de nous connecter à Telegram en tant qu'utilisateur régulier. Plus loin dans le même fichier, nous écrivons ce qui suit:
client = TelegramClient(< >, api_id, api_hash) client.start()
Ainsi, nous pouvons supposer que nous sommes connectés à Telegram.
NOM DE SESSION, vous pouvez en choisir à votre discrétion (par exemple,
"ananas" ). Donc, nous sommes connectés au télégramme. Il est maintenant temps de penser aux photos ...
Deuxième étape Créer une source de temps pour les photos
Cette étape a peut-être été la plus facile pour moi, car Je développe depuis longtemps divers logiciels qui utilisent
la vision par
ordinateur et, par conséquent, travailler avec des images est devenu quelque chose de banal. Tout est simple ici - nous installons la bibliothèque
opencv , qui vous permet de faire des merveilles avec des photos. Créez le fichier
utils.py et écrivez-le:
def convert_time_to_string(dt): return f"{dt.hour}:{dt.minute:02}"
Nous avons besoin de cette fonction pour que l'heure au format
H: MM soit indiquée sur la photo (il y avait d'autres façons de le faire, mais j'ai préféré celle-ci).
Nous commençons donc à créer les photos elles-mêmes. Nous créons le fichier
generate_time_images.py et écrivons dedans:
from .utils import * import cv2 import numpy as np from datetime import datetime, timedelta
Ces bibliothèques devraient nous suffire pour créer des photos horodatées. Ensuite, nous écrivons une fonction pour obtenir un fond noir, sur lequel nous écrirons l'heure:
def get_black_background(): return np.zeros((500, 500))
Maintenant, vous devrez parcourir le cycle pour chaque minute en jours et générer une photo indiquant l'heure. Créez un dossier
time_images à l'
avance / où vous allez enregistrer les photos. Nous écrivons donc:
start_time = datetime.strptime("2019-01-01", "%Y-%m-%d")
Pour créer une collection de photos, il n'y a qu'une seule chose à faire: exécutez
generate_time_images.py . Après le démarrage, nous voyons que beaucoup de photos sont apparues dans le dossier
time_images / . Vous devriez obtenir quelque chose comme ces photos:
Troisième étape Mise à jour des photos toutes les minutes
Le téléthon a une chose très pratique - appelée
UploadProfilePhotoRequest . Nous l'importons dans notre
main.py précédemment écrit:
from telethon.tl.functions.photos import UploadProfilePhotoRequest, DeletePhotosRequest from datetime import datetime from .utils import *
Bien sûr, nous ne devons pas mettre à jour l'avatar à tout moment - faites-le une fois par minute. Pour ce faire, nous devons connaître le moment où la vieille minute se termine et une nouvelle commence - c'est à ce moment que nous allons changer la photo. Nous écrivons une autre petite fonction dans
utils.py :
def time_has_changed(prev_time): return convert_time_to_string(datetime.now()) != prev_time
Oui, oui, on lui passe une chaîne avec l'heure de la précédente mise à jour de l'avatar. Bien sûr, il y avait d'autres façons de l'implémenter, mais j'ai tout écrit à la hâte, donc je n'ai pas beaucoup pensé à l'optimisation. Nous continuons à remplir notre
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))
Nous avons besoin de
DeletePhotosRequest pour supprimer les avatars précédents, afin que l'effet soit créé sans que nous ajoutions de nouvelle photo - elle change d'elle-même. Afin de ne pas surcharger le processeur, vous pouvez ajouter
time.sleep (1) à la fin de la boucle (bien sûr, importez
time.py en premier).
C'est fait! Exécutez
main.py et votre avatar se transformera en horloge. Comme option plus originale, vous pouvez essayer de changer le texte des photos, par exemple, en ceci: