Ответы пользователя по тегу TeleBot
  • Python Telebot. Не сохраняется значение в переменную. Сможете помочь?

    Vindicar
    @Vindicar
    RTFM!
    Читай, как работают глобальные переменные (ключевое слово global) в питоне.

    Ты сейчас создаёшь в обработчике события локальную переменную a, которая, разумеется, пропадает, когда обработчик завершается.

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

    Vindicar
    @Vindicar
    RTFM!
    А зачем ты делаешь get_message(), если message.reply_to_message уже должен содержать информацию о сообщении, на которое был сделан ответ?
    Ответ написан
  • Ошибка /usr/local/lib/python3.11/dist-packages/telebot/util.py:92: RuntimeWarning: coroutine 'gpt' was never awaited tas telebot python, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Что за "as" в as def gpt(message, **kwargs):?
    Ты имел ввиду async? Так у тебя программа синхронная, в ней async не к месту. Просто def достаточно.
    Ответ написан
    4 комментария
  • Почему не работает обработчик ответа пользователя в Телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    А чего тут выстраивать.
    Приходит событие.
    Бот перебирает обработчики этого события.
    Для каждого обработчика вызывается func, пока она не вернёт True.
    Этот обработчик и вызывается для обработки события.
    Вот и всё.

    Единственный вопрос - порядок перебора обработчиков. Варианта реально два: либо в хронологическом порядке регистрации, либо в обратном хронологическом (что менее вероятно).
    Ответ написан
    Комментировать
  • Как сделать рассылку всем пользователям которые нажали /start?

    Vindicar
    @Vindicar
    RTFM!
    Проверь тип данных user. Можно тупо print(type(user)). Обычно БД в питоне возвращают каждую строку выдачи как кортеж, даже если в строке одно значение. В этом случае нужно будет сделать telegram_id = user[0]
    Ответ написан
  • Как правильно выводить COUNT?

    Vindicar
    @Vindicar
    RTFM!
    Поясню ответ Everything_is_bad выше: эта запись соответствует встроенному типу данных питона - кортеж (tuple). Ты должен уметь этот тип данных узнать, и знать как работать с ним (а также со списками и словарями) ДО того, как браться за ботов. Это азы, без понимания которых ты будешь спотыкаться на каждой мелочи.
    Ответ написан
  • Как сделать такой функционал кнопок Telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Отредактируй сообщение, при редактировании отправь новую разметку для кнопок?
    Ответ написан
    Комментировать
  • Ошибка в sqlite3 telebot?

    Vindicar
    @Vindicar
    RTFM!
    Выучить питон ДО того, как бросаться писать ботов, а не после.
    def summa (message: int) -> int:
        msg = bot.send_message(message.chat.id, 'Введите сумму перевода:')
        bot.register_next_step_handler(msg, perevod)


    Ты заявляешь, что функция возвращает int, и используешь её, как будто она возвращает int, но она ничего не возвращает - а раз так, она возвращает None.

    Ну и да, читай примеры из документации, как правильно использовать register_next_step_handler().

    sqlite тут вообще не при делах, но я замечу: не используй f-строки для формирования запросов. Вот, INSERT ты вроде правильно делаешь, так в чём проблема везде делать так же?
    Ответ написан
    Комментировать
  • Почему telebot не отправляет фото?

    Vindicar
    @Vindicar
    RTFM!
    Ты задал относительный путь к файлу. Ты уверен, что он лежит в текущей рабочей директории?
    Текущая рабочая директория может, но не обязана совпадать с директорией скрипта.
    Тебе лучше вычислить полный путь к файлу, используя sys.argv[0], чтобы узнать путь к скрипту, и модуль pathlib для манипуляции путями.
    Ответ написан
    Комментировать
  • Как сделать полное выполнение условия if-elif Python?

    Vindicar
    @Vindicar
    RTFM!
    Не надо описывать один обработчик внутри другого.
    Это НИКОГДА не будет работать так, как ты этого ожидаешь.
    Ответ написан
  • При нажатие на кнопку в telebot ни сего не происходит, проблема и её решение?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func = lambda callback: True)

    Ты говоришь боту "если пользователь нажал кнопку, вызови функцию ниже, и делай это для любых кнопок" (func = lambda callback: True). Но у тебя в коде ДВЕ функции-обработчика, и обе говорят, что их надо вызывать для любых кнопок. Бот в таком случае вызывает только одну из них.
    Измени func так, чтобы она проверяла, какая кнопка нажата. Например, если укажешь
    func = lambda callback: callback.data == 'register'
    , то только кнопка, отдающая строку "register", будет вызывать срабатывание этой функции.

    Если тебе удобнее сделать выбор внутри функции, то можно сделать так:
    func = lambda callback: callback.data in ('faq', 'register')
    , тогда функция ниже будет вызвана при нажатии любой из двух кнопок, и тебе нужно будет внутри функции выбрать один из двух вариантов.

    В любом случае, нельзя допускать, чтобы у двух и более обработчиков проверка подходила под одну и ту же кнопку.
    Ответ написан
    Комментировать
  • Как сделать, чтобы с каждым нажатием кнопки бот отнимал от 100 один, то есть писал: 99 98 97 96 95...?

    Vindicar
    @Vindicar
    RTFM!
    1. Читай правила сайта. Оформление кода кнопкой </> обязательно, иначе вопрос могут удалить.
    Не говоря уже о том, что сейчас твой код нечитаем.
    2. Вместо лирики в духе "АААААА СПОСИТЕ ПАМАГИТЕ" лучше бы уточнил, какую именно задачу ты решаешь. Тебе нужно, чтобы счётчик был общий у всех пользователей бота, или чтобы у каждого пользователя был свой счётчик? Если свой, то должен ли счётчик переживать перезапуск бота?

    В первом случае читай про глобальные переменные в питоне и ключевое слово global.

    Во втором случае тебе нужно хранить значения счётчика так, чтобы можно было различать пользователей. Например, в виде словаря "id пользователя - значение счётчика". Читай про словари, а также про глобальные переменные.

    В третьем случае тебе нужно разбираться, как работать с БД, но я бы посоветовал сначала подучить питон как таковой, без ботов.
    Ответ написан
    5 комментариев
  • Проблема с импортами, ошибка, сам не смог решить, как сделать?

    Vindicar
    @Vindicar
    RTFM!
    Циклический импорт, вызванный глобальными переменными.
    Вместо того, чтобы использовать глобальные переменные, вынеси код в функции, и передавай им нужные объекты явно. Тогда модулю, содержащему функции, не нужно будет импортировать модуль, содержащий переменные. А там, глядишь, дойдёшь и до классов.
    Ответ написан
    Комментировать
  • Почему бот перестал отвечать после добавления клавиатуры?

    Vindicar
    @Vindicar
    RTFM!
    У тебя две функции отмечены как
    @bot.message_handler(content_types=['text'])
    telebot в случае подобного конфликта (две функции готовы обслужить одно и то же событие) всегда вызывает первую из них.
    Тебе придётся объединить логику этих функций в одной функции.
    Ответ написан
    Комментировать
  • Почему возникает ошибка "got an unexpected keyword argument 'use_context'"?

    Vindicar
    @Vindicar
    RTFM!
    Ты уверен, что туториал, по которому ты писал бота, рассчитан на ту же версию, что и используемая тобой?
    Может, у тебя либа сильно новее, чем та, на которую код рассчитан?
    Ответ написан
    Комментировать
  • Что делать, не работает telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Так telebot вроде синхронный, а не асинхронный фреймворк?
    Ответ написан
  • Не правильная проверка ячейки таблицы через цикл, почему не записывается переменная?

    Vindicar
    @Vindicar
    RTFM!
    Ты уверен? Как насчёт явно задать порядок выборки нужных тебе столбцов в select?
    Что-то в духе SELECT id, name, chat_id FROM users. Названия столбцов укажи свои, и только используемые в данном коде.

    Далее, с БД так не работают. Ты выбираешь все строки, а потом вручную ищешь совпадение - это глупо.
    Лучше попроси БД найти нужные тебе строки.
    cur.execute('SELECT id, name FROM users WHERE chat_id = ?', (call.message.chat.id,))


    К слову, что ты подразумеваешь с под "третья"? Индекс 3? Или "третья с начала" (индекс 2)?
    Ответ написан
    Комментировать
  • Не могу исправить проблему, бот не может отправить сообщение по нажатии кнопки?

    Vindicar
    @Vindicar
    RTFM!
    Ну твоя проблема уже тут:
    @bot.callback_query_handler(func=lambda call: True)

    Ты говоришь боту "вызывай эту функцию всякий раз, когда пользователь нажимает кнопку"(callback_query_handler), и добавляешь "неважно, какая кнопка была нажата" (func=lambda call: True).
    Поэтому у тебя callback() будет вызываться при нажатии ЛЮБОЙ кнопки.

    Если ты хочешь, чтобы при нажатии разных кнопок вызывались разные функции, тебе нужно разделить их с помощью параметра func. В нём ты передаёшь маленькую функцию-фильтр, которая отвечает на вопрос "может ли эта функция обработать это нажатие?". Бот перебирает зарегистрированные callback-обработчики, и вызывает первый, чей фильтр вернул True.

    Т.е. тебе нужно написать такие фильтры, которые смогут разделить нажатия отдельных кнопок.
    Простой способ это сделать - реализовать иерархию в callback_data, например так:
    # обрабатываем то, что начинается с 'city.'
    @bot.callback_query_handler(func=lambda call: call.data.startswith('city.'))
    def callback(call):
        city = call.data[len('city.'):]  # отрезаем префикс 'city.'
        if city == 'istanbul':
            bot.send_message(call.message.chat.id,'Вы выбрали город: Стамбул')
        elif city == 'moscow':
            bot.send_message(call.message.chat.id,'Вы выбрали город: Москва')
        else:
            bot.send_message(call.message.chat.id,'Я не знаю такого города')

    А до этого ты где-то в другом обработчике послал сообщение с клавиватурой вида
    keyboard = types.InlineKeyboardMarkup()
    # обрати внимание, callback_data всегда начинается с 'city.'
    keyboard.add(types.InlineKeyboardButton('Стамбул', callback_data='city.istanbul'))  
    keyboard.add(types.InlineKeyboardButton('Москва', callback_data='city.moscow'))

    Так ты можешь разделить обработчики для разных наборов кнопок.

    Еще советую почитать про FSM.
    Ответ написан
  • Как поставить временное ограничение на использование команд в ТГ боте на python?

    Vindicar
    @Vindicar
    RTFM!
    Сохранять время, когда команда должна перестать работать.
    При вызове команды проверять текущее время: если оно больше сохранённого, значит, не выполняем команду.
    Ответ написан
  • Как создать математического бота в телеграмм на питоне?

    Vindicar
    @Vindicar
    RTFM!
    Зависит от текущего уровня знаний.
    1. Убедись, что знаешь хотя бы основы языка Python и умеешь искать недостающую информацию.
    2. Освой хотя бы фреймворк для работы с телегой, типа pyTelegramBotAPI или Aiogram.
    Напиши пару простых ботов, для начала - эхобот.
    3. Продумай сценарий взаимодействия пользователя с ботом. Какие инструменты потребуются? Будет ли взаимодействие на уровне "команда - ответ", или же понадобятся сценарии (FSM)?
    4. Посмотри, есть ли в выбранном фрейсмворке нужные инструменты, попробуй их освоить на примере простых ботов.
    5. Приступай к своему боту.
    Ответ написан
    Комментировать