Задать вопрос
@oktyabr_goldige

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

Я использую библиотеку Playwright чтобы асинхронно запускать несколько сессий. Так же я использую aiogram 3, чтобы запрашивать данные через телеграм-бота. И так, я пытаюсь залогиниться на сайте с смс кодом, тоесть сначала я должен вызывать функцию, которая запрашивает номер телефона от пользователя, в следующей функции уже его обрабатывать, затем получать смс-код от пользователя и уже в другой функции через state обрабатывать его и вводить на сайте логина. Я на знаю, как можно реализовать в playwright ожидание и затем ещё отправку смс кода.
  • Вопрос задан
  • 30 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@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)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы