Бот отвечает на собственные сообщения
Пишу бота для техподдержки.Когда я отправляю вопрос, бот пересылает его на канал и начинает пересылать его тоже. И так продолжается бесконечно.
Пример(User- пользователь, который отправил боту вопрос, Bot1- бот, который отвечает пользователю, Bot2- бот, который пишет в канал)
P.S. Bot1 и Bot2 - один и тот же бот, написано для облегчения понимания.
**Пользователь:** /start
**Бот1**: Привет! Я бот технической поддержки. Опишите вашу проблему, и я передам ее операторам.
**Пользователь**: *описывает свою проблему*
**Бот1**: *отвечает на сообщение* Сообщение было передано операторам. Ожидайте ответа.
**Бот2:** Отправляет сообщение на канал
**Оператор:** *В комментариях к сообщению отвечает*
**Бот2:** Пожалуйста, используйте команду /start для начала общения.
bot = Bot(token='TOKEN') dp = Dispatcher(bot, storage=MemoryStorage()) nlp = spacy.load('ru_core_news_lg') conn = sqlite3.connect('database.db') db = conn.cursor() class States(StatesGroup): QUESTION = 'question' ANSWER = 'answer' FEEDBACK = 'feedback' @dp.message_handler(commands=['start']) async def start_command(message: types.Message, state: FSMContext): await state.finish() await state.update_data(question=message.text) await send_to_operators(message.chat.id, state) @dp.message_handler() async def handle_message(message: types.Message, state: FSMContext): if message.text.lower() == 'завершить диалог': data = await state.get_data() question = data.get('question') answer = message.text save_to_database(question, answer) await bot.send_message(message.chat.id, "Диалог завершен. Если у вас возникнут еще вопросы, не стесняйтесь обращаться.") await state.finish() else: await bot.send_message(message.chat.id, "Пожалуйста, используйте команду /start для начала общения.") def find_answer(question): question_doc = nlp(question) best_match = None best_score = 0.0 for row in db: answer_doc = nlp(row['answer']) score = question_doc.similarity(answer_doc) if score > best_score: best_match = row['answer'] best_score = score return best_match async def send_answer(chat_id, answer): keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) keyboard.add(types.KeyboardButton('Да'), types.KeyboardButton('Нет')) await bot.send_message(chat_id, answer, reply_markup=keyboard) async def send_to_operators(question, state: FSMContext): channel_id = 'ID' data = await state.get_data() question = data.get('question') await bot.send_message(channel_id, f"Новый вопрос от пользователя:\n\n{question}") @dp.channel_post_handler(content_types=[types.ContentType.TEXT]) async def handle_operator_reply(message: types.Message): if message.reply_to_message: user_question = message.reply_to_message.text operator_reply = message.text user_id = message.reply_to_message.from_user.id await bot.send_message(user_id, operator_reply) def save_to_database(question, answer): db.execute("INSERT INTO question_answer (question, answer) VALUES (?, ?)", (question, answer)) conn.commit() @dp.message_handler(state=States.QUESTION) async def handle_question(message: types.Message, state: FSMContext): question = message.text doc = nlp(question) processed_question = ' '.join([token.lemma_ for token in doc]) answer = find_answer(processed_question) if answer != None: await send_answer(message.chat.id, answer) await state.update_data(question=question) await States.ANSWER.set() else: await send_to_operators(message.text) await bot.send_message(message.chat.id, "Ваш вопрос передан операторам. Пожалуйста, ожидайте ответа.") data = await state.get_data() question = data.get('question') answer = message.text save_to_database(question, answer) await state.finish() @dp.message_handler(content_types=types.ContentType.TEXT, state=States.ANSWER) async def handle_feedback(message: types.Message, state: FSMContext): if message.text.lower() == 'да': await bot.send_message(message.chat.id, "Спасибо! Всего доброго.") await state.finish() # Завершение состояния elif message.text.lower() == 'нет': # Отправляем вопрос операторам await send_to_operators(message.text) await bot.send_message(message.chat.id, "Ваш вопрос передан операторам. Пожалуйста, ожидайте ответа.") data = await state.get_data() question = data.get('question') answer = message.text save_to_database(question, answer) await state.finish() elif message.text.lower() == 'завершить диалог': data = await state.get_data() question = data.get('question') answer = message.text save_to_database(question, answer) await bot.send_message(message.chat.id, "Диалог завершен. Если у вас возникнут еще вопросы, не стесняйтесь обращаться.") await state.finish() else: await bot.send_message(message.chat.id, "Пожалуйста, используйте кнопки для ответа.") if __name__ == '__main__': logging.basicConfig(level=logging.INFO) asyncio.run(dp.start_polling())