Задать вопрос
Ответы пользователя по тегу Python
  • Бот долго отвечает сообщением, где фото+текст. Как исправить?

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

    Как и где хранить этот file_id для фото нужного товара - тема отдельного вопроса. Обычно используется БД для подобных вещей, но у вас уже есть какой-то словарь products со словарями внутри. Предлагаю каждый элемент этого словаря расширить ключом file_id.
    Далее логика следующая:

    Когда нужно отправить фото товара, смотрите сначала на значение в file_id.
    - Если оно пустое - отправляете по-старому сценарию, только сначала дождитесь ответа от метода message.answer_photo(). Результатом этого метода будет объект Message, в котором можно найти file_id для вашего загруженного файла (поиски возложу на вас). Просто прописываете его в ваш словарь products[product_id][file_id].

    - Если значение file_id заполнено, то делаете все то же самое, что и сейчас, только в методе message.answer_photo() в параметре photo передаете file_id.

    получается, что сам файл будет загружен на сервер только один раз, а все остальные разы будет браться только с сервера. Кстати в документации Bot API так и сказано, что предпочтительнее использовать file_id, нежели каждый раз загружать файлы на сервера телеги.
    Ответ написан
    1 комментарий
  • Почему не все упоминания юзеров Telegram кликабельны?

    @twistfire92
    Python backend developer
    Смею предположить, что пользователь, на которого ссылка не кликабельна, с ботом сам еще не общался.
    Во всяком случае я именно с таким сталкивался. Перекинул БД с одного бота на другого, и ссылки на пользователей стали не кликабельными, пока эти пользователи с новым ботом впервые не поздоровались
    Ответ написан
    1 комментарий
  • Как сделать телефон кликабельным в телеграмм?

    @twistfire92
    Python backend developer
    не совсем понятно что именно и откуда попадает в парсер (какая-то HTML страница?)

    Если у вас на входе есть телефон в каком-то некорректном формате, а нужно вывести в определенном, то с помощью модуля re (регулярные выражения) можно довести до нужного формата.

    Например

    import re
    
    phone = "8 (987)-654-32-10"
    
    # удаляем лишние символы из номера
    phone = re.sub(r"[\s()-]", "", phone)
    print(phone)  # 89876543210
    
    # заменяем стоящий первым символ 8 на +7
    phone = re.sub(r"^8", "+7", phone)
    print(phone)  # +79876543210


    Изучите работу с регулярками
    Ответ написан
    2 комментария
  • 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. Копайте туда, пробуйте, экспериментируйте.
    Ответ написан
    3 комментария
  • Как создать хэндлер 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. Но если вы не собираетесь прокидывать переменные окружения в настройки, то и ваш вариант вполне рабочий.
    Ответ написан
    Комментировать