Пользователь должен ввести email дважды, чтобы получить следующее сообщение от бота

Рейтинг: -1Ответов: 1Опубликовано: 24.06.2023

Я пишу бота на aiogram, и у меня возникла проблема. Пользователь должен ввести номер дважды, чтобы получить следующее сообщение от бота. Вот пример: Bot, [24.06.2023 20:54] Write email

Рамиль, [24.06.2023 20:54] @

Рамиль, [24.06.2023 20:54] @

Bot, [24.06.2023 20:54] Choose action:

Вот код

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message, state: FSMContext):
    email=message.text
    if email.startswith("@"):
        await Form.next()
    else:
        await message.answer("Write email pls")

Что не так?

Вот весь код

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
import re

from states import Form

bot = Bot(token='TOKEN')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


@dp.message_handler(Command('start'))
async def start(message: types.Message, state: FSMContext):
    await message.answer("Привет, я чат-бот Wonder Women - самого доброго и созидательного комьюнити Центральной Азии:)\n\nЗдесь ты можешь купить билет на WWTalks, который состоится 10 декабря.\nНо сначала давай познакомимся поближе:\n\nНапиши, пожалуйста, своё имя")

    await Form.surname.set()
    
@dp.message_handler(state=Form.surname)
async def process_name(message: types.Message, state: FSMContext):
    await state.update_data(surname=message.text)
    await message.answer("Напиши, пожалуйста, свою фамилию")
    await Form.phone_number.set()

@dp.message_handler(state=Form.phone_number)
async def process_surname(message: types.Message, state: FSMContext):
    phone_number = message.text
    phone_number_pattern = r'^\+7\d{1}$'
    if not re.match(phone_number_pattern, phone_number):
        await message.answer("Напиши, пожалуйста, свой номер телефона по формату +7----------")
    else:
        await Form.email.set()

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message, state: FSMContext):
    email=message.text
    if email.startswith("@"):
        await Form.next()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

@dp.message_handler(state=Form.buy_or_more)
async def process_email(message: types.Message, state: FSMContext):

    keyboard = InlineKeyboardMarkup()
    buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
    more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
    keyboard.add(buy_button)
    keyboard.add(more_button)

    await message.answer("Выберите действие:", reply_markup=keyboard)
    await Form.next()

@dp.callback_query_handler(lambda c: c.data == 'buy', state=Form.buy)
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"  # Замените ссылкой на покупку билета
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")

    await Form.next()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
    # Process the questions
    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для . "
                                                 "Ждем вас на нашей встрече!\n\nКоманда")


@dp.callback_query_handler(lambda c: c.data == 'more', state=Form.more)
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n" 
    await bot.send_message(callback_query.from_user.id, details_text)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
    email = message.text
    if email.startswith("@"):
        keyboard = InlineKeyboardMarkup()
        buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
        more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
        keyboard.add(buy_button)
        keyboard.add(more_button)
        await message.answer("Выберите действие:", reply_markup=keyboard) # <- сообщение и клавиатура перенесена сюда
        await Form.buy_or_more.set()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")

    await Form.screen.set()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
    # Process the questions
    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для WWTalks. "
                                                 "Ждем вас на нашей встрече!\n\nКоманда Wonder Women")
    await Form.buy_or_more.set()


@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n" 
    await bot.send_message(callback_query.from_user.id, details_text)

Еще почему то не работают inline кнопки.

Ответы

▲ 1Принят

Покажу кусок вашего кода, как должно быть, далее думаю поймете как остальное переделать

@dp.message_handler(state=Form.phone_number)
async def process_surname(message: types.Message, state: FSMContext):
    phone_number = message.text
    phone_number_pattern = r'^\+7\d{10}$'
    if not re.match(phone_number_pattern, phone_number):
        await message.answer("Напиши, пожалуйста, свой номер телефона по формату +7----------")
    else:
        await message.answer("Напиши, пожалуйста, свой email") # <- сообщение с просьбой ввести email
        await Form.email.set()


@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
    email = message.text
    if email.startswith("@"):
        keyboard = InlineKeyboardMarkup()
        buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
        more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
        keyboard.add(buy_button)
        keyboard.add(more_button)
        await message.answer("Выберите действие:", reply_markup=keyboard) # <- сообщение и клавиатура перенесена сюда
        await Form.buy_or_more.set()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

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