Como transformar seu avatar do Telegram em um relógio

Recentemente, sentei-me em uma comunidade de programadores no Telegram e notei um perfil muito interessante. O seguinte foi curioso - na foto principal, ele descreveu o horário atual. Eu estava muito interessado em como ele conseguiu isso e decidi a todo custo escrever o mesmo programa.

imagem

Antes disso, eu costumava trabalhar com bots Telegram usando a biblioteca PyTelegramBotAPI , então sugeri que essa função estivesse na API bot. Certamente, essa foi uma suposição idiota na minha vida, porque a foto estava na foto do perfil do usuário , não no bot - e logo me convenci disso, sem encontrar nenhum pré-requisito para a capacidade de alterar a foto do perfil.

Comecei a navegar na Internet e me deparei com uma ferramenta bastante conveniente - o teleton . Ele apenas me permitiu entrar no Telegram como usuário , e não como bot. Bem, acho que foi o primeiro e maior passo em direção à meta. A seguir, vejamos como recriar o "relógio" na nossa foto de perfil.

Primeiro passo Obtenha acesso ao login do Telegram a partir do código


Seguimos o link , digite o número de telefone, após o qual obtemos um código de confirmação. Leia mais sobre isso aqui . Então, temos duas coisas que são importantes para nós a partir daí - api_id e api_hash. Crie o arquivo config.py e digite o seguinte código:

api_id = < API_ID> api_hash = < API_HASH> 

Agora crie o arquivo main.py no qual escrevemos:

 from telethon import TelegramClient, sync from .config import * 

É importante que main.py e config.py estejam no mesmo nível de arquivo, ou seja, em uma pasta, caso contrário, a linha de .config import * apresentará um erro. A classe TelegramClient é exatamente o que nos permitirá fazer logon no Telegram como um usuário comum. Ainda no mesmo arquivo, escrevemos o seguinte:

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

Assim, podemos assumir que estamos logados no Telegram. NOME DA SESSÃO, você pode escolher qualquer um, a seu critério (por exemplo, "abacaxi" ). Então, estamos conectados ao telegrama. Agora é hora de pensar nas fotos ...

Etapa dois Crie uma fonte de tempo para fotos


Talvez esse passo tenha sido o mais fácil para mim, porque Desenvolvo vários softwares que usam a visão computacional há muito tempo e, portanto, trabalhar com imagens tornou-se algo comum. Tudo é simples aqui - instalamos a biblioteca opencv , que permite trabalhar maravilhas com fotos. Crie o arquivo utils.py e escreva nele:

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

Precisamos dessa função para que o horário no formato H: MM seja indicado na foto (havia outras maneiras de fazer isso, mas eu preferi essa).

Então, começamos a criar as próprias fotos. Criamos o arquivo generate_time_images.py e o escrevemos:

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

Essas bibliotecas devem ser suficientes para criarmos fotos com registro de data e hora. Em seguida, escrevemos uma função para obter um fundo preto, no qual escreveremos o tempo:

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

Agora você precisará percorrer o ciclo a cada minuto em dias e gerar uma foto indicando a hora. Crie uma pasta time_images com antecedência / onde você salvará as fotos. Então, escrevemos:

 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 criar uma coleção de fotos, só há uma coisa a fazer - execute generate_time_images.py . Após o início, vemos que muitas fotos apareceram na pasta time_images / . Você deve obter algo como estas fotos:

imagem

Etapa três Atualizando fotos a cada minuto


Telethon tem uma coisa muito conveniente - chamada UploadProfilePhotoRequest . Nós o importamos para o nosso main.py escrito anteriormente:

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

Obviamente, não devemos atualizar o avatar a qualquer momento - basta fazê-lo uma vez por minuto. Para fazer isso, precisamos saber o momento em que o velho minuto termina e um novo começa - é nesse momento que mudaremos a foto. Escrevemos mais uma pequena função no utils.py :

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

Sim, sim, passamos uma string para ele com o tempo da atualização anterior do avatar. Obviamente, havia outras maneiras de implementá-lo, mas escrevi tudo com pressa, por isso não pensei muito em otimização. Continuamos a preencher nosso 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)) 

Precisamos do DeletePhotosRequest para excluir os avatares anteriores, para que o efeito seja criado e não adicionemos uma nova foto - ela muda por si só. Para não sobrecarregar o processador, você pode adicionar time.sleep (1) ao final do loop (é claro, importando o time.py primeiro).

Feito! Execute main.py e seu avatar se transformará em um relógio. Como uma opção mais original, você pode tentar alterar o texto nas fotos, por exemplo, para isso:

imagem

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


All Articles