Michael
Michael

Reputation: 3

RESTful Chromless implementation

I am looking for a way to use headless chrome similar to what chromeless does but instead of being implemented as a nodejs endpoint, allowing restful requests with the html content as a payload.

I want to run this service on aws lambda being triggered through API Gateway. Does anyone have experience with this usecase?

Upvotes: 0

Views: 360

Answers (1)

Marco Lüthy
Marco Lüthy

Reputation: 1309

There's nothing keeping you from using Chromeless in your use-case. Chromeless can be used within an AWS Lambda function. You can take a (RESTful) request coming from AWS API Gateway and then do something with it and Chromeless. You can combine the @serverless-chrome/lambda package with Chromeless to get headless Chrome running within Lambda so that Chrome is available to Chromeless. The Chromeless Proxy works in a similar way. For example, your Lambda function's code might look like (this is untested code I just cobbled together, but should convey the idea):

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)
    })
}

You'll find a similar thread on the Chromeless Issue tracker here.

Disclosure: I'm a collaborator/author of these packages.

Upvotes: 4

Related Questions