Задать вопрос
@temaSbn

Почему callback-функция не повторяется второй раз?

Почему не повторяется функция?
хочу сделать, что бы из главного меню нажимаешь кнопку, происходит действие, бот выводит сообщение, у него есть кнопка возвращения к главному меню. При нажатии в первый раз все работает хорошо, при повторном вылезает большая ошибка
Код:
import telebot
import webbrowser
from telebot import types

bot = telebot.TeleBot('токен')
photo = open('./BMWe34.jpg', 'rb')
#Обработка команды старт
@bot.message_handler(commands=['start'])
def start(message):
    # Добавляются кнопки
    markup = types.InlineKeyboardMarkup()
    btn1 = types.InlineKeyboardButton('Биография', callback_data='Биография')
    btn2 = types.InlineKeyboardButton('Ассортимент товаров', callback_data='Ассортимент')
    markup.row(btn1, btn2)
    # Бот выводит фото + текст
    bot.send_photo(message.chat.id, photo, caption='Бот для пискоебатела2005', reply_markup=markup)
@bot.callback_query_handler(func=lambda callback:True)
def callDef(callback):
    # Обработка кнопки биография
    if callback.data == 'Биография':
        markup = types.InlineKeyboardMarkup()
        btn = types.InlineKeyboardButton('Главное меню', callback_data='menu')
        markup.add(btn)
        bot.send_message(callback.message.chat.id, 'Биография Пушкина', reply_markup=markup)
        bot.delete_message(callback.message.chat.id, callback.message.message_id)
    # Обработка кнопки ассортимент
    elif callback.data == 'Ассортимент':
        markup = types.InlineKeyboardMarkup()
        books = types.InlineKeyboardButton('кНиги', callback_data='booksDef')
        picture = types.InlineKeyboardButton('Картины', callback_data='picturesDef')
        souvenirs = types.InlineKeyboardButton('Сувениры', callback_data='souvenirsDef')
        btn = types.InlineKeyboardButton('Главное меню', callback_data='menu')
        markup.row(books, picture, souvenirs)
        markup.add(btn)
        bot.send_message(callback.message.chat.id, 'Каталог товаров', reply_markup=markup)
        bot.delete_message(callback.message.chat.id, callback.message.message_id)
    #Обработка возвращения меню
    elif callback.data == 'menu':
        # Добавляются кнопки
        btns = types.InlineKeyboardMarkup()
        bio = types.InlineKeyboardButton('Биография', callback_data='Биография')
        catalog = types.InlineKeyboardButton('Ассортимент товаров', callback_data='Ассортимент')
        btns.row(bio, catalog)
        # Бот выводит фото + текст
        bot.send_photo(callback.message.chat.id, photo, caption='Бот для пискоебатела2005', reply_markup=btns)
        bot.delete_message(callback.message.chat.id, callback.message.message_id)

bot.polling(none_stop=True)


Ошибка:
"C:\python projects\.venv\Scripts\python.exe" "C:\python projects\main.py" 
2025-01-20 17:55:09,461 (__init__.py:1241 MainThread) ERROR - TeleBot: "Threaded polling exception: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: file must be non-empty"
2025-01-20 17:55:09,463 (__init__.py:1243 MainThread) ERROR - TeleBot: "Exception traceback:
Traceback (most recent call last):
  File "C:\python projects\.venv\Lib\site-packages\telebot\__init__.py", line 1235, in __threaded_polling
    self.worker_pool.raise_exceptions()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\python projects\.venv\Lib\site-packages\telebot\util.py", line 150, in raise_exceptions
    raise self.exception_info
  File "C:\python projects\.venv\Lib\site-packages\telebot\util.py", line 93, in run
    task(*args, **kwargs)
    ~~~~^^^^^^^^^^^^^^^^^
  File "C:\python projects\.venv\Lib\site-packages\telebot\__init__.py", line 9233, in _run_middlewares_and_handler
    result = handler['function'](message)
  File "C:\python projects\main.py", line 45, in callDef
    bot.send_photo(callback.message.chat.id, photo, caption='Бот для пискоебатела2005', reply_markup=btns)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\python projects\.venv\Lib\site-packages\telebot\__init__.py", line 2299, in send_photo
    apihelper.send_photo(
    ~~~~~~~~~~~~~~~~~~~~^
        self.token, chat_id, photo, caption=caption, reply_markup=reply_markup,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
        business_connection_id=business_connection_id, message_effect_id=message_effect_id,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        show_caption_above_media=show_caption_above_media, allow_paid_broadcast=allow_paid_broadcast))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\python projects\.venv\Lib\site-packages\telebot\apihelper.py", line 545, in send_photo
    return _make_request(token, method_url, params=payload, files=files, method='post')
  File "C:\python projects\.venv\Lib\site-packages\telebot\apihelper.py", line 168, in _make_request
    json_result = _check_result(method_name, result)
  File "C:\python projects\.venv\Lib\site-packages\telebot\apihelper.py", line 195, in _check_result
    raise ApiTelegramException(method_name, result, result_json)
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: file must be non-empty
"
  • Вопрос задан
  • 46 просмотров
Подписаться Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Есть маааааленькая проблемка. Ты забыл/не знал, как работают файлы. А именно, у них есть такая штука как "текущая позиция", по которой выполняется чтение-запись. В итоге:
1. Ты открываешь файл в начале кода. Его текущая позиция - в начале файла.
2. Ты делаешь отправку файла. Бот читает содержимое файла до конца для отправки. Теперь текущая позиция - в конце файла.
3. Ты снова пытаешься отправить тот же файл. Бот не может прочитать содержимое файла, потому что текущая позиция - в конце, читать в конце уже нечего. А в начало бот сам не "перематывает", он же без понятия, что у тебя за файл.

Просто открывай файл каждый раз при отправке (и не забудь закрыть, оператор with в помощь), а не один раз в начале скрипта.
Либо, если прямо очень-очень хочется держать файл открытым, каждый раз перед отправкой "перемотай" файл на начало методом seek().
Ответ написан
Комментировать
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Вашу писанину оформленную не по правилам не смотрел - но вот вопрос с похожей проблемой:
Что делать если выдает ошибку 400 для телеграм бота на python?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы