Ответы пользователя по тегу Telegram
  • Не работают кнопки в тг боте на 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".

    Дальше сами
    Ответ написан
    Комментировать
  • Не отправляется рассылка в боте telegram?

    @twistfire92
    Python backend developer
    в роутере попробуйте внести изменения
    @router.message(States.broadcast)
    async def process_broadcast(message: Message, state: FSMContext):
        text = message.text
        await state.finish()
        ...
    Ответ написан
    Комментировать
  • Меню многоуровневое тг бота 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
    Ответ написан
    Комментировать
  • Как сделать inline кнопку чтобы при нажатии можно было позвонить человеку?

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

    Но это что-то костыльное все равно
    Ответ написан
    Комментировать
  • Почему бот дважды выполняет команду (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()
    Ответ написан
    Комментировать
  • Использование sql lite 3 и telebot одновременно несколькими людьми, будет ли ошибка?

    @twistfire92
    Python backend developer
    Если используете pytelegrambotapi (telebot), то с помощью register_next_step_handler вполне несложно собрать разом нужные данные и потом одним запросом записать их в БД. пользователи при этом друг другу не помешают. У каждого пользователя будет своя запись в БД
    Ответ написан
    Комментировать
  • Телеграм бот. Библиотека aiogram. Как построить многоуровневую ReplyKeyboardMarkup клавиатуру?

    @twistfire92
    Python backend developer
    Да, такую задачу (а именно чтобы нельзя было с любого участка в телеграм боте ввести название определенной кнопки) можно реализовать используя state из возможностей FSM в aiogram. Под каждый раздел меню устанавливать соответствующее состояние (state) для пользователя. И если пользователь введет название кнопки не относящееся к текущему состоянию, не реагировать. Но это чревато тем, что если где-то будет какая-то ошибка в логике установки состояний, пользователь окажется в ситуации, когда нажимает на кнопку, а бот не реагирует. Возможно поможет начать все сначала через /start, но это совсем не user friendly.

    Но лично мое мнение - удобнее делать многоуровневую Inline клавиатуру. И выглядит она красивее.
    Ответ написан
    Комментировать
  • Как проверить если сообщение было отправлено ответом на сообщение?

    @twistfire92
    Python backend developer
    Смотрите в message.reply_to_message
    Ответ написан
    Комментировать
  • Python в боте Telegram. Где ошибка? Что делать?

    @twistfire92
    Python backend developer
    @bot.message_handler(commands=['THIS THIS'])
    тут ошибка. Ожидается команда THIS THIS, а вы должны проверять текст сообщения
    Ответ написан
  • Бот на telebot создает одинаковые заявки, как исправить?

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

    Если я не прав, то стоило бы показать код.

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

    @twistfire92
    Python backend developer
    а вот так не сработает? с одним запросом в бд
    markup = types.InlineKeyboardMarkup(row_width=8)
    sq_s_g3 = f"SELECT * FROM '{player1}-{player2}'"
    cursor.execute(sq_s_g3)
    records = cursor.fetchall()
    for row in records: 
      markup.add(types.InlineKeyboardButton(text = row[1], callback_data = row[0]))
    Ответ написан
    Комментировать
  • Как из одной функции вызвать другую?

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

    Сразу обозначу, что возможно синтаксис для telebot не самый верный, лень было смотреть и вспоминать, но суть должна быть понятна

    def start(message):
      # тут то, что должно отрабатывать при start
    
    
    @bot.message_handler(commands=['start'])
    def start_command(message):
      start(message)
    
    
    @bot.message_handler(commands=['starts'])
    def starts_command(message):
      start(message)
      # Далее то, что должно отрабатывать при starts


    А если у тебя 2 команды должны вообще одинаково отрабатывать, то просто в commands перечисляй эти команды.
    @bot.message_handler(commands=['start', 'starts'])
    def start_command(message):
      # то, что должно обрабатываться при этих командах
    Ответ написан
    Комментировать
  • Как изменить кол-во кнопок в ряду aiogram?

    @twistfire92
    Python backend developer
    Добавить ряд кнопок можно через row()
    keyboard.row(button1, button2)
    keyboard.row(button3, button4, button5)

    Этот код даст вам 2 кнопки в первом ряду и 3 во втором.
    Я думаю, что не стоит объяснять что должно быть на месте keyboard и button(1-5)
    Ответ написан
    Комментировать
  • Aiogram: Нет InlineKeyboardButton под постами с несколькими фото. В чём проблема?

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

    Можно попробовать вызвать отдельно message.edit_reply_markup
    Ответ написан
    3 комментария
  • Как остановить bot.register_next_step_handler?

    @twistfire92
    Python backend developer
    как один из вариантов, делать проверку на слова триггеры:
    def ur_secondname(message):
        if message.text.lower() in ['отмена', 'stop', '/stop', 'cancel']:
            bot.send_message(message.chat.id, 'Отмена пользователем!')
        else:
            user_data = {} #создаем словарь
            ...
    Ответ написан
    4 комментария
  • Как сделать, чтобы программа для бота запоминала, на какие кнопки нажал пользователь?

    @twistfire92
    Python backend developer
    Если вы используете обычную клавиатуру, не inline, то советую посмотреть в сторону метода register_next_step_handler() В интернете полно примеров использования, в том числе на этом ресурсе.
    Но мало где описывается, что помимо объекта сообщения и объекта функции этот метод принимает аргументы, которые в эту функцию передает.
    Пример такого использования можете посмотреть тут
    Ответ написан
    Комментировать
  • Почему Callback кнопка не работает в Aiogram?

    @twistfire92
    Python backend developer
    text="fail" в хендлере - это про текст кнопки, а не callback_data.
    меняйте на
    @dp.callback_query_handler(lambda call: call.data == 'fail')
    Ответ написан