Реализация RESTful Chromeless

Я ищу способ использовать безголовый хром, аналогичный тому, что делает chromeless, но вместо того, чтобы быть реализованным как конечная точка nodejs, разрешающая спокойные запросы с html-контентом в качестве полезной нагрузки.

Я хочу запустить эту службу на лямбде aws, запускаемой через шлюз API. У кого-нибудь есть опыт использования этого варианта использования?


person Michael    schedule 08.08.2017    source источник
comment
Добро пожаловать в Stack Overflow. Вы найдете У кого-нибудь есть...? обычно не считается здесь хорошим вопросом. Хороший вопрос здесь направлен на то, чтобы понять и решить конкретную проблему программирования. Здесь, например, я бы посоветовал вам попробовать то, чего вы хотите достичь, и задавать вопросы, когда у вас есть код и минимальный, полный, проверяемый пример (MCVE) чего-то, что не работает должным образом.   -  person Michael - sqlbot    schedule 09.08.2017
comment
Chromeless выглядит так, как будто его можно легко адаптировать к вашему варианту использования, извлекая HTML-код из тела запроса, сохраняя его в файл или корзину S3, а затем программно переходя к нему.   -  person Michael - sqlbot    schedule 09.08.2017


Ответы (1)


Ничто не мешает вам использовать Chromeless в вашем случае. Chromeless можно использовать в функции AWS Lambda. Вы можете принять запрос (RESTful), поступающий от AWS API Gateway, а затем что-то сделать с ним и Chromeless. Вы можете комбинировать пакет @serverless-chrome/lambda с Chromeless, чтобы запустить безголовый Chrome в Lambda, чтобы Chrome был доступен для Chromeless. Аналогичным образом работает прокси-сервер Chromeless. Например, код вашей лямбда-функции может выглядеть так (это непроверенный код, который я только что собрал, но он должен передать идею):

const launchChrome = require('@serverless-chrome/lambda')
const Chromeless = require('chromeless').Chromeless

module.exports.handler = function handler (event, context, callback) {
  const body = JSON.parse(event.body) // event.body coming from API Gateway
  const url = body.url
  const evaluateJs = body.evaluateJs

  launchChrome({
    flags: ['--window-size=1280x1696', '--hide-scrollbars'],
  })
    .then((chrome) => {
      // Chrome is now running on localhost:9222

      const chromeless = new Chromeless({
        launchChrome: false,
      })

      chromeless
        .goto(url)
        .wait('body')
        .evaluate(() => `
          // this will be executed in headless chrome
          ${evaluateJs}
        `)
        .then((result) => {
          chromeless
            .end()
            .then(chrome.kill) // https://github.com/adieuadieu/serverless-chrome/issues/41#issuecomment-317989508
            .then(() => {
              callback(null, {
                statusCode: 200,
                body: JSON.stringify({ result })
              })
            })
        })
        .catch(callback)
    })
    .catch((error) => {
      // Chrome didn't launch correctly
      callback(error)
    })
}

Вы найдете похожую тему в системе отслеживания проблем Chromeless здесь.

Раскрытие информации: я соавтор/автор этих пакетов.

person Marco Lüthy    schedule 09.08.2017