Comments 76
<фото про буханку хлеба и троллейбус.png>
Хорошо, что вы не каждую секунду обновляетесь, а то пришлось бы вам отдельно указывать, на каких файловых системах можно это запускать.
(Подсказка: не влезло бы в fat32, были бы проблемы у ext2/3, про ntfs не помню).
Иными словами, почему бы не создавать изображение на лету? И да, статья о том, как получить id пользовательской сессии в телеграмме only.
Первый пришедший в голову пример — логи, прекрасно пишутся и читаются чаще, чем раз в секунду на всех этих фс.
Создавать изображения на лету — идея неплохая, но их все равно пришлось бы сохранять как файл, чтобы потом передать в метод TelegramClient.upload_file, именно поэтому решил сделать специальную папку с фотографиями. Вероятнее всего, должен быть метод, который принимает массив байтов вместо названия файла для размещения медиа, однако я писал все это больше ради забавы, посему об оптимизации особо не задумывался.
Почти наверняка upload_file умеет работать с потоком байтов в памяти Пайтона. Очень многие функции позволяют работать с BytesIO напрямую или через минимальную конвертацию данных
- Можно сделать раздел в RAMFS.
- Можно сделать в обычной файловой системе пайп, куда питоновский скрипт будет выводить байты картинки.
- Можно, наверно, не имя файла передавать, а открытый и доступный для чтения поток, следовательно можно было обойтись потоком `io.BytesIO`.
- А ещё нет никакого смысла хранить тысячи файлов, если рендер на лету такой картинки сопоставим по времени с загрузкой её с диска.
- Можно даже сделать виртуальную файловую систему, которая на запрос открытия любого файла будет генерить на лету и возвращать картинку с нарисованным именем этого файла и в запрошенном формате.
О сколько странных извращений даёт нам Python совершать.
Но это реально уже мелочи :)
- 00...23
- Статическую ":"
- 00...59
После чего склеивать их в:
hours[hour] + colon + minutes[minute]
И накладывать на базовое изображение.
Тогда картинок в кеше понадобится только 24 + 60 + 1 = 85
А не проще взять моноширинный шрифт и использовать "0".."9" и ":" — 11 картинок?
Почему бы для этих целей не заливать файлы в Сохранённые сообщения и сохранять id файлов в конфиг файле или БД?
github.com/plaksivayatryapka/telegram_avatar/blob/master/change_avatar.py
Подскажите, а это можно сделать только на аву юзера или можно сделать на канал и сообщество?
generate_image_with_text(text)
Правильно
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
хорошо, с библиотеками разобрались, выдает такую ошибку:
ModuleNotFoundError: No module named 'main.utils'; 'main' is not a package
Python 3.7.3
установлены 3 библиотеки: telthon, opencv, utils
можно же как то сделать типа такого:
utils.py:
def convert_time_to_string(dt):
return f"{dt.hour}:{dt.minute:02}"
def time_has_changed(prev_time):
return convert_time_to_string(datetime.now()) != prev_time
generate_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)
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)
и так все 3 файла чтобы не собирать по всему посту )
меня вот это смущает from .utils import * а именно звездочка, что она означает?
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 1, in from .utils import *
ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package
Process finished with exit code 1
Traceback (most recent call last):
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 21, in image = generate_image_with_text(text)
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 14, in generate_image_with_text
image = get_black_background()
File «C:/Users/Public/Downloads/clock/generate_time_images.py», line 11, in get_black_background
return np.zeros(500, 500)
TypeError: data type not understood
Process finished with exit code 1
Это (255, 255, 0) не RGB я так понял? Потому что изменения дают мне лишь оттенки серого
В инете написано нужен кортеж для RGB и просто скалярные значения для серого. Попытался даже явно указать tuple((155, 100, 255)) и все равно получил только серые тона
Точнее нашел немного обходной путь.
Посколько мы создаем черный фон вручную, то он получается в градациях серого. Поэтому и текст можно наносить только в черно-белых тонах. Как тут указать, что созданный фон в цветной шкале я не понял.
Поэтому чтобы этого избежать я просто сам нарисовал черный фон и загрузил его указав в параметре, что это цветное изображение
image = cv2.imread('Black_background.jpg', 1)
github.com/aforizm/avatar-change-time
from telethon import TelegramClient, sync
from config import *
client = TelegramClient(vkoncekoncov, api_id, api_hash)
client.start()
from telethon.tl.functions.photos import UploadProfilePhotoRequest, DeletePhotosRequest
from datetime import datetime
from utils import *
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))
Ошибки:
Traceback (most recent call last):
File «main.py», line 3, in from config import *
File "/Users/IlyaMacBook/Desktop/Code/Telegram/config.py", line 3
api_hash = 6156023a483094eb16484ebd781672e3
^
SyntaxError: invalid syntax
Как превратить свою аватарку в Telegram в часы