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