Anuj-Panthri commited on
Commit
4f1ca17
·
1 Parent(s): 78cd2ff

added html and screenshot endpoints

Browse files
Files changed (4) hide show
  1. Dockerfile +2 -0
  2. index.js +133 -13
  3. package-lock.json +154 -0
  4. package.json +3 -1
Dockerfile CHANGED
@@ -1,5 +1,7 @@
1
  FROM node:slim AS app
2
 
 
 
3
  # We don't need the standalone Chromium
4
  ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
5
  ENV CHROME_BIN=/usr/bin/google-chrome
 
1
  FROM node:slim AS app
2
 
3
+ # referenced :- https://dev.to/cloudx/how-to-use-puppeteer-inside-a-docker-container-568c
4
+
5
  # We don't need the standalone Chromium
6
  ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
7
  ENV CHROME_BIN=/usr/bin/google-chrome
index.js CHANGED
@@ -1,34 +1,53 @@
1
  const express = require("express")
2
  const app = express();
3
  const puppeteer = require("puppeteer");
 
 
4
 
 
 
5
 
6
- const getData = async () => {
7
- // Start a Puppeteer session with:
8
- // - a visible browser (`headless: false` - easier to debug because you'll see the browser in action)
9
- // - no default viewport (`defaultViewport: null` - website page will in full width and height)
 
 
 
 
10
  const browser = await puppeteer.launch({
11
  executablePath: process.env.CHROME_BIN || null,
12
  defaultViewport: null,
13
  headless: true,
14
  });
 
 
 
 
 
 
15
 
16
- console.log("Scrapping started");
17
- // Open a new page
18
- const page = await browser.newPage();
19
  await page.setRequestInterception(true);
20
  page.on("request", (request) => {
21
  // return request.continue();
22
- if(request.resourceType() == 'document'){
23
  request.continue();
24
  }
25
- else{
26
  request.abort();
27
  }
28
  });
29
 
30
-
31
- url = "https://www.flipkart.com/apple-iphone-15-blue-128-gb/p/itmbf14ef54f645d";
 
 
 
 
 
 
 
 
32
  await page.goto(url, {
33
  // waitUntil: "domcontentloaded",
34
  });
@@ -54,17 +73,118 @@ const getData = async () => {
54
 
55
 
56
  page.close();
57
- return { title, price, image };
 
 
 
 
58
  };
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  app.get("/", async (req, res) => {
61
  res.send('go to /test');
62
  })
63
 
 
 
 
64
  app.get("/test", async (req, res) => {
65
- const data = await getData();
66
  res.type("json");
67
  res.send(JSON.stringify(data));
68
  })
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  app.listen(8080, () => console.log("Server running at port 8080"));
 
1
  const express = require("express")
2
  const app = express();
3
  const puppeteer = require("puppeteer");
4
+ const bodyParser = require("body-parser");
5
+ const mutler = require("multer");
6
 
7
+ // parse application/json
8
+ app.use(bodyParser.json());
9
 
10
+ // parse application/x-www-form-urlencoded
11
+ app.use(bodyParser.urlencoded({ extended: false }));
12
+
13
+ // app.use(express.urlencoded());
14
+ app.use(mutler().array(""));
15
+
16
+
17
+ const initBrowser = async () => {
18
  const browser = await puppeteer.launch({
19
  executablePath: process.env.CHROME_BIN || null,
20
  defaultViewport: null,
21
  headless: true,
22
  });
23
+ return browser;
24
+ }
25
+
26
+ async function addRequestFilter(page) {
27
+
28
+ const resourcetypes = ['document'];
29
 
 
 
 
30
  await page.setRequestInterception(true);
31
  page.on("request", (request) => {
32
  // return request.continue();
33
+ if (resourcetypes.includes(request.resourceType())) {
34
  request.continue();
35
  }
36
+ else {
37
  request.abort();
38
  }
39
  });
40
 
41
+ return page;
42
+ }
43
+
44
+ const getData = async (url) => {
45
+
46
+ // Open a new page
47
+ const browser = await initBrowser();
48
+ var page = await browser.newPage();
49
+ page = await addRequestFilter(page);
50
+
51
  await page.goto(url, {
52
  // waitUntil: "domcontentloaded",
53
  });
 
73
 
74
 
75
  page.close();
76
+ return {
77
+ title: title,
78
+ price: price,
79
+ image: image,
80
+ };
81
  };
82
 
83
+ const getHTML = async (url) => {
84
+
85
+ const browser = await initBrowser();
86
+ var page = await browser.newPage();
87
+ page = await addRequestFilter(page);
88
+
89
+ await page.goto(url, {
90
+ // waitUntil: "domcontentloaded",
91
+ });
92
+
93
+ return await page.content();
94
+
95
+ }
96
+ const getScreenshot = async (url) => {
97
+
98
+ const browser = await initBrowser();
99
+ var page = await browser.newPage();
100
+
101
+ await page.goto(url, {
102
+ // waitUntil: "domcontentloaded",
103
+ });
104
+
105
+ const image = await page.screenshot({
106
+ type: "png",
107
+ });
108
+ page.close();
109
+ return image;
110
+
111
+ }
112
+
113
  app.get("/", async (req, res) => {
114
  res.send('go to /test');
115
  })
116
 
117
+ url = "https://www.flipkart.com/apple-iphone-15-blue-128-gb/p/itmbf14ef54f645d";
118
+
119
+
120
  app.get("/test", async (req, res) => {
121
+ const data = await getData(url);
122
  res.type("json");
123
  res.send(JSON.stringify(data));
124
  })
125
 
126
+ app.get("/testhtml", async (req, res) => {
127
+ const html = await getHTML(url);
128
+ res.type("json");
129
+ res.send(JSON.stringify({
130
+ html: html
131
+ }));
132
+ })
133
+ app.get("/testscreenshot", async (req, res) => {
134
+ const image = await getScreenshot(url);
135
+ // convert buffer to base64 string
136
+ const base64Image = await image.toString('base64');
137
+
138
+ res.type("json");
139
+ return res.send(JSON.stringify({
140
+ "screenshot": "data:image/png;base64," + base64Image
141
+ }));
142
+ })
143
+ app.post("/html", async (req, res) => {
144
+ const data = req.body;
145
+ if(!("url" in data)){
146
+ res.type("json");
147
+ return res.send(JSON.stringify({
148
+ "error":"no url parameter in request",
149
+ }));
150
+ }
151
+ const url = data['url'];
152
+
153
+ try{
154
+ const html = await getHTML(url);
155
+ res.type("json").send(JSON.stringify({
156
+ html: html
157
+ }));
158
+ }
159
+ catch(e){
160
+ return res.type("json").send(JSON.stringify({
161
+ "error":"can't open page",
162
+ }));
163
+ }
164
+ })
165
+ app.post("/screenshot", async (req, res) => {
166
+ const data = req.body;
167
+ if(!("url" in data)){
168
+ return res.type("json").send(JSON.stringify({
169
+ "error":"no url parameter in request",
170
+ }));
171
+ }
172
+ const url = data['url'];
173
+
174
+ try{
175
+ const image = await getScreenshot(url);
176
+ // convert buffer to base64 string
177
+ const base64Image = await image.toString('base64');
178
+
179
+ return res.type("json").send(JSON.stringify({
180
+ "screenshot": "data:image/png;base64," + base64Image
181
+ }));
182
+ }
183
+ catch(e){
184
+ return res.type("json").send(JSON.stringify({
185
+ "error":"can't open page",
186
+ }));
187
+ }
188
+ })
189
+
190
  app.listen(8080, () => console.log("Server running at port 8080"));
package-lock.json CHANGED
@@ -5,7 +5,9 @@
5
  "packages": {
6
  "": {
7
  "dependencies": {
 
8
  "express": "^4.19.1",
 
9
  "puppeteer": "^22.6.0"
10
  }
11
  },
@@ -171,6 +173,11 @@
171
  "node": ">=4"
172
  }
173
  },
 
 
 
 
 
174
  "node_modules/argparse": {
175
  "version": "2.0.1",
176
  "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -311,6 +318,22 @@
311
  "node": "*"
312
  }
313
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
314
  "node_modules/bytes": {
315
  "version": "3.1.2",
316
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -397,6 +420,20 @@
397
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
398
  "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
399
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  "node_modules/content-disposition": {
401
  "version": "0.5.4",
402
  "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -429,6 +466,11 @@
429
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
430
  "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
431
  },
 
 
 
 
 
432
  "node_modules/cosmiconfig": {
433
  "version": "9.0.0",
434
  "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
@@ -1114,6 +1156,11 @@
1114
  "node": ">=8"
1115
  }
1116
  },
 
 
 
 
 
1117
  "node_modules/js-tokens": {
1118
  "version": "4.0.0",
1119
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -1215,16 +1262,52 @@
1215
  "node": ">= 0.6"
1216
  }
1217
  },
 
 
 
 
 
 
 
 
1218
  "node_modules/mitt": {
1219
  "version": "3.0.1",
1220
  "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
1221
  "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
1222
  },
 
 
 
 
 
 
 
 
 
 
 
1223
  "node_modules/ms": {
1224
  "version": "2.0.0",
1225
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1226
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1227
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1228
  "node_modules/negotiator": {
1229
  "version": "0.6.3",
1230
  "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -1241,6 +1324,14 @@
1241
  "node": ">= 0.4.0"
1242
  }
1243
  },
 
 
 
 
 
 
 
 
1244
  "node_modules/object-inspect": {
1245
  "version": "1.13.1",
1246
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
@@ -1370,6 +1461,11 @@
1370
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1371
  "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1372
  },
 
 
 
 
 
1373
  "node_modules/progress": {
1374
  "version": "2.0.3",
1375
  "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -1538,6 +1634,25 @@
1538
  "node": ">= 0.8"
1539
  }
1540
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1541
  "node_modules/require-directory": {
1542
  "version": "2.1.1",
1543
  "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -1761,6 +1876,14 @@
1761
  "node": ">= 0.8"
1762
  }
1763
  },
 
 
 
 
 
 
 
 
1764
  "node_modules/streamx": {
1765
  "version": "2.16.1",
1766
  "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
@@ -1773,6 +1896,19 @@
1773
  "bare-events": "^2.2.0"
1774
  }
1775
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
1776
  "node_modules/string-width": {
1777
  "version": "4.2.3",
1778
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -1861,6 +1997,11 @@
1861
  "node": ">= 0.6"
1862
  }
1863
  },
 
 
 
 
 
1864
  "node_modules/unbzip2-stream": {
1865
  "version": "1.4.3",
1866
  "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -1897,6 +2038,11 @@
1897
  "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
1898
  "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg=="
1899
  },
 
 
 
 
 
1900
  "node_modules/utils-merge": {
1901
  "version": "1.0.1",
1902
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -1984,6 +2130,14 @@
1984
  }
1985
  }
1986
  },
 
 
 
 
 
 
 
 
1987
  "node_modules/y18n": {
1988
  "version": "5.0.8",
1989
  "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
 
5
  "packages": {
6
  "": {
7
  "dependencies": {
8
+ "body-parser": "^1.20.2",
9
  "express": "^4.19.1",
10
+ "multer": "^1.4.5-lts.1",
11
  "puppeteer": "^22.6.0"
12
  }
13
  },
 
173
  "node": ">=4"
174
  }
175
  },
176
+ "node_modules/append-field": {
177
+ "version": "1.0.0",
178
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
179
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
180
+ },
181
  "node_modules/argparse": {
182
  "version": "2.0.1",
183
  "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
 
318
  "node": "*"
319
  }
320
  },
321
+ "node_modules/buffer-from": {
322
+ "version": "1.1.2",
323
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
324
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
325
+ },
326
+ "node_modules/busboy": {
327
+ "version": "1.6.0",
328
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
329
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
330
+ "dependencies": {
331
+ "streamsearch": "^1.1.0"
332
+ },
333
+ "engines": {
334
+ "node": ">=10.16.0"
335
+ }
336
+ },
337
  "node_modules/bytes": {
338
  "version": "3.1.2",
339
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 
420
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
421
  "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
422
  },
423
+ "node_modules/concat-stream": {
424
+ "version": "1.6.2",
425
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
426
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
427
+ "engines": [
428
+ "node >= 0.8"
429
+ ],
430
+ "dependencies": {
431
+ "buffer-from": "^1.0.0",
432
+ "inherits": "^2.0.3",
433
+ "readable-stream": "^2.2.2",
434
+ "typedarray": "^0.0.6"
435
+ }
436
+ },
437
  "node_modules/content-disposition": {
438
  "version": "0.5.4",
439
  "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 
466
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
467
  "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
468
  },
469
+ "node_modules/core-util-is": {
470
+ "version": "1.0.3",
471
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
472
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
473
+ },
474
  "node_modules/cosmiconfig": {
475
  "version": "9.0.0",
476
  "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
 
1156
  "node": ">=8"
1157
  }
1158
  },
1159
+ "node_modules/isarray": {
1160
+ "version": "1.0.0",
1161
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1162
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
1163
+ },
1164
  "node_modules/js-tokens": {
1165
  "version": "4.0.0",
1166
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
1262
  "node": ">= 0.6"
1263
  }
1264
  },
1265
+ "node_modules/minimist": {
1266
+ "version": "1.2.8",
1267
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
1268
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
1269
+ "funding": {
1270
+ "url": "https://github.com/sponsors/ljharb"
1271
+ }
1272
+ },
1273
  "node_modules/mitt": {
1274
  "version": "3.0.1",
1275
  "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
1276
  "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
1277
  },
1278
+ "node_modules/mkdirp": {
1279
+ "version": "0.5.6",
1280
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
1281
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
1282
+ "dependencies": {
1283
+ "minimist": "^1.2.6"
1284
+ },
1285
+ "bin": {
1286
+ "mkdirp": "bin/cmd.js"
1287
+ }
1288
+ },
1289
  "node_modules/ms": {
1290
  "version": "2.0.0",
1291
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1292
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1293
  },
1294
+ "node_modules/multer": {
1295
+ "version": "1.4.5-lts.1",
1296
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
1297
+ "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
1298
+ "dependencies": {
1299
+ "append-field": "^1.0.0",
1300
+ "busboy": "^1.0.0",
1301
+ "concat-stream": "^1.5.2",
1302
+ "mkdirp": "^0.5.4",
1303
+ "object-assign": "^4.1.1",
1304
+ "type-is": "^1.6.4",
1305
+ "xtend": "^4.0.0"
1306
+ },
1307
+ "engines": {
1308
+ "node": ">= 6.0.0"
1309
+ }
1310
+ },
1311
  "node_modules/negotiator": {
1312
  "version": "0.6.3",
1313
  "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
 
1324
  "node": ">= 0.4.0"
1325
  }
1326
  },
1327
+ "node_modules/object-assign": {
1328
+ "version": "4.1.1",
1329
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1330
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1331
+ "engines": {
1332
+ "node": ">=0.10.0"
1333
+ }
1334
+ },
1335
  "node_modules/object-inspect": {
1336
  "version": "1.13.1",
1337
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
 
1461
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1462
  "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1463
  },
1464
+ "node_modules/process-nextick-args": {
1465
+ "version": "2.0.1",
1466
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1467
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1468
+ },
1469
  "node_modules/progress": {
1470
  "version": "2.0.3",
1471
  "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
 
1634
  "node": ">= 0.8"
1635
  }
1636
  },
1637
+ "node_modules/readable-stream": {
1638
+ "version": "2.3.8",
1639
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1640
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1641
+ "dependencies": {
1642
+ "core-util-is": "~1.0.0",
1643
+ "inherits": "~2.0.3",
1644
+ "isarray": "~1.0.0",
1645
+ "process-nextick-args": "~2.0.0",
1646
+ "safe-buffer": "~5.1.1",
1647
+ "string_decoder": "~1.1.1",
1648
+ "util-deprecate": "~1.0.1"
1649
+ }
1650
+ },
1651
+ "node_modules/readable-stream/node_modules/safe-buffer": {
1652
+ "version": "5.1.2",
1653
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1654
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1655
+ },
1656
  "node_modules/require-directory": {
1657
  "version": "2.1.1",
1658
  "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
 
1876
  "node": ">= 0.8"
1877
  }
1878
  },
1879
+ "node_modules/streamsearch": {
1880
+ "version": "1.1.0",
1881
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1882
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1883
+ "engines": {
1884
+ "node": ">=10.0.0"
1885
+ }
1886
+ },
1887
  "node_modules/streamx": {
1888
  "version": "2.16.1",
1889
  "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
 
1896
  "bare-events": "^2.2.0"
1897
  }
1898
  },
1899
+ "node_modules/string_decoder": {
1900
+ "version": "1.1.1",
1901
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1902
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1903
+ "dependencies": {
1904
+ "safe-buffer": "~5.1.0"
1905
+ }
1906
+ },
1907
+ "node_modules/string_decoder/node_modules/safe-buffer": {
1908
+ "version": "5.1.2",
1909
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1910
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1911
+ },
1912
  "node_modules/string-width": {
1913
  "version": "4.2.3",
1914
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 
1997
  "node": ">= 0.6"
1998
  }
1999
  },
2000
+ "node_modules/typedarray": {
2001
+ "version": "0.0.6",
2002
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2003
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
2004
+ },
2005
  "node_modules/unbzip2-stream": {
2006
  "version": "1.4.3",
2007
  "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
 
2038
  "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
2039
  "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg=="
2040
  },
2041
+ "node_modules/util-deprecate": {
2042
+ "version": "1.0.2",
2043
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2044
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
2045
+ },
2046
  "node_modules/utils-merge": {
2047
  "version": "1.0.1",
2048
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 
2130
  }
2131
  }
2132
  },
2133
+ "node_modules/xtend": {
2134
+ "version": "4.0.2",
2135
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2136
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2137
+ "engines": {
2138
+ "node": ">=0.4"
2139
+ }
2140
+ },
2141
  "node_modules/y18n": {
2142
  "version": "5.0.8",
2143
  "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
package.json CHANGED
@@ -4,7 +4,9 @@
4
  "dev": "nodemon index.js"
5
  },
6
  "dependencies": {
 
7
  "express": "^4.19.1",
 
8
  "puppeteer": "^22.6.0"
9
  }
10
- }
 
4
  "dev": "nodemon index.js"
5
  },
6
  "dependencies": {
7
+ "body-parser": "^1.20.2",
8
  "express": "^4.19.1",
9
+ "multer": "^1.4.5-lts.1",
10
  "puppeteer": "^22.6.0"
11
  }
12
+ }