Cara mengubah avatar Telegram Anda menjadi arloji

Saya baru-baru ini duduk di komunitas programmer di Telegram dan melihat satu profil yang sangat menarik. Berikut ini adalah rasa ingin tahu - di foto utama ia menggambarkan waktu saat ini. Saya sangat tertarik pada bagaimana dia mencapai ini, dan saya memutuskan untuk menulis program yang sama dengan segala cara.

gambar

Sebelum itu, saya sering bekerja dengan bot Telegram menggunakan pustaka PyTelegramBotAPI , jadi saya menyarankan agar fungsi seperti itu ada di bot API. Tentunya, ini adalah asumsi bodoh dalam hidup saya, karena foto ada di gambar profil pengguna , bukan bot - dan segera saya menjadi yakin akan hal ini, tidak menemukan prasyarat untuk kemampuan mengubah foto profil.

Saya mulai berselancar di Internet dan menemukan alat yang lebih praktis - telethon . Dia hanya mengizinkan saya untuk memasukkan Telegram sebagai pengguna , dan bukan sebagai bot. Yah, saya kira itu adalah langkah pertama dan terbesar menuju tujuan. Selanjutnya, mari kita lihat cara membuat ulang "jam" pada gambar profil kami.

Langkah pertama. Dapatkan akses ke login Telegram dari kode


Kami mengikuti tautan , memasukkan nomor telepon, dan setelah itu kami mendapatkan kode konfirmasi. Baca lebih lanjut tentang ini di sini . Jadi, kita mendapatkan dua hal yang penting bagi kita dari sana - api_id dan api_hash. Kami membuat file config.py dan memasukkan kode berikut di sana:

api_id = < API_ID> api_hash = < API_HASH> 

Sekarang buat file main.py di mana kita menulis:

 from telethon import TelegramClient, sync from .config import * 

Adalah penting bahwa main.py dan config.py berada pada tingkat file yang sama, yaitu dalam satu folder, jika tidak, baris dari .config import * akan memberikan kesalahan. Kelas TelegramClient adalah apa yang memungkinkan kita untuk masuk ke Telegram sebagai pengguna biasa. Selanjutnya dalam file yang sama kami menulis yang berikut:

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

Dengan demikian, kita dapat berasumsi bahwa kita masuk ke Telegram. NAMA SESI Anda dapat memilih apa pun, sesuai kebijakan Anda (misalnya, "nanas" ). Jadi, kita terhubung dengan telegram. Sekarang saatnya berpikir tentang foto-foto ...

Langkah Dua Buat sumber waktu untuk foto


Mungkin langkah ini yang paling mudah bagi saya, karena Saya telah mengembangkan berbagai perangkat lunak yang menggunakan visi komputer untuk waktu yang lama, dan karenanya, bekerja dengan gambar telah menjadi sesuatu yang lumrah. Semuanya sederhana di sini - kami memasang perpustakaan OpenCV , yang memungkinkan Anda untuk melakukan keajaiban dengan foto. Buat file utils.py dan tulis di dalamnya:

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

Kami membutuhkan fungsi ini sehingga waktu dalam format H: MM ditunjukkan pada foto (ada cara lain untuk melakukan ini, tapi saya lebih suka yang ini).

Jadi, kami mulai membuat foto sendiri. Kami membuat file generate_time_images.py dan menulis di dalamnya:

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

Pustaka-pustaka ini seharusnya cukup bagi kita untuk membuat foto yang bertanda waktu. Selanjutnya, kita menulis fungsi untuk mendapatkan latar belakang hitam, di mana kita akan menulis waktu:

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

Sekarang Anda harus melalui siklus untuk setiap menit dalam beberapa hari dan menghasilkan foto yang menunjukkan waktu. Buat folder time_images terlebih dahulu / di mana Anda akan menyimpan foto. Jadi, kami menulis:

 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) 

Untuk membuat koleksi foto, hanya ada satu hal yang harus dilakukan - jalankan generate_time_images.py . Setelah memulai, kami melihat bahwa banyak foto muncul di folder time_images / . Anda harus mendapatkan sesuatu seperti foto-foto ini:

gambar

Langkah Tiga Memperbarui foto setiap menit


Telethon memiliki hal yang sangat mudah - disebut UploadProfilePhotoRequest . Kami mengimpornya ke main.py kami yang sebelumnya ditulis:

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

Tentu saja, kita tidak boleh memperbarui avatar kapan saja - lakukan saja satu menit sekali. Untuk melakukan ini, kita harus tahu saat kapan menit yang lama berakhir dan yang baru dimulai - pada saat inilah kita akan mengubah foto. Kami menulis satu lagi fungsi kecil di utils.py :

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

Ya, ya, kami meneruskan string ke sana dengan waktu pembaruan avatar sebelumnya. Tentu saja, ada cara lain untuk mengimplementasikannya, tapi saya menulis semuanya dengan tergesa-gesa, jadi saya tidak terlalu memikirkan optimasi. Kami terus mengisi main.py kami:

 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)) 

Kita perlu DeletePhotosRequest untuk menghapus avatar sebelumnya, sehingga efek dibuat sehingga kita tidak menambahkan foto baru - itu berubah dengan sendirinya. Agar tidak kelebihan prosesor, Anda dapat menambahkan time.sleep (1) ke akhir loop (tentu saja, mengimpor time.py terlebih dahulu).

Selesai! Jalankan main.py dan avatar Anda akan berubah menjadi jam. Sebagai opsi yang lebih orisinal, Anda dapat mencoba mengubah teks pada foto, misalnya, menjadi ini:

gambar

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


All Articles