Задать вопрос
  • Как передавать данные в playwright из другой функции?

    @oktyabr_goldige Автор вопроса
    Я разобрался кое-как, можно после создания страницы и браузера возвращать эти объекты из функции создании браузера и страницы, затем это объекты записывать в стейт (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)
    Ответ написан
    Комментировать