如何将电报头像变成手表

我最近坐在Telegram的一个程序员社区中,注意到一个非常有趣的个人资料。 以下是很好奇-他在主照片中描绘了当前时间。 我对他如何实现这一目标非常感兴趣,因此我决定不惜一切代价编写同一程序。

图片

在此之前,我经常使用PyTelegramBotAPI库与Telegram机器人合作,因此我建议在bot API中使用此类功能。 当然,这是我一生中的愚蠢假设,因为 该照片位于用户的个人资料照片上,而不是在机器人上-很快我就确信了这一点,没有发现更改个人资料照片的任何先决条件。

我开始浏览Internet,并遇到了一个相当方便的工具Telethon 。 他只是允许我以用户身份而不是机器人身份进入Telegram。 好吧,我想这是朝着目标迈出的第一步,也是最大的一步。 接下来,让我们看看如何在个人资料图片上重新创建“时钟”。

第一步。 通过代码访问电报登录


我们点击链接 ,输入电话号码,然后我们获得确认码。 在此处阅读有关此内容的更多信息。 因此,从那里我们获得了对我们重要的两件事-api_id和api_hash。 我们创建config.py文件,并在其中输入以下代码:

api_id = < API_ID> api_hash = < API_HASH> 

现在创建我们编写的main.py文件:

 from telethon import TelegramClient, sync from .config import * 

重要的是main.pyconfig.py必须位于同一文件级别,即 在一个文件夹中,否则来自.config import *的行将给出错误。 TelegramClient类正是允许我们以常规用户身份登录Telegram的类。 在同一文件中,我们进一步编写了以下内容:

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

因此,我们可以假设我们已经登录到Telegram。 会话名称,您可以选择任意选择(例如“ pineapple” )。 因此,我们已连接到电报。 现在是时候考虑照片了...

第二步 为照片创建时间源


也许这对我来说是最简单的步骤,因为 长期以来,我一直在开发各种使用计算机视觉的软件,因此处理图像已变得司空见惯。 这里的一切都很简单-我们安装了opencv库,该库允许您使用照片处理奇观。 创建utils.py文件并写入:

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

我们需要此功能,以便在照片上显示H:MM格式的时间(还有其他方法可以执行此操作,但我更喜欢此方法)。

因此,我们开始自己创建照片。 我们创建generate_time_images.py文件并写入其中:

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

这些库足以让我们创建带有时间戳的照片。 接下来,我们编写一个函数以获取黑色背景,并在上面写时间:

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

现在,您将需要在几天之内每分钟进行一次循环,并生成一张指示时间的照片。 预先创建一个time_images文件夹,您将在其中保存照片。 因此,我们写:

 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) 

要创建照片集,只需要做一件事-运行generate_time_images.py 。 开始之后,我们看到很多照片出现在time_images /文件夹中。 您应该得到类似这些照片的东西:

图片

第三步 每分钟更新一次照片


Telethon有一个非常方便的东西,叫做UploadProfilePhotoRequest 。 我们将其导入先前编写的main.py中

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

当然,我们不应该随时更新头像-只需每分钟执行一次。 为此,我们必须知道旧分钟结束而新分钟开始的那一刻-在这一刻,我们将更换照片。 我们在utils.py中编写另一个小函数:

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

是的,是的,我们会在头像的上一次更新时向其传递一个字符串。 当然,还有其他方法可以实现它,但是我很着急地编写了所有代码,因此我对优化没有太多考虑。 我们继续填写我们的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)) 

我们需要DeletePhotosRequest才能删除以前的头像,以便创建效果而不添加新照片-它会自行更改。 为了不使处理器过载,您可以在循环末尾添加time.sleep(1) (当然,首先导入time.py )。

做完了! 运行main.py ,您的头像将变成一个时钟。 作为更原始的选择,您可以尝试将照片上的文字更改为例如:

图片

Source: https://habr.com/ru/post/zh-CN457078/


All Articles