Cómo convertir tu avatar de Telegram en un reloj

Recientemente me senté en una comunidad de programadores en Telegram y noté un perfil muy interesante. Lo siguiente fue curioso: en la foto principal representaba la hora actual. Estaba terriblemente interesado en cómo logró esto, y decidí a toda costa escribir el mismo programa.

imagen

Antes de eso, a menudo trabajaba con bots de Telegram usando la biblioteca PyTelegramBotAPI , por lo que sugerí que dicha función esté en la API de bot. Seguramente, esta fue una suposición tonta en mi vida, porque la foto estaba en la foto de perfil del usuario , no en el bot, y pronto me convencí de esto, al no encontrar ningún requisito previo para poder cambiar la foto de perfil.

Comencé a navegar por Internet y encontré una herramienta bastante conveniente: el teletón . Simplemente me permitió ingresar a Telegram como usuario , y no como bot. Bueno, supongo que fue el primer y más grande paso hacia la meta. A continuación, veamos cómo recrear el "reloj" en nuestra foto de perfil.

Primer paso Obtenga acceso al inicio de sesión de Telegram desde el código


Seguimos el enlace , ingresamos el número de teléfono, luego de lo cual obtenemos un código de confirmación. Lea más sobre esto aquí . Entonces, obtenemos dos cosas que son importantes para nosotros desde allí: api_id y api_hash. Creamos el archivo config.py e ingresamos el siguiente código allí:

api_id = < API_ID> api_hash = < API_HASH> 

Ahora cree el archivo main.py en el que escribimos:

 from telethon import TelegramClient, sync from .config import * 

Es importante que main.py y config.py estén en el mismo nivel de archivo, es decir en una carpeta, de lo contrario, la línea de .config import * dará un error. La clase TelegramClient es exactamente lo que nos permitirá iniciar sesión en Telegram como usuario habitual. Además en el mismo archivo escribimos lo siguiente:

 client = TelegramClient(< >, api_id, api_hash) client.start() 

Por lo tanto, podemos suponer que hemos iniciado sesión en Telegram. NOMBRE DE LA SESIÓN puede elegir cualquiera, a su discreción (por ejemplo, "piña" ). Entonces, estamos conectados al telegrama. Ahora es el momento de pensar en las fotos ...

Paso dos Crea una fuente de tiempo para fotos


Quizás este paso fue el más fácil para mí, porque He estado desarrollando varios programas que utilizan la visión por computadora durante mucho tiempo y, por lo tanto, trabajar con imágenes se ha convertido en algo común. Aquí todo es simple: instalamos la biblioteca opencv , que te permite hacer maravillas con fotos. Cree el archivo utils.py y escriba en él:

 def convert_time_to_string(dt): return f"{dt.hour}:{dt.minute:02}" 

Necesitamos esta función para que el tiempo en el formato H: MM se indique en la foto (había otras formas de hacerlo, pero preferí esta).

Entonces, comenzamos a crear las fotos ellos mismos. Creamos el archivo generate_time_images.py y escribimos en él:

 from .utils import * import cv2 import numpy as np from datetime import datetime, timedelta 

Estas bibliotecas deberían ser suficientes para que podamos crear fotos con sello de tiempo. A continuación, escribimos una función para obtener un fondo negro, en el que escribiremos la hora:

 def get_black_background(): return np.zeros((500, 500)) 

Ahora tendrá que pasar por el ciclo por cada minuto en días y generar una foto que indique la hora. Cree una carpeta time_images de antemano / donde guardará las fotos. Entonces, escribimos:

 start_time = datetime.strptime("2019-01-01", "%Y-%m-%d") #     end_time = start_time + timedelta(days=1) def generate_image_with_text(text): image = get_black_background() font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(image, text, (int(image.shape[0]*0.35), int(image.shape[1]*0.5)), font, 1.5, (255, 255, 0), 2, cv2.LINE_AA) return image while start_time < end_time: text = convert_time_to_string(start_time) image = generate_image_with_text(text) cv2.imwrite(f"time_images/{text}.jpg", image) start_time += timedelta(minutes=1) 

Para crear una colección de fotos, solo queda una cosa por hacer: ejecutar generate_time_images.py . Después de comenzar, vemos que aparecieron muchas fotos en la carpeta time_images / . Deberías obtener algo como estas fotos:

imagen

Paso tres Actualizando fotos cada minuto


Telethon tiene una cosa muy conveniente: llamada UploadProfilePhotoRequest . Lo importamos en nuestro main.py previamente escrito:

 from telethon.tl.functions.photos import UploadProfilePhotoRequest, DeletePhotosRequest from datetime import datetime from .utils import * 

Por supuesto, no debemos actualizar el avatar en ningún momento, solo hágalo una vez por minuto. Para hacer esto, debemos saber el momento en que termina el viejo minuto y comienza uno nuevo; es en este momento que cambiaremos la foto. Escribimos una pequeña función más en utils.py :

 def time_has_changed(prev_time): return convert_time_to_string(datetime.now()) != prev_time 

Sí, sí, le pasamos una cadena con el tiempo de la actualización anterior del avatar. Por supuesto, había otras formas de implementarlo, pero lo escribí todo a toda prisa, por lo que no pensé mucho en la optimización. Continuamos llenando nuestro 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)) 

Necesitamos DeletePhotosRequest para eliminar avatares anteriores, de modo que se cree el efecto de que no agreguemos una nueva foto: cambia por sí misma. Para no sobrecargar el procesador, puede agregar time.sleep (1) al final del ciclo (por supuesto, importando time.py primero).

Hecho Ejecute main.py y su avatar se convertirá en un reloj. Como una opción más original, puede intentar cambiar el texto de las fotos, por ejemplo, a esto:

imagen

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


All Articles