Я разобрался кое-как, можно после создания страницы и браузера возвращать эти объекты из функции создании браузера и страницы, затем это объекты записывать в стейт (FSMContext) и уже после введенного кода делать вводить его на странице в стейте.
import asyncio
from playwright.async_api import async_playwright
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher import State, StatesGroup
API_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
# Определение состояний для FSM
class Form(StatesGroup):
waiting_for_phone = State()
waiting_for_code = State()
async def login_with_playwright(phone_number: str):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False) # Установите headless=True для запуска без GUI
page = await browser.new_page()
await page.goto('URL_ВАШЕГО_САЙТА')
# Ввод номера телефона
await page.fill('input[name="phone"]', phone_number)
await page.click('button#send-code') # Замените селектор на ваш
# Ждем, пока код придет (например, 30 секунд)
await asyncio.sleep(30) # Увеличьте время ожидания, если нужно
return page # Возвращаем страницу для дальнейшего использования
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
await Form.waiting_for_phone.set()
await message.reply("Введите ваш номер телефона:")
@dp.message_handler(state=Form.waiting_for_phone)
async def process_phone(message: types.Message, state: FSMContext):
phone_number = message.text
await state.update_data(phone_number=phone_number)
# Отправляем номер телефона на сайт и получаем страницу
page = await login_with_playwright(phone_number)
# После отправки номера сообщаем пользователю о необходимости ввести код
await message.reply("Код был отправлен на ваш номер. Пожалуйста, введите его:")
await state.update_data(page=page) # Сохраняем страницу в состоянии
await Form.waiting_for_code.set()
@dp.message_handler(state=Form.waiting_for_code)
async def process_code(message: types.Message, state: FSMContext):
user_data = await state.get_data()
phone_number = user_data.get('phone_number')
sms_code = message.text
page = user_data.get('page')
# Здесь можно добавить логику для ввода кода на сайте
await page.fill('input[name="code"]', sms_code) # Замените селектор на ваш
await page.click('button#submit-code') # Замените селектор на ваш
await state.finish()
await message.reply("Вы успешно вошли в систему!")
if __name__ == '__main__':
from aiogram import executor
executor.start_polling(dp, skip_updates=True)