webgrabber.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. var config = require('config');
  3. require('../../models/db');
  4. var fs = require('fs');
  5. var phantom = require('node-phantom-simple');
  6. var md5 = require('md5');
  7. var express = require('express');
  8. var router = express.Router();
  9. function website_to_png(url,on_success,on_error) {
  10. var hash = md5(url);
  11. var export_path = "/tmp/webgrabber-"+hash+".png";
  12. var timeout = 2000;
  13. console.log("[webgrabber] url: "+url);
  14. console.log("[webgrabber] export_path: "+export_path);
  15. var on_success_called = false;
  16. var on_exit = function(exit_code) {
  17. if (exit_code>0) {
  18. console.log("[phantom-webgrabber] abnormal exit for url "+url);
  19. if (!on_success_called && on_error) {
  20. on_error();
  21. }
  22. }
  23. };
  24. fs.stat(export_path, function(err, stat) {
  25. if (!err) {
  26. // file exists
  27. console.log("[webgrabber] serving cached snapshot of url: "+url);
  28. on_success(export_path);
  29. } else {
  30. phantom.create({ path: require('phantomjs-prebuilt').path }, function (err, browser) {
  31. return browser.createPage(function (err, page) {
  32. page.set('settings.resourceTimeout',timeout);
  33. page.set('settings.javascriptEnabled',false);
  34. return page.open(url, function(err, status) {
  35. console.log("[webgrabber] status: "+status);
  36. page.render(export_path, function() {
  37. on_success_called = true;
  38. on_success(export_path);
  39. browser.exit();
  40. });
  41. });
  42. });
  43. }, {
  44. onExit: on_exit
  45. });
  46. }
  47. });
  48. }
  49. router.get('/:id', function (req, res) {
  50. var uri = new Buffer(req.params.id, "base64")+"";
  51. var on_success_called = false;
  52. website_to_png(uri, (image_path) => {
  53. on_success_called = true;
  54. res.sendFile(image_path);
  55. }, () => {
  56. if (!on_success_called) {
  57. res.status(500).send("[webgrabber] Error fetching website.");
  58. }
  59. });
  60. });
  61. module.exports = router;