Ответы пользователя по тегу TeleBot
  • Почему бот перестал отвечать после добавления клавиатуры?

    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. Приступай к своему боту.
    Ответ написан
    Комментировать
  • Почему бот отправляет "0"?

    Vindicar
    @Vindicar
    RTFM!
    Документацию читать надо.
    os.system() возвращает числовой код завершения запущенного процесса (0 - завершилась успешно). Стандартный вывод этого процесса молча отправляется в стандартный вывод твоей консоли.
    Если тебе нужен перехватить стандартный вывод, используй средства модуля subprocess.
    А если тебе нужно мониторить изменения файла, используй пакет watchdog.
    Ответ написан
    4 комментария
  • Как реализовать поиск в тг боте по словам из самого кода?

    Vindicar
    @Vindicar
    RTFM!
    Вместо того, чтобы хардкодить названия, сделай какую-то коллекцию с ними. Не обязательно БД, хотя бы текстовый файл, который читается в список. Тогда можно будет перебирать элементы списка и при создании кнопок, и при поиске.
    Ответ написан
    Комментировать
  • Выводит ошибку, как можно исправить? (Error code: 400. Description: Bad Request: chat not found)?

    Vindicar
    @Vindicar
    RTFM!
    Как читать трейсбэк? Он состоит из записей вида:
    v                         в каком файле ошибка                           v   v строка v    v     функция    v
    File "/home/maksim/.local/lib/python3.10/site-packages/telebot/__init__.py", line 1074, in __threaded_polling
    self.worker_pool.raise_exceptions()
    ^   оператор, вызвавший ошибку    ^

    Смотрим записи по одной, сверу вниз, и ищем те, которые относятся к твоему коду. У тебя только одна такая запись:
    File "/home/maksim/Загрузки/Python/Квест/Квест.py", line 33, in questions
    bot.send_message(_id, 'Комфортно ли вам находиться в обществе?', reply_markup=markup)

    Почему именно эта? Потому что только в ней путь к файлу не ссылается на lib/python
    Значит, ошибка именно в строке
    bot.send_message(_id, 'Комфортно ли вам находиться в обществе?', reply_markup=markup)

    Текст ошибки звучит как chat not found. Т.е. не найден чат с таким идентификатором, который ту указал. А значит, в переменной _id содержится неправильное значение. Выясняй, как оно туда попало.
    Ответ написан
    Комментировать
  • Как правильно регистрировать ID пользователя через телеграмм?

    Vindicar
    @Vindicar
    RTFM!
    По твоей схеме - никак. Или бот должен заранее знать ID пользователя, или пользователь должен доказать, что логин - его.

    Я бы на сайте генерил пользователю уникальный одноразовый код и сохранял бы его в БД.
    А в боте по /start выводил бы сообщение, мол, введите свой код. При вводе кода ищи его в БД, если нашел - помечаешь пользователя как зареганного и записываешь его ID.
    Нужно будет навесить пару прибабахов типа возможности запросить новый код, защиту от попыток перебора кодов, и т.п., но суть от этого не меняется.
    Ответ написан
    1 комментарий
  • Ошибка IndexError: list index out of range. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Включить голову и подумать, что же ещё.
    value = call.data.upper().split('/')
    Ты ожидаешь, что call.data будет содержать хотя бы один знак /, тогда value будет содержать два элемента - с индексом 0 и индексом 1. Раз IndexError, значит, скорее всего, value содержит только один элемент. А это слуится если call.data не содержит разделителя, в твоём случае /.
    b1 = types.InlineKeyboardButton('USD/EUR', callback_data='usdeur')

    Ну собственно, ты и задаёшь значения callback_data, не содержащие /. Вот и вся разгадка.
    Ответ написан
    Комментировать
  • Как сделать функцию горячих клавиш в telegram боте?

    Vindicar
    @Vindicar
    RTFM!
    Не надо пытаться описывать обработчик в обработчике. Это никогда не сработает так, как ты ожидаешь.
    Если бы дал себе труд погуглить, вышел бы на register_next_step_handler() и как им пользоваться.

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

    Vindicar
    @Vindicar
    RTFM!
    У тебя bot.polling() почему-то с отступом. Как будто он внутри save_vk_id_to_database().
    Проверь код ещё раз. Отступы в питоне критичны!
    Ответ написан
    Комментировать
  • Запускаю код вроде все работает но при вводе команды старт ничего не происходит.Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Не, ну а ты что ожидал?
    Клавиатура, вообще-то, прикрепляется к сообщению.
    А ты никакого сообщения не отправляешь.

    Собственно, у тебя в bot_message() пример как правильно.
    Ответ написан
  • Выдает ошибку Traceback (most recent call last) что делать?

    Vindicar
    @Vindicar
    RTFM!
    У класса TeleBot нет метода edited_message_text(). Ты неправильно написал название.
    Ответ написан
  • Почему при попытке get_chat_member вылезает ошибка User not found telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что chatid должен быть уникальным номером пользователя, а не логином, номером телефона или чем-то ещё. По типу того, который можно найти в message.chat.id.
    Ответ написан
  • Не меняется параметр call.data в тг-боте, почему и где я допустил ошибку?

    Vindicar
    @Vindicar
    RTFM!
    @dp.callback_query_handler()
    async def callback(call):
      await call.message.answer(f'Понял Принял! Теперь напиши пожалуйста, в каком городе будем смотреть {call.data}')
      print(call.data)
      @dp.message_handler(content_types=['text'])  # обработчик событий объявлен внутри другого?
      async def city(message: types.Message):

    Это НЕ будет работать так, как ты ожидаешь. При каждом выполнении callback() будет попытка добавить ещё один обработчик, но предыдущие обработчики так и останутся. А поскольку вызывается обычно только самый первый обработчик, то только самый первый вариант и будет обрабатываться.

    Открой для себя Finite State Machine, ну и в целом получи хоть какое-то представление как работает используемая тобой библиотека, что в ней можно делать, а что нельзя.
    Ответ написан
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    Vindicar
    @Vindicar
    RTFM!
    xx_RuBiCoN_xx, ну потому что надо не просто копипастить код, а документацию изучать, чтобы понимать, за что отвечает каждая часть твоего кода.
    @bot.callback_query_handler(func=lambda call: True)

    Параметр func должен содержать ссылку на функцию-фильтр, которая определит, должен ли данный обработчик вызываться для данного callback query. При этом вызовется первый подходящий обработчик, т.е. первый обработчик, у котого фильтр вернёт True.
    У тебя везде понатыкано lambda call: True, т.е. "для любого query вызывать этот обработчик". Как следствие, первый объявленный "универсальный" обработчик вызывается всегда и для всего. На имя функции боту наплевать.

    Самый простой способ разделить код на два обработчика - убедиться, что call.data имеет хорошо различимые значения. Например, добавить префикс: у кнопок для одного обработчика call.data пусть всегда начинается с "btn1.", а у другого с "btn2.". Тогда можно будет написать функцию-фильтр вида lambda call: call.data.startswith('btn1.') и т.п.
    Ответ написан
    2 комментария