2017-08-08 65 views
0

我正在尋找一種方法來使用類似於chromeless所做的headless chrome,但不是作爲nodejs端點實現,而是允許將html內容作爲有效負載的平穩請求。RESTful Chromless implementation

我想通過API網關觸發aws lambda運行此服務。有沒有人有這個用例的經驗?

+0

歡迎來到Stack Overflow。你會發現「有人有......嗎?」在這裏通常不被認爲是一個[好問題](https://stackoverflow.com/help/how-to-ask)。在這裏,一個很好的問題是試圖理解和解決特定的編程問題。例如,在這裏,我建議你需要嘗試你想完成的任務,並且當你手頭有代碼時提出問題,並且提供一個最小化,完整,可驗證的例子(MCVE),這個例子不能像預期的那樣工作。 –

+0

Chromeless看起來應該很容易適應您的使用情況,方法是從請求主體中提取HTML,將其保存到文件或S3存儲桶,然後以編程方式導航到它。 –

回答

3

在你的使用案例中,沒有什麼能夠阻止你使用Chromeless。可以在AWS Lambda函數中使用Chromeless。您可以接收來自AWS API Gateway的(RESTful)請求,然後使用它和Chromeless進行操作。您可以將@serverless-chrome/lambda包與Chromeless結合使用,以便在Lambda中運行無頭Chrome瀏覽器,以便Chrome可用於Chromeless。 Chromeless Proxy以類似的方式工作。例如,您的lambda函數的代碼可能看起來像(這是未經測試的代碼,我只是拼湊,而是應該傳達的想法):

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

你會發現無邊框問題跟蹤here類似的線程。

披露:我是這些軟件包的合作者/作者。