Бот отправляет 2 раза сообщение, которое не нужно отправлять в данный момент + не хочет отправлять результаты в группу

Суть бота в прохождении теста (ссылаа на форму, кторая определяется рандомом из массива). Человек выберает нужный тест, после прохождения нажимает кнопку "готово", после нажатия пользователю идёт текст, а в группу нужно отправить какие варианты теста были решены. бот имеет админку с фулл правами в группе, но сообщение ему не отправляются, а также после сообщении об отправке теста бот присылает пользователю 2 раза: "кто ты?" с инлайн кнопками и сообщение с точкой Вот собственно код:

import random

import telebot
from telebot import types

bot = telebot.TeleBot('токен')

@bot.message_handler(commands=['get_test'])
def test(message):
    tests_g = ['...']
    test_g = random.choice(tests_g)
    tests_k = ['...']
    test_k = random.choice(tests_k)
    markup = types.InlineKeyboardMarkup()
    markup.row(types.InlineKeyboardButton('Г', url=f'https://forms.gle/{test_g}'))
    markup.row(types.InlineKeyboardButton('К', url=f'https://forms.gle/{test_k}'))
    markup2 = types.ReplyKeyboardMarkup()
    markup2.row(types.KeyboardButton('Готово'))
    bot.send_message(message.chat.id, 'Кто ты?', reply_markup=markup)
    bot.send_message(message.chat.id, '.', reply_markup=markup2)
    bot.register_next_step_handler(message, well)
    return (test_g, test_k)

def well(message):
    bot.send_message(message.chat.id, 'Тест успешно пройден! Результаты будут известны как только мы проверим тест. Ожидайте сообщения от этого бота')
    bot.send_message(айди группы, f'@{message.from_user.username} / {message.from_user.id} отправил тест на проверку\nЕго варианты были\nhttps://forms.gle/{test(message)[0]}\nhttps://forms.gle/{test(message)[1]}')
bot.polling(none_stop=True)

Ответы (1 шт):

Автор решения: Ben Puls

Начнём с простого:

Бот отправляет 2 раза сообщение, которое не нужно отправлять в данный момент

Декоратор @bot.message_handler(commands=['get_test']) слушает определённую команду, затем функция написанная ниже исполняется. Далее в функции well() вы снова воспроизводите функцию test(). В результате этих манипуляцией функция test() выполняется дважды.

Что можно сделать, чтобы это исправить? Во первых, функция test() не должна ничего возвращать, получать данные вы должны иным образом, чтобы избежать повторного запуска функции. Можно использовать базы данных, бот у вас синхронный, поэтому можно использовать базу данных sqlite, туда записываете необходимые данные, а потом через callback от кнопки ищите строку по id пользователя и выводите данные в канал.

В целом можно хранить такие данные и в переменной, но важно понимать, что после перезагрузки вашего бота, все данные исчезнут. Подумайте, как вам будет удобно сохранять эти данные.

не хочет отправлять результаты в группу

Создаём чат в Telegram, включаем режим разработчика. Здесь нам представлен id группы: введите сюда описание изображения

Если мы попробуем отправлять на этот id какие-то сообщения, то будем получать от Telegram ошибку о том, что чат не найден:

telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: chat not found

Тогда давайте попробуем отследить id чата по сообщению, для этого слушаем новое сообщение и выводим через print() id чата print(message.chat.id). Видим следующее: -1002225644004

Можно предположить, что вы указали не тот ID из-за этого возникли ошибки.

Немного подытожу, вам необходимо переписать код таким образом, чтобы данные о выбранных тестах сохранялись в базе данных, затем после нажатия на кнопку вы должны найти эту запись в базе данных и получить оттуда необходимую информацию после, отправив данные в чат.

→ Ссылка