我最近坐在
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.py和
config.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")
要创建照片集,只需要做一件事-运行
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 ,您的头像将变成一个时钟。 作为更原始的选择,您可以尝试将照片上的文字更改为例如: