3

我需要使用ApifyZapier来自动化 i)登录到受密码保护的网页和 ii)单击按钮。我怎样才能做到这一点?

我想我应该在 Actor 中使用 Puppeteer,但我不确定如何。

目标 URL 会不时更改。它们的格式是https://studio.example.com/products/videocloud/media/videos/{id_code}where {id_code}is,例如6091481925001.

1.扎皮尔

Zapier 应该调用 Apify Actor 来完成这项工作。现有 zap 中的操作已经可以访问动态{id_code}. 一个额外的动作应该“运行 Actor”给 Apify,将一个{id_code}或完整的 URL传递https://studio.example.com/products/videocloud/media/videos/6091481925001给 Apify 以在其上运行。

如何通过“输入正文”正确地将值传递给 Apify?

在此处输入图像描述

2. 登录

在未经身份验证的情况下访问时,页面将重定向到登录表单https://signin.example.com/?redirect=https%3A%2F%2Fstudio.example.com%2Fproducts%2Fvideocloud%2Fmedia%2Fvideos%2F6091481925001

  • “电子邮件地址”(input带有id="email"name="email"
  • “密码”(inputid="password"name="password"
  • “登录”按钮(button带有id="signinButton"type="submit"

如何在此处使用 Actor 登录?

在此处输入图像描述

3. 点击

一旦通过身份验证,就会出现目标页面。它有一个按钮栏,包括“激活”按钮(如果我们被允许单击它button,其子span文本只能是“激活”)。

(有关信息 - 单击后,按钮文本应变为“停用”)。

如何让 Apify 在此处单击“激活”按钮?

在此处输入图像描述

据我了解,这不是抓取工作,因为我不希望从网页返回数据,所以我不应该使用apify/puppeteer-scraperapify/web-scraper

更新:

到目前为止,我有以下内容。但是,Apify 中的 Puppeteer 超时 - 相当长的值高达 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.');


    });
4

2 回答 2

0

1)您可以将任意 JSON 传递给输入。通过 as 是有意义的

{
   "id_code": "ID_CODE_FROM_ZAPIER"
}

2)在 Apify 方面,您需要先读取输入

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

然后,您需要获取您的凭据。如果它们不改变,我会将它们保存为演员的环境变量。如果您将它们命名为EMAILPASSWORD,则可以通过以下方式在代码中访问它们

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()
})
于 2019-10-06T09:58:07.793 回答
0
  1. 您可以使用waitUntil参数,例如
await page.waitForNavigation({
   waitUntil: "networkidle2"  
});

** 检查文档以获取更多信息https://pptr.dev/#?product=Puppeteer&version=v1.20.0&show=api-pagewaitfornavigationoptions

  1. 或者您可以等待元素选择器出现在页面中,例如
await page.waitForSelector('.buttonSelector')

** 检查文档以获取更多信息https://pptr.dev/#?product=Puppeteer&version=v1.20.0&show=api-pagewaitforselectorselector-options

于 2019-10-12T18:30:09.843 回答