جلست مؤخرًا في مجتمع من المبرمجين في 
Telegram ولاحظت ملفًا شخصيًا ممتعًا للغاية. التالي كان فضولياً - في الصورة الرئيسية قام بتصوير الوقت الحالي. كنت مهتمًا جدًا بكيفية تحقيق ذلك ، وقررت بأي ثمن كتابة نفس البرنامج.
قبل ذلك ، كنت أعمل كثيرًا مع برامج Telegram باستخدام مكتبة 
PyTelegramBotAPI ، لذلك اقترحت أن تكون هذه الوظيفة في واجهة برمجة تطبيقات bot. بالتأكيد ، كان هذا افتراضًا غبيًا في حياتي ، لأنه كانت الصورة على صورة الملف الشخصي 
للمستخدم ، وليس الروبوت - وسرعان ما أصبحت مقتنعا بذلك ، ولم أجد أي متطلبات مسبقة للقدرة على تغيير صورة الملف الشخصي.
بدأت أتصفح الإنترنت 
وشاهدت أداة ملائمة - 
telethon . لقد سمح لي فقط بالدخول إلى Telegram 
كمستخدم ، وليس كبوت. حسنًا ، أعتقد أنها كانت أول وأكبر خطوة نحو الهدف. بعد ذلك ، دعونا نلقي نظرة على كيفية إعادة إنشاء "الساعة" على صورة ملفنا الشخصي.
الخطوة الأولى الحصول على تسجيل الدخول 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. 
اسم الجلسة يمكنك اختيار أي ، حسب تقديرك (على سبيل المثال ، 
"الأناناس" ). لذلك ، نحن متصلون برقية. الآن حان الوقت للتفكير في الصور ...
الخطوة الثانية إنشاء مصدر وقت للصور
ربما كانت هذه الخطوة أسهل بالنسبة لي ، لأنه لقد قمت بتطوير العديد من البرامج التي تستخدم 
رؤية الكمبيوتر لفترة طويلة ، وبالتالي أصبح العمل مع الصور أمرًا شائعًا. كل شيء بسيط هنا - نقوم بتثبيت مكتبة 
opencv ، والتي تتيح لك العمل مع العجائب مع الصور. قم 
بإنشاء ملف 
utils.py واكتب فيه:
 def convert_time_to_string(dt): return f"{dt.hour}:{dt.minute:02}" 
نحن بحاجة إلى هذه الوظيفة بحيث يتم الإشارة إلى الوقت بالتنسيق 
H: MM على الصورة (كانت هناك طرق أخرى للقيام بذلك ، لكنني فضلت هذا واحد).
لذلك ، نبدأ في إنشاء الصور بأنفسهم. نقوم بإنشاء ملف 
gener_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")  
لإنشاء مجموعة من الصور ، لا يوجد سوى شيء واحد متبقي - تشغيل 
gener_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 وسوف تتحول الصورة الرمزية الخاصة بك إلى ساعة. كخيار أكثر الأصلي ، يمكنك محاولة تغيير النص على الصور ، على سبيل المثال ، إلى هذا: