Задать вопрос
Ответы пользователя по тегу Python
  • Python как через psycopg2 подключиться к PostgreSQL в Doker?

    @twistfire92
    Python backend developer
    Хост базы данных у вас не 127.0.0.1, а db_auth, раз вы все в compose разворачиваете. Попробуйте поменять в конфигах
    Ответ написан
  • Не работают кнопки в тг боте на python как починить?

    @twistfire92
    Python backend developer
    При любом событии (новое сообщение, нажатие на кнопку и пр.) бот проходит по всем хендлерам и смотрит какой хендлер удовлетворяет условиям. После того, как найден нужный - выполняет описанную в нем функцию.

    А теперь смотрим:
    1. Пользователь жмет кнопку
    2. Побежали по нашим хендлерам. Видим первый с
    @bot.callback_query_handler(func=lambda call: True)

    что значит "при нажатии на ЛЮБУЮ inline кнопку"
    3. Выполняем функцию которая в этом хендлере описана
    4. Ожидаем новых событий.

    В вашем случае на 3-м шаге выполнится функция list (кстати очень неудачное название, это зарезервированное имя, его лучше не использовать, почитайте про это)
    если уберете ее, выполнится game_processing

    Что делать?
    вариант 1 - как подсказали в комментариях, делать однин хендлер и внутри описывать все сценарии
    if call.data == 'users':
        ...
    elif call.data == 'go_play':
        ....
    elif call.data == 'go_play_next':
        ...


    Вариант 2 (более правильный) - отфильтровывать call.data в хендлерах. Сейчас там лежит func=lambda call: True, т.е. функция, возвращающая ВСЕГДА True. нужно как-то ее видоизменить, чтобы возвращалось True только при необходимых значениях call.data. Например func=lambda call: call.data=="foo" отработает только тогда, когда в call.data будет значение "foo".

    Дальше сами
    Ответ написан
    Комментировать
  • Запросы от 2 Flask приложений к 1 БД: почему второе приложение не получает новые данные и выпадает с ошибкой?

    @twistfire92
    Python backend developer
    Попробуйте сессию инициализировать в обработчике роутера через отдельный метод (еще лучше использовать DI)
    что-то типа такого:
    def get_session():
        with Session() as session:
            yield session
            session.commit()
            session.close()


    и уже в обработчике роута вызывать
    session = get_session()
    calls_data = session.query(Calls).order_by(Calls.id.desc()).all()
    return render_template("calls_default.html", calls_data=calls_data)
    Ответ написан
  • Меню многоуровневое тг бота telebot почему не работает?

    @twistfire92
    Python backend developer
    Все у вас работает.
    Возможно вы тестировали работу только первой кнопки в меню СНИЛС. В ней ошибка. Сама кнопка содержит сообщение "Кто может получить СНИЛС?", а в функции SNILS проверка на строку "Кто может получить?".

    Чтобы избежать таких ошибок, советую либо использовать константы, где будут содержаться значения кнопок, либо использовать Inline клавиатуру. Она даст больше маневров для построения многоуровнего меню.
    Ответ написан
    Комментировать
  • Как сделать кнопку назад в телебот пайтон?

    @twistfire92
    Python backend developer
    1. вынести создание клавиатуры главного меню в отдельную функцию
    2. удалить ненужное условие if call.message:
    3. добавить условие на call.data == "back", где получите клавиатуру вызовом функции из п.1 и отредактируете сообщение с нужным текстом и этой клавиатурой
    Ответ написан
  • Aiogram 3 как Установить state для определенного пользователя?

    @twistfire92
    Python backend developer
    Можете заглянуть в исходники aiogram, найти там класс FSMContext, экземпляр которого пробрасывается в вашу функцию, и поизучать это все.
    Один из аргументов функции __init__ этого класса имеет тип StorageKey, который в свою очередь содержит информацию о чате, пользователе, боте и пр.
    Я думаю вам стоит копать в эту сторону, создать руками отдельный инстанс FSMContext (назовем его custom_state), куда передадите отдельный инстанс StorageKey с нужными вам параметрами. Вторым параметром у FSMContext буедет выступать ваш Storage. Либо MemoryStorage, либо RedisStorage (либо у вас свой кастомный какой-то). Туда пробрасывайте тот Storage, который используете.

    И вот уже у этого отдельного инстанса custom_state вызывайте метод set_state()

    P.S. Сам такое не проворачивал, ответ написал опираясь на исходники aiogram. Копайте туда, пробуйте, экспериментируйте.
    Ответ написан
    Комментировать
  • Как создать хэндлер Aiogram для обработки ошибки на Python?

    @twistfire92
    Python backend developer
    Вам тут нужна машина состояний (гуглите aiogram FSM), информации в интернете достаточно много. С ее помощью сможете регистрировать текущее состояние каждого пользователя. Например сейчас пользователь в состоянии ввода цены на товар, поэтому в следующем сообщении которое он введет ожидается число. Если приходится выводить ошибку - выводите и не меняйте состояние пользователя
    Ответ написан
    1 комментарий
  • Как сделать inline кнопку чтобы при нажатии можно было позвонить человеку?

    @twistfire92
    Python backend developer
    Нет такого функционала у API телеги. Разве что сделать какую-то веб прослойку, на которую будет ссылаться кнопка и уже там при открытии вызывать tel:xxxxxxxxxx

    Но это что-то костыльное все равно
    Ответ написан
    Комментировать
  • Не работает инлайн-кнопка после нажатия, как исправить?

    @twistfire92
    Python backend developer
    потому что ваше нажатие на кнопку перехватывает хендлер
    @dp.message()
    async def echo(message: Message):

    Который перехватывает воообще все сообщения, в том числе сообщение "оплатить", которое вы посылаете кнопкой. Просто на это сообщение этот хендлер никак не отреагирует, судя по коду. Поднимите хендлер с функцией оплаты выше.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы при написании команды, начался обратный отсчёт?

    @twistfire92
    Python backend developer
    Программа делает ровно то, что вы ей указали. Берет пользователя, и начинает ему показывать обратный отсчет. Потом берет второго пользователя и делает то же самое. И т.д., пока пользователи не закончатся.

    Если вы хотите чтобы все было одновременно, вам следует одновременно все это запускать. Сначала получше изучите асинхронность, потом напишите асинхронную функцию которая принимает на вход id пользователя, запрашивает его количество секунд и пр. По сути функция должна делать все то, что описано у вас в теле цикла.

    И потом можно попробовать запустить это все, например, через asyncio.gather().

    Сразу предупрежу, что если будет много таких пользователей, есть риск схватить временную блокировку от серверов телеги из-за большого количества запросов. Лучше изучите информацию о том, какие есть ограничения по частоте запросов к серверам телеги.
    Ответ написан
  • Проблема с импортами, ошибка, сам не смог решить, как сделать?

    @twistfire92
    Python backend developer
    вот это
    sql = f"SELECT * FROM tg(id, sub) values({id_user}, {sub})"


    перенесите в функцию creat_account (переименуйте в create_account) и удалите строку from bot import sub, id_user
    Ответ написан
    2 комментария
  • Как правильно парсить в телебот и requests?

    @twistfire92
    Python backend developer
    а вы хоть смотрели что попадает в nickname после выполнения nickname = message.text.lower()?
    там по идее всегда будет "/username_search"

    После команды предлагайте пользователю отдельно ввести свой никнейм.
    Воспользуйтесь bot.register_next_step_handler()
    Ответ написан
    2 комментария
  • Вопрос по тг боту на aiogram?

    @twistfire92
    Python backend developer
    у вас видимо код был написан для 2-й версии aiogram.

    Зайдите в документацию, там сразу же показан пример как запускать. executor больше не используется
    Ответ написан
    Комментировать
  • Почему бот дважды выполняет команду (telebot)?

    @twistfire92
    Python backend developer
    Для того, чтобы бот делал рассылку всем пользователям, вам нужно где-то хранить список всех пользователей. Вносить туда новых, когда кто-то новый начинает взаимодействовать с ботом.

    Когда пользователь пишет боту лично, то он находится в чате с самим ботом, где участников 2 - пользователь и бот. Поэтому bot.get_chat_members_count(message.chat.id) выдаст всегда значение 2.
    Если бот будет админом в какой-либо группе, тогда уже выведется количество участников этой группы.

    Вот теперь вы берете и проходите в цикле 2 раза, отправляя в этот чат сообщение.

    Вам же надо где-то хранить все id пользователей, с кем бот взаимодействует. Когда будет отлавливаться нужная команда, проходить в цикле по всем id и отправлять им нужный текст сообщения. Можно из этого списка во время отправки исключить текущего пользователя, чтобы самому не получить сообщение.
    Ответ написан
    5 комментариев
  • Что нужно поправить в коде на Python, который удаляет последний пост в Телеграм канале?

    @twistfire92
    Python backend developer
    Вы должны сначала получить чат с помощью
    await bot.get_chat(chat_id)
    и только потом у этого объекта вызвать метод fetch_all()

    либо
    chat = await bot.get_chat(chat_id)
    messages = chat.fetch_all()

    либо
    messages = (await bot.get_chat(chat_id)).fetch_all()
    Ответ написан
    Комментировать
  • Как хранить константы в python?

    @twistfire92
    Python backend developer
    Как вариант, можете использовать BaseSettings из Pydantic (Но надо смотреть на версию, во второй отдельная либа для настроек). Получится лишь в ваш класс добавить наследование от BaseSettings. Но если вы не собираетесь прокидывать переменные окружения в настройки, то и ваш вариант вполне рабочий.
    Ответ написан
    Комментировать
  • Как запустить скрипт на Python с использованием сторонних библиотек?

    @twistfire92
    Python backend developer
    В батнике должна быть команда активации виртуального окружения, и только уже потом все остальное
    Ответ написан
    Комментировать
  • Можно ли в Python сделать такой механизм, чтобы при изменении значения в любой ветки словаря, я был уведомлен?

    @twistfire92
    Python backend developer
    Как верно подметил fenrir , наследоваться надо от UserDict.
    Чуть поменял код, можете посмотреть что вышло. Была еще проблема в том, что при создании объекта вызывается метод __setitem__, для этого добавил флаг _initialization_finished

    from collections import UserDict
    
    
    class MyDict(UserDict):
        def __init__(self, **kwargs):
            self._initialization_finished = False
            print('Создан объект')
            super().__init__(**kwargs)
            self._initialization_finished = True
    
        def __setitem__(self, item, value):
            if self._initialization_finished:
                print(f"Вы поменяли значение {item} на {value}!")
            if isinstance(value, dict):
                value = MyDict(**value)
            super().__setitem__(item, value)
    
        def __getitem__(self, item):
            print(f"Пытаемся получить значение {item}")
            return super().__getitem__(item)
    
    
    d = MyDict(x='123', y=15, z={'a': 4})
    # Создан объект
    # Создан объект
    
    d['x'] = '456'
    # Вы поменяли значение x на 456!
    
    e = d['y']
    # Пытаемся получить значение y


    Два сообщения подряд "Создан объект" из-за того, что сначала создается основной кастомный словарь, потом создается словарь под ключом z, который тоже вызывает сообщение
    Ответ написан
    Комментировать
  • Почему оператор if в конструкции не возвращает нужное значение?

    @twistfire92
    Python backend developer
    Вы неправильно задаете условие, вы пытаетесь человеческую речь перевести на язык программирования.
    Если текст равен "Вариант1" или "Вариант2", то...
    не будет так работать.
    условие
    if text == 'first' or 'second':
    разбивается на проверку истинности двух утверждений:
    - text == 'first'
    - 'second'
    Если с первым все понятно, то во втором случае мы приводим непустую строку к типу bool и получаем всегда True

    Если и дальше хотите переводить человеческую речь в инструкции на языке программирования, необходимо более правильно ставить задачу
    Например:
    Если текст равен "Вариант 1" или текст равен "Вариант 2", то...
    Ответ написан
    Комментировать
  • Как запретить давать атрибуты функции без ключей?

    @twistfire92
    Python backend developer
    def func(*, a, b):
        print(a+b)
    Ответ написан
    Комментировать