كيفية تحويل الصورة الرمزية Telegram إلى ساعة

جلست مؤخرًا في مجتمع من المبرمجين في 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") #     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) 

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

صورة

Source: https://habr.com/ru/post/ar457078/


All Articles