Почему не обрабатываются сообщения пользователя?
Пишу бота для техподдержки. Бот не обрабатывает сообщения текстовые, никак не реагирует. Отправляешь /start
, он отвечает, а дальше ему без разницы что происходит. Никаких ошибок и ничего такого. Накосячил с FSM скорее всего, но не могу понять где, помогите, пожалуйста.
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 message.reply('Привет! Я готов отвечать на вопросы.')
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):
channel_id = 'ID'
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())
Источник: Stack Overflow на русском