Задать вопрос
Ответы пользователя по тегу Python
  • Как получить фото в aiogram и отправить пользователю нужное ему фото?

    @GofMan33333
    Чтобы получить фото в aiogram, вам нужно использовать метод Message.photo у сообщения, которое пришло от пользователя. Он вернет список фотографий, которые были отправлены сообщением. Каждая фотография - это объект PhotoSize. Вот пример кода, который получает фото из сообщения:

    @dp.message_handler(content_types=ContentType.PHOTO)
    async def process_photo(message: types.Message):
        # Получаем список фотографий в сообщении
        photos = message.photo
    
        # Перебираем фотографии и обрабатываем их
        for photo in photos:
            # Скачиваем фотографию
            await photo.download()
            # Обрабатываем фотографию (например, сохраняем ее в базу данных)
            process_photo(photo.file)

    Чтобы отправить фото пользователю, вы можете использовать метод bot.send_photo. Он принимает идентификатор чата (куда отправлять фото) и фотографию (в виде InputFile или str)
    Ответ написан
    Комментировать
  • Почему функция возвращает None?

    @GofMan33333
    Функция longest_substring никогда не возвращает результат в том случае, когда substring_len уменьшается. Вам нужно добавить финальный return в конце функции, чтобы вернуть результат в этом случае. Например:

    def longest_substring(string, substring_len):
        for i in range(len(a) - substring_len + 1):
            substring = list(a[i:i + substring_len])
            if sorted(substring) == sorted(set(substring)):
                return substring
    
        return longest_substring(string, substring_len - 1)
    Ответ написан
    Комментировать
  • Как правильно создать глобальный контейнер?

    @GofMan33333
    Вы можете создать класс, который будет хранить состояние ресурсов и предоставлять к нему доступ через свойства или методы. Вам может потребоваться реализовать синглтон-паттерн, чтобы обеспечить, что экземпляр этого класса существует только в одном экземпляре на всем протяжении существования приложения. Также вам может потребоваться защитить состояние ресурсов от неправильного использования, реализовав некоторые методы для доступа к ресурсам.

    В качестве примера:

    from threading import Lock
    
    class ResourceContainer:
        _instance = None
        _lock = Lock()
    
        def __new__(cls):
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
            return cls._instance
    
        def __init__(self):
            self._db_connection = None
            self._message_broker_connection = None
            self._config = {}
    
        def get_db_connection(self):
            return self._db_connection
    
        def set_db_connection(self, connection):
            self._db_connection = connection
    
        def get_message_broker_connection(self):
            return self._message_broker_connection
    
        def set_message_broker_connection(self, connection):
            self._message_broker_connection = connection
    
        def get_config(self):
            return self._config
    
        def set_config(self, config):
            self._config = config


    В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

    Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

    def foo():
        container = ResourceContainer()
        db_conn = container.get_db_connection()
        # use db_conn
    
    def bar():
        container = ResourceContainer()
        config = container.get_config()
        # use config


    Обратите внимание, что каждый раз при вызове ResourceContainer() будет возвращаться один и тот же экземпляр, таким образом состояние ресурсов будет сохраняться на всем протяжении существования приложения.
    Ответ написан
    Комментировать
  • Не работает код aiogram3?

    @GofMan33333
    Чтобы принять данные, которые присылает Телеграм на яндекс клауд функцию через вебхук, вам нужно сделать следующее:

    Убедитесь, что у вас уже настроен вебхук для бота в Телеграме. Для этого вызовите метод setWebhook у бота с URL, который указывает на яндекс клауд функцию.

    В функции index.handler вам нужно извлечь данные из запроса (event), который приходит в яндекс клауд функцию. В частности, вам нужно извлечь тело запроса (event['body']) и декодировать его из JSON формата. Получившийся объект может быть преобразован в тип Update с помощью конструктора aiogram.types.Update.

    После того, как вы создадите экземпляр Update, вы можете обработать его с помощью Dispatcher. Для этого вызовите метод feed_update у объекта Dispatcher (dp).

    Наконец, не забудьте вернуть HTTP ответ
    Ответ написан
    1 комментарий
  • Requests дает ошибку Cannot create a client socket with a PROTOCOL_TLS_SERVER context (_ssl.c:801)?

    @GofMan33333
    Ошибка "Cannot create a client socket with a PROTOCOL_TLS_SERVER context" означает, что вы пытаетесь создать сокет клиента с использованием контекста TLS сервера. Это может происходить, когда вы используете неправильное имя сертификата сервера или указываете неправильный путь к файлу сертификата.

    Проверьте, что вы используете правильное имя сертификата сервера и правильный путь к файлу сертификата. Если это не помогает, попробуйте обновить библиотеку requests и убедитесь, что у вас установлен последний версия openssl.
    Ответ написан