Ответы пользователя по тегу TeleBot
  • Можно ли и каким образом прописать команду telegram-боту обрабатывать только определенные изображения (скрины,документы), а остальные игнорировать?

    Vindicar
    @Vindicar
    RTFM!
    Простого способа нет. Метаданные могут кое-что подсказать - некоторые форматы изображений содержат комментарии, например, каким ПО файл был создан. Но метаданные могут отсутствовать или быть некорректными.
    Не говоря уже о том, что ваше определение "скриншоты, документы" - ОЧЕНЬ расплывчатое. Фотография экрана - это скриншот? А с точки зрения метаданных она будет неотличима от просто фотки. Фотография девушки с паспортом в руках - считается документом или нет?

    Так что или пытаться обрабатывать всё (и ругаться, если не получается), или ставить какой-то предварительный фильтр на базе того или иного классификатора изображений. Но тогда будут проблемы с ошибками - или фильтр пропустит левое изображение, или, что хуже, не пропустит правильное.
    Ответ написан
    Комментировать
  • Как правильно написать многоуровневое меню для телеграмм бота в библиотеке telebot?

    Vindicar
    @Vindicar
    RTFM!
    Ну первое, что я замечу: в коде только call_start_menu() помечена как обработчик событий от кнопок, потому что только перед ней стоит декоратор callback_query_handler.
    Советую ознакомиться с документацией и примерами, чтобы понять, как регистрируются обработчики.
    А заодно (поскольку это будет ваш следующий вопрос) понять, что такое func= и для чего оно нужно.
    Ответ написан
    1 комментарий
  • Как отправить разные изображения для сообщений с одинаковым содержанием в Telebot?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужен автомат состояний (finite state machine, FSM). Не знаю, есть ли его реализация в комплекте с telebot, но идея простая: нужно помнить, что пользователь делал раньше, т.е. иметь хранилище ключ-значение вида "id пользователя -> состояние+доп. инфа". В простейшем варианте хватит и словаря (если тебе не критично, чтобы сведения переживали перезагрузку бота).
    Ответ написан
    Комментировать
  • 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)?
    Ответ написан
    Комментировать