• Не отправляется рассылка в боте telegram?

    @twistfire92
    Python backend developer
    в роутере попробуйте внести изменения
    @router.message(States.broadcast)
    async def process_broadcast(message: Message, state: FSMContext):
        text = message.text
        await state.finish()
        ...
    Ответ написан
    Комментировать
  • Как сделать отложенную отправку сообщений ботом aiogram 3?

    @twistfire92
    Python backend developer
    Вообще asyncio.sleep работать то должно, но лучше прикрутить какой-нибудь шедулер, или celery
    Ответ написан
    Комментировать
  • Можно ли заставить бота на aiogram отвечать исключительно на каждое пятое сообщение с ключевыми словами?

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

    @twistfire92
    Python backend developer
    сходу можно 2 варианта рассмотреть.
    1. Самое простое, но не самое правильное - глобальную переменную сделать не строкой, а словарем, куда будет записываться соответствие
    id пользователя (ключ) и его ответ на загадку (значение). Соответственно можно просто через метод update вставлять ответ для каждого пользователя.

    2. зашивать в callback_data номер текущей загадки и потом просто по этому номеру вытаскивать ответ.

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

    @twistfire92
    Python backend developer
    1.
    @dp.message_handler(commands=["support"])
    поменяйте на
    @dp.callback_query_handler(text="support")
    2. Читайте документацию
    3. удалите из вопроса токен и обновите его
    Ответ написан
    4 комментария
  • Меню многоуровневое тг бота telebot почему не работает?

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

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

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

    @twistfire92
    Python backend developer
    Нельзя отправить эмодзи кубика с предопределенным значением. Если где-то такое было, то скорее всего использовались анимированные стикеры.
    Отправка кубика происходит через метод sendDice, в котором нет параметра для установки значения.
    В ответ прилетает объект Message, в котором есть свойство dice типа Dice.

    В документации четко прописано про random value
    Ответ написан
    Комментировать
  • Как выйти из вложенного хендлера в aiogram3 python?

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

    А для реализации вашей логики необходимо использовать машину состояний (FSM)
    Ответ написан
    Комментировать
  • 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().

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

    @twistfire92
    Python backend developer
    Скорее всего у вас где-то вызывается синхронный код в асинхронном ендпоинте. И этот код блокирует event loop.
    Посмотрите пример
    @app.get("/delay")
    async def delay():
        time.sleep(10)
        return {"result": "OK!"}
    
    
    @app.get("/instantly")
    async def instantly():
        return {"result": "OK!"}


    Если сделать запрос на /delay и тут же сделать запрос на /instantly, получится то, о чем я говорю, когда синхронная time.sleep() блокирует цикл событий. Ответ от второго запроса придет только после отработки первого. Обратите внимание, что delay объявлена через async def.

    Исправить это можно двумя способами
    - Использовать асинхронный await asyncio.sleep()
    @app.get("/delay")
    async def delay():
        await asyncio.sleep(10)
        return {"result": "OK!"}

    - Объявить функцию синхронной через def
    @app.get("/delay")
    def delay():
        time.sleep(10)
        return {"result": "OK!"}


    Возможно именно в этом у вас проблема. Найдите синхронный код и либо перепишите на асинхронный вариант, если это возможно (если для обращения в другой сервис вы используете requests, замените на aiohttp или httpx), либо саму функцию ендпоинта сделайте синхронной.
    Ответ написан
  • Проблема с импортами, ошибка, сам не смог решить, как сделать?

    @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 комментариев
  • Как сохранить машиносостоянии игры :кубик в телеграмме с последующей отправкой кубика в канал?

    @twistfire92
    Python backend developer
    Вместо этого
    lambda message: message.text == ''
    Попробуйте указать так:
    lambda message: message.dice
    Ответ написан
    Комментировать