Ответы пользователя по тегу Python
  • Как получить какой-нибудь хеш от значения переменной (dict)?

    metalexs
    @metalexs
    Для того чтобы получить хеш-значение от словаря (dict), вы можете использовать hashlib из стандартной библиотеки Python. Один из популярных и безопасных алгоритмов хеширования — это SHA-256.

    Сначала, нужно сериализовать словарь в строковое представление (например, в формат JSON), а затем получить хеш этой строки.
    import hashlib
    import json
    
    def dict_hash(d):
        serialized_data = json.dumps(d, sort_keys=True).encode()
        return hashlib.sha256(serialized_data).hexdigest()
    
    d1 = {"a": 1}
    d2 = {"a": 1}
    
    hash1 = dict_hash(d1)
    hash2 = dict_hash(d2)
    
    print(hash1 == hash2)  # Вернет True, потому что содержимое словарей идентично

    Этот метод позволяет получить уникальное строковое представление для каждого уникального словаря. По сути, вы можете сохранить это значение хеша и проверять его через 10 минут. Если хеши совпадают, то содержимое словарей также совпадает.

    Обратите внимание, что в этом методе используется sort_keys=True при сериализации в JSON. Это делается для гарантии того, что порядок ключей в словаре не влияет на результат хеширования. Если порядок ключей может изменяться, но при этом словари остаются идентичными, то без сортировки ключей у вас могут получаться разные хеш-значения для идентичных словарей.
    Ответ написан
  • Не могу понять почему выводит ошибка use_context если я его уже прописал?

    metalexs
    @metalexs
    Ошибки, которые вы получаете, могут быть связаны с тем, что ваша версия библиотеки python-telegram-bot устарела или, наоборот, слишком новая по отношению к коду, который вы используете.

    В более новых версиях python-telegram-bot, параметр use_context является обязательным и уже не нуждается в явном указании, так как по умолчанию use_context=True. Следовательно, если вы используете более новую версию, вам не нужно передавать use_context=True при создании объекта Updater.

    Касательно ошибки с update_queue, этот параметр больше не используется в конструкторе Updater в более новых версиях библиотеки. Опять же, если у вас новая версия, вам не нужно явно указывать update_queue.

    Попробуйте следующее:

    Удалите параметры use_context и update_queue:
    updater = Updater("Token")

    Если это не работает, проверьте версию библиотеки, которую вы используете:
    pip show python-telegram-bot

    Если версия ниже 12.0, обновите библиотеку:
    pip install python-telegram-bot --upgrade

    Также, убедитесь, что у вас правильно настроены обработчики, и они соответствуют версии библиотеки. Например, в новых версиях filters.text и filters.command должны быть вызваны как методы:
    dp.add_handler(MessageHandler(Filters.text() & ~Filters.command, answer_questions))


    Если после всех этих шагов у вас по-прежнему возникают проблемы, вам нужно будет проверить, соответствует ли ваш код версии библиотеки python-telegram-bot, которую вы используете, и возможно, обновить ваш код.
    Ответ написан
  • Как через Telethon переслать сообщение от отправителя в группу?

    metalexs
    @metalexs
    В Telethon есть метод forward_messages, который позволяет пересылать сообщения так, чтобы было видно, от кого они пришли. Основной синтаксис таков:
    await client.forward_messages(entity, messages, from_peer)

    • entity - куда вы хотите переслать сообщение (например, ID чата или группы)
    • messages - сообщения, которые вы хотите переслать (например, ID сообщения)
    • from_peer - откуда пересылать сообщение (необязательный параметр)

    Ваш пример уже содержит вызов этого метода, но кажется, что forward_to является списком. Попробуйте перебрать каждый чат в списке и переслать сообщение отдельно:

    async def handler(event: NewMessage.Event):
        phone = get_session_name(event.client)
        with DB() as db:
            autoresponder_message = db.get_autoresponder_text(phone)
        try:
            await event.reply(autoresponder_message)
            for chat in forward_to:
                print(chat)
                await event.client.forward_messages(chat, event.message)
        except Exception as e:
            logger.info(f"Ошибка при автоответчике: {e}")
        logger.info(f"Аккаунт {phone} получил сообщение в лс")

    Обратите внимание, что я изменил event.client.forward_messages(forward_to, event.message) на await event.client.forward_messages(chat, event.message), так как forward_messages должен быть вызван для каждого чата отдельно. Кроме того, я добавил {e} к строке логирования ошибки, чтобы было видно детали ошибки.
    Ответ написан
    Комментировать