جلست مؤخرًا في مجتمع من المبرمجين في
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 وسوف تتحول الصورة الرمزية الخاصة بك إلى ساعة. كخيار أكثر الأصلي ، يمكنك محاولة تغيير النص على الصور ، على سبيل المثال ، إلى هذا: