app.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. var createError = require('http-errors');
  2. var express = require('express');
  3. var path = require('path');
  4. var cookieParser = require('cookie-parser');
  5. var logger = require('morgan');
  6. const axios = require('axios');
  7. const playwright = require('playwright');
  8. const cheerio = require('cheerio');
  9. var timeout = require('connect-timeout')
  10. var indexRouter = require('./routes/index');
  11. var usersRouter = require('./routes/users');
  12. var app = express();
  13. // view engine setup
  14. app.set('views', path.join(__dirname, 'views'));
  15. app.set('view engine', 'jade');
  16. app.use(logger('dev'));
  17. app.use(timeout('10s'));
  18. app.use(express.json());
  19. app.use(express.urlencoded({ extended: false }));
  20. app.use(haltOnTimedout);
  21. app.use(cookieParser());
  22. app.use(haltOnTimedout);
  23. app.use(express.static(path.join(__dirname, 'public')));
  24. app.use('/', indexRouter);
  25. app.use('/users', usersRouter);
  26. function haltOnTimedout (req, res, next) {
  27. if (!req.timedout) next()
  28. }
  29. // get text from selector
  30. app.get("/element/:selector/:url(*)", (req, res, next) => {
  31. axios.get(req.params.url)
  32. .then(function (response) {
  33. var $ = cheerio.load(response.data);
  34. var element = $(req.params.selector.replace("+", " ")).text();
  35. console.log(element);
  36. res.json(element);
  37. })
  38. .catch(function (error) {
  39. // handle error
  40. console.log(error);
  41. res.json({error: error, params: req.params});
  42. })
  43. .then(function () {
  44. // always executed
  45. });
  46. // res.json(req.params);
  47. });
  48. // get screenshot
  49. app.get("/screenshot/:browser/:pos/:width/:url(*)", (req, res, next) => {
  50. (async () => {
  51. switch(req.params.browser) {
  52. case 'webkit': {
  53. var browser = await playwright.webkit.launch();
  54. break;
  55. }
  56. case 'firefox': {
  57. var browser = await playwright.firefox.launch();
  58. break;
  59. }
  60. default: {
  61. var browser = await playwright.chromium.launch();
  62. break;
  63. }
  64. }
  65. const context = await browser.newContext({
  66. viewport: {
  67. width: parseInt(req.params.width),
  68. height: 1080
  69. }
  70. });
  71. var full = false;
  72. var pos = 0;
  73. const page = await context.newPage();
  74. console.log(req.params.width);
  75. await page.goto(req.params.url);
  76. if (req.params.pos == "full" || isNaN(req.params.pos)) {
  77. full = true;
  78. } else {
  79. await page.evaluate(async (pos) => {
  80. for (let i = 0; i < pos; i += 10) {
  81. window.scrollTo(0, i);
  82. }
  83. }, req.params.pos);
  84. }
  85. const screenshot = await page.screenshot({
  86. fullPage: full
  87. });
  88. //await page.screenshot({ path: `example-${browserType.name()}.png` });
  89. await browser.close();
  90. res.contentType('image/png');
  91. res.end(screenshot, 'binary');
  92. })().catch(function (error) {
  93. console.log(error);
  94. });
  95. // res.json(req.params);
  96. });
  97. // catch 404 and forward to error handler
  98. app.use(function(req, res, next) {
  99. next(createError(404));
  100. });
  101. // error handler
  102. app.use(function(err, req, res, next) {
  103. // set locals, only providing error in development
  104. res.locals.message = err.message;
  105. res.locals.error = req.app.get('env') === 'development' ? err : {};
  106. // render the error page
  107. res.status(err.status || 500);
  108. res.render('error');
  109. });
  110. module.exports = app;