Ошибка в телеграм-боте при работе с google translate

Рейтинг: 0Ответов: 2Опубликовано: 19.03.2023

Бот должен переводить текст пользователя после сообщения (Переводчик) бот выдаёте ошибку введите сюда описание изображения

bot = telebot.TeleBot(API_TOKEN)
translator = Translator()

@bot.message_handler(commands=['start'])
def start(message):

    message_user = f"<b>{message.from_user.first_name.title()}</b>, приветствую тебя\n\n" \
                   f"<b>Выбери то, что тебя интересует ниже:</b>\n" \
                   f"1. Документация о боте\n" \
                   f"2. Чем полезен данный бот\n" \
                   f"3. Функционал бота(что может данный бот)\n" \
                   f"4. Для тех кто хочет поддержать нас и наш проект"
    keybord = types.ReplyKeyboardMarkup(resize_keyboard=True)
    but = types.KeyboardButton(text="Документация бот")
    but1 = types.KeyboardButton(text="Чем полезен бот ?")
    but2 = types.KeyboardButton(text="Функции бота")
    but3 = types.KeyboardButton(text="Поддержать проект")
    keybord.add(but, but1, but2, but3)
    bot.send_message(message.from_user.id, message_user, reply_markup=keybord, parse_mode='html')
    bot.register_next_step_handler(message, documentation_KEYBORD_bot)
    bot.register_next_step_handler(message, impact_KEYBORD_bot)
    bot.register_next_step_handler(message, fuctional_KEYBORD_bot)
    bot.register_next_step_handler(message, donat_user_bot)



@bot.message_handler(content_types=['text'])
def documentation_KEYBORD_bot(message):

    if message.text == 'Документация бот':

        file = open('Документация.docx', 'rb')
        bot.send_document(message.from_user.id, file, caption="Документация")
        bot.register_next_step_handler(message, impact_KEYBORD_bot)
        bot.register_next_step_handler(message, fuctional_KEYBORD_bot)
        bot.register_next_step_handler(message, donat_user_bot)


def impact_KEYBORD_bot(message):

    if message.text == "Чем полезен бот ?":

        message_user = "Этот бот много чем будет полезен для вас. Ознакомьтесь с функционалом бота чтобы понять это." \
                       " В этого бота со временем мы будем внедрять новые фичи и полезные функции. Чтобы узнавать о новых фишках бота, слидите за нашим Telegramm каналом \n\n" \
                       "<b>С уважением - разработчики.</b>"
        key = types.InlineKeyboardMarkup()
        button = types.InlineKeyboardButton(text='Наш TG канал', url="https://t.me/+nO5RUs96qBY0MTE6")
        key.add(button)

        bot.send_message(message.from_user.id, message_user, reply_markup=key, parse_mode='html')

        bot.register_next_step_handler(message, documentation_KEYBORD_bot)
        bot.register_next_step_handler(message, fuctional_KEYBORD_bot)
        bot.register_next_step_handler(message, donat_user_bot)



def fuctional_KEYBORD_bot(message):

    if message.text == 'Функции бота':

        message_user = "<b>Добро пожаловать главное меню бота 🤩</b>\n\n" \
                       "Надеюсь, ты найдёшь для себя что-то интересное. В скором будущем мы будем добавлять сюда новые функции!"

        key = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button0 = types.KeyboardButton("Переводчик")
        key.add(button0)
        bot.send_message(message.from_user.id, message_user, reply_markup=key, parse_mode='html')

        bot.register_next_step_handler(message, documentation_KEYBORD_bot)
        bot.register_next_step_handler(message, impact_KEYBORD_bot)
        bot.register_next_step_handler(message, donat_user_bot)
        bot.register_next_step_handler(message, translate_message)



def donat_user_bot(message):

    if message.text == "Поддержать проект":

        message_users = f"<b>Приветствую 🤗 уважаемый {message.from_user.first_name.title()}</b>, вы перешли в отдел поддержки нашего проекта 💸\n\n" \
                        f"Мы будем благодарны любой поддержки от вас. И также благодарим, что вы пользуетесь нашим ботом - это главная ваша поддержка для нас!\n\n" \
                        f"Мы принимаем материальную поддержку на:\n" \
                        f"<b>1. Donationalerts</b>\n" \
                        f"<b>2. PAYEER</b>\nномер счёта для пополнения: P1091200672\n" \
                        f"<b>3. QIWI</b>\n" \
                        f"<b>4. Тинькофф банк</b>"
        key = types.InlineKeyboardMarkup()
        button0 = types.InlineKeyboardButton(text="Donationalerts", url="https://www.donationalerts.com/r/tgbot_v")
        button1 = types.InlineKeyboardButton(text="PAYEER", url="https://payeer.com/ru/account/send/")
        button2 = types.InlineKeyboardButton(text="QIWI", url="https://my.qiwi.com/VLADYSLAV-DTJ4Y_MwOA")
        button3 = types.InlineKeyboardButton(text="Тинькофф банк", url="https://www.tinkoff.ru/cf/35TWsWpG8Fe")
        key.add(button0, button1, button2, button3)

        bot.send_message(message.from_user.id, message_users, reply_markup=key, parse_mode='html')
        bot.register_next_step_handler(message, documentation_KEYBORD_bot)
        bot.register_next_step_handler(message, impact_KEYBORD_bot)
        bot.register_next_step_handler(message, fuctional_KEYBORD_bot)



@bot.message_handler(content_types=['text'])
def translate_message(message):
    if message.text == 'Переводчик':
        bot.send_message(message.chat.id, 'Напишите сообщения а я переведу его')
        src = detect(message.text)
        dest = 'en'
        translated_text = 
    translator.translate(message.text, src=src, 
     `введите сюда код`dest=dest).text
        bot.send_message(message.chat.id, translated_text)


   if __name__ == '__main__':
    bot.polling(none_stop=True, interval=0)

Ответы

▲ 0

Очень похоже на баг в самом пакете py-googletrans

В этой строке идет поиск по регулярке и выход если поиск удачный

https://github.com/ssut/py-googletrans/blob/d15c94f176463b2ce6199a42a1c517690366977f/googletrans/gtoken.py#L56

А сюда выполнение приходит если поиск по регулярке неудался. При этом повторяется та же операция поиска по той же регулярке.

https://github.com/ssut/py-googletrans/blob/d15c94f176463b2ce6199a42a1c517690366977f/googletrans/gtoken.py#L62

И понятное дело, что если в 56-ой не нашел, то и в 62-ой не найдет.

Реши эту проблему, потом пиши им issue и сделай MR с решением. Потом на собесе скажешь что котрибьютишь в опен-сорс ;-)

P.S. Судя по коммитам выполнение не должно доходить до кода где ты ловишь ошибку.

https://github.com/ssut/py-googletrans/commit/94bd300e756ee1eb0ab7e1ffe6a68c0fedfbe2ef

Может тебе капча прилетает?

▲ 0

при вызове функции register_next_step_handler внутри обработчика команды /start, зарегистрированные обработчики заменятся при каждом вызове, и только последний зарегистрированный обработчик будет вызываться для следующего шага.

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

Для решения проблемы, необходимо зарегистрировать все обработчики в одном вызове register_next_step_handler.

bot.register_next_step_handler(message, documentation_KEYBORD_bot, impact_KEYBORD_bot, fuctional_KEYBORD_bot, donat_user_bot)