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.
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")
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:
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: