Как использовать Apify для входа на сайт и нажатия кнопки? - PullRequest
1 голос
/ 03 октября 2019

Мне нужно использовать Apify и Zapier для автоматизации i) входа на веб-страницу, защищенную паролем, и ii) нажатия кнопки. Как я могу это сделать?

Я думаю, что я должен использовать Puppeteer в Actor, но я не уверен, как.

Целевые URL время от времени будут меняться. Их формат https://studio.example.com/products/videocloud/media/videos/{id_code}, где {id_code}, например, 6091481925001.

1. Zapier

Zapier должен вызвать Apify Actor для выполнения работы. Действие в существующем zap уже имеет доступ к динамическому {id_code}. Дополнительное действие должно «Запускать Actor» для Apify, передавая либо {id_code}, либо полный URL https://studio.example.com/products/videocloud/media/videos/6091481925001 в Apify для запуска.

Как правильно передать значение в Apify через «Тело ввода»«?

enter image description here

2. Вход в систему

При доступе, не прошедшем проверку подлинности, страница перенаправляется в форму входа в https://signin.example.com/?redirect=https%3A%2F%2Fstudio.example.com%2Fproducts%2Fvideocloud%2Fmedia%2Fvideos%2F6091481925001 с:

  • «Адрес электронной почты» (input с id="email" и name="email")
  • «Пароль» (input с id="password" и name="password")
  • Кнопка «Вход» (button с id="signinButton" и type="submit")

Как использовать Актера для входа в систему здесь?

enter image description here

3. Нажмите

. После аутентификации появится целевая страница. Он имеет панель кнопок, включающую кнопку «Активировать» (button, чей дочерний текст span должен иметь значение «Активировать» только в том случае, если нам разрешено нажимать на него).

(Для информации - после нажатиятекст кнопки должен стать «Деактивировать»).

Как получить Apify, чтобы нажать здесь кнопку «Активировать»?

enter image description here

Насколько я понимаю, это не работа по очистке , поскольку я не собираюсь возвращать данные с веб-страницы, поэтому я не должен использовать apify / puppeteer-scraper или apify / web-scraper .

Обновление:

Пока у меня есть следующее. Тем не менее, Puppeteer внутри Apify истекает - при довольно длинных значениях до 9000 мсек, предполагая, что это не обязательно проблема загрузки страницы (?)

const Apify = require('apify');

    Apify.main(async () => {



        // Get credentials
        const { EMAIL, PASSWORD } = Apify.getEnv();         // Docs for using values: https://apify.com/docs/actor#source-env-vars


        // Launch Puppeteer
        const browser = await Apify.launchPuppeteer();
        const page = await browser.newPage();
        await page.goto('https://signin.example.com/login');

        // Login
        await page.type('#email', process.env.EMAIL);
        console.log('Attempted to enter email');

        await page.type('#password', process.env.PASSWORD);
        console.log('Attempted to enter password');

        await page.click('#signinButton');
        console.log('Attempted to click button');    

        // Times-out here

        await page.waitForNavigation();
        console.log('Attempted to wait for navigation');

        // Get cookies
        const cookies = await page.cookies();
        console.log('Attempted to wait for cookies');

        await browser.close();

        console.log('Done.');


    });

Ответы [ 2 ]

0 голосов
/ 12 октября 2019
  1. Вы можете играть с параметром waitUntil , например,
await page.waitForNavigation({
   waitUntil: "networkidle2"  
});

**. Проверьте документы для получения дополнительной информации https://pptr.dev/#?product=Puppeteer&version=v1.20.0&show=api-pagewaitfornavigationoptions

Или вы можете подождать, пока элемент селектор появится на странице, например,
await page.waitForSelector('.buttonSelector')

** Проверьте документы для получения дополнительной информации https://pptr.dev/#?product=Puppeteer&version=v1.20.0&show=api-pagewaitforselectorselector-options

0 голосов
/ 06 октября 2019

1) Вы можете передать произвольный JSON на вход. Имеет смысл передать только как

{
   "id_code": "ID_CODE_FROM_ZAPIER"
}

2) На стороне Apify вам нужно сначала прочитать ввод с помощью

const input = await Apify.getInput();
const { id_code } = input;

Затем вам нужно получить свои учетные данные. Если они не меняются, я бы сохранил их как переменные окружения актера. Если вы назовете их EMAIL и PASSWORD, вы сможете получить к ним доступ в коде через

const { EMAIL, PASSWORD } = Apify.getEnv();

Теперь вам нужно запустить Puppeteer, перейти на страницу входа, заполнить поля ввода и нажать кнопку Отправить. ,Это довольно просто, примеры приведены в этой статье . Теперь вам не нужно беспокоиться о файлах cookie.

3) После входа в систему необходимо перейти по нужному URL-адресу с помощью

await page.goto(`https://studio.example.com/products/videocloud/media/videos/${id_code}`)

. Чтобы найти точный элемент для нажатия. когда он не имеет полезных селекторов, это возможно с помощью JQuery и поиска текста. Я не могу войти в систему, поэтому я не уверен на 100%, что это сработает.

// We need to inject JQuery first
await Apify.utils.puppeteer.injectJQuery(page);

// We can use JQuery only in the browser context, which means inside evaluate
await page.evaluate(() => {
    $('button:contains("Activate")').click()
})
...