2016-01-11 102 views
1

我們正在使用PhantomJS訪問我們公司的內部網站並截取屏幕截圖。從PhantomJS網站上的Ajax請求獲取狀態代碼

劇本基本上是PhantomJS與增加的WAITTIME變量 (https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js

var page = require('webpage').create(), 
    system = require('system'), 
    address, output, size; 

//waitTime is how long to to wait for kibana and the data to load in millis. 
//Increase this if your queries appear incomplete in your PDFs. 10s seems to work for me. 
var waitTime = 10 * 1000; 

if (system.args.length < 3 || system.args.length > 5) { 
    console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]'); 
    console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"'); 
    console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px'); 
    console.log('         "800px*600px" window, clipped to 800x600'); 
    phantom.exit(1); 
} else { 
    address = system.args[1]; 
    output = system.args[2]; 
    // Uncomment the following line to login. Replace user:pass with your username and password. 
    //page.customHeaders={'Authorization': 'Basic '+btoa('user:pass')}; 
    page.viewportSize = { width: 1280, height: 720 }; 
    if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") { 
     size = system.args[3].split('*'); 
     page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } 
              : { format: system.args[3], orientation: 'portrait', margin: '1cm' }; 
    } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") { 
     size = system.args[3].split('*'); 
     if (size.length === 2) { 
      pageWidth = parseInt(size[0], 10); 
      pageHeight = parseInt(size[1], 10); 
      page.viewportSize = { width: pageWidth, height: pageHeight }; 
      page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight }; 
     } else { 
      console.log("size:", system.args[3]); 
      pageWidth = parseInt(system.args[3], 10); 
      pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any 
      console.log ("pageHeight:",pageHeight); 
      page.viewportSize = { width: pageWidth, height: pageHeight }; 
     } 
    } 
    if (system.args.length > 4) { 
     page.zoomFactor = system.args[4]; 
    } 
    page.open(address, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
      phantom.exit(); 
     } else { 
      window.setTimeout(function() { 
       page.render(output); 
       phantom.exit(); 
      }, waitTime); 
     } 
    }); 
} 

我們訪問正在運行JavaScript的網站,那是做給數據庫的請求,官方的例子之一。但是,根據給定的查詢,此請求可能會花費很長時間(最長10分鐘)。

因此,我們想要做的不是提供一個靜態的10分鐘等待時間,我們希望從在訪問的網站上運行的JavaScript中提取狀態代碼,如果它到達200,腳本應該採取「截圖」。

我們的問題是我們不知道如何從網站本身獲取信息。 (我們如何克服使用過的PhantomJS腳本和訪問網站之間的「橋樑」?)

回答

1

這就是page.onResourceReceived的用途。

page.onResourceReceived = function(response) { 
    if (response.stage === "end" && response.url.indexOf("/longrunningrequest") !== -1) { 
     setTimeout(function(){ 
      if ("200" === (""+response.status)) { 
       page.render("screenshot_200.png"); 
      } else { 
       page.render("screenshot_other.png"); 
      } 
      phantom.exit(); 
     }, 1000); 
    } 
}; 
page.open(address); 

您可以確定應該從URL觸發截圖的特定響應。我用了一個簡單的字符串匹配,但你也可以使用正則表達式和什麼。

當然,如果您通過node.js中的其中一個可用網橋使用PhantomJS,這看起來會有所不同。