Ответы пользователя по тегу TeleBot
  • Как сделать так чтобы бот ждал ответ?

    @twistfire92
    Python backend developer
    Во-первых нужно убрать декоратор у функции easy_game. Эта функция вызывается в register_next_step_handler, так что следующее сообщение будет как раз обрабатываться этой функцией.

    Во-вторых. В этой же функции сначала отправляется страна, затем отправляется ответ. Должно быть не так.
    Страна должна отправляться в функции easy(). Но там у тебя пользователю выводится сообщение с предложением запустить игру. Так что пропускай (пока что) предложение с запуском игры и сразу выводи название страны, потом обрабатывай ответ от пользователя в easy_game.

    В-третьих. По текущей логике, ответив "Париж" на вопрос "Россия", выдаст правильный ответ. Ты должен где-то сохранять правильный ответ на поставленый вопрос, чтобы сравнить с вводом пользователя. Для этого в функцию easy_game() можно добавить еще один аргумент right_answer, и передавать в него правильный ответ через дополнительные параметры в register_next_step_handler

    В-четвертых. Лучше использовать словарь, где ключом будет вопрос, а значением - ответ.

    В-пятых. Столица Эмиратов - Абу-Даби.

    Весь код приводить не буду, только некоторые моменты.

    countries_easy = {
    	"Россия": "Москва",
    	"Франция": "Париж",
    	"Арабские Эмираты": "Абу-Даби",
    	}
    
    ...
    
    @bot.message_handler(content_types=["text"])
    def easy(message):
    	...
    	# рандомно выбираем пару ключ-значение из словаря.
    	country, capital = random.choice(list(countries_easy.items()))
    	msg = bot.send_message(messaga.chat.id, country)
    	# Третьим параметром отправляем правильный ответ
    	bot.register_next_step_handler(msg, easy_game, capital)
    
    
    def easy_game(message, right_answer):
        if message.text == capital:
            bot.send_message(message.chat.id, "Правильный ответ!")
        else:
            bot.send_message(message.chat.id, "Неправильный ответ")


    В общем, разобравшись в работе register_next_step_handler, можно будет уже полноценную логику собирать.
    Ответ написан
    2 комментария
  • Как отправить переменную вместе с нажатием кнопки, в декоратор callback, не прибегая к созданию глобальной переменной?

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

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

    второй способ предпочтительнее, т.к. в первом случае после рестарта бота весь процесс у пользователей слетит. Да и не очень хорошо глобальными переменными пользоваться
    Ответ написан
    Комментировать
  • Меню многоуровневое тг бота 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
    вот это
    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 комментария
  • Почему бот дважды выполняет команду (telebot)?

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

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

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

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

    @twistfire92
    Python backend developer
    Объект message у вас один всегда, который берется из аргументов функции. Вы его нигде не меняете, поэтому при проверке if message.text == 'Подтвердить': всегда вернется одно и то же значение.
    Если вы хотите ожидать от пользователя нового ввода, стоит перекинуть управление в другую функцию.
    Конкретно в вашем случае лучше воспользоваться register_next_step_handler. И каждый раз прокидывать в него оставшиеся элементы списка из cells_products_data.
    Я не уверен, что register_next_step_handler работает в асинхронном режиме, не юзал telebot в async.
    Изучите этот инструмент подробнее.
    Ответ написан
    Комментировать
  • Как дополнить Python код телеграмм бота?

    @twistfire92
    Python backend developer
    Никак. Такие кнопки просто отправляют сообщение с текстом который в них указан. Т.е. если есть кнопка с текстом "назад", то ее нажатие будет равносильно тому, что вы просто наберете "назад" и отправите.

    Если хотите какой-то более сложной логики с кнопками - используйте InlineButton
    Ответ написан
    Комментировать
  • Почему не работает register_next_step_handler ( telebot )?

    @twistfire92
    Python backend developer
    Ошибка в параметрах, которые передаете в register_next_step_handler

    @bot.message_handler(regexp="Редактировать Доску Почета")
    def red_doska(message):
        if message.chat.id in ADMINS:
            msg = bot.send_message(message.chat.id, text="Жду новое значение")
            bot.register_next_step_handler(msg, redact)
    Ответ написан
    1 комментарий
  • Как записать ответ от пользователя в ТГ боте в переменную?

    @twistfire92
    Python backend developer
    Если вы пользуетесь библиотекой PyTelegramBotApi (telebot), то вам надо гуглить register_next_step_handler
    Если aiogram - гуглите FSM

    На этом ресурсе очень много вопросов и ответов по использованию и первого и второго
    Ответ написан
    Комментировать