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.
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")
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:
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: