and commited on
Commit
ae0a0ca
1 Parent(s): a975599
Files changed (1) hide show
  1. index.mjs +59 -3
index.mjs CHANGED
@@ -3,12 +3,17 @@ import * as url from 'url';
3
  import * as path from 'path';
4
  import { chromium } from 'playwright';
5
  import { locks } from 'web-locks';
 
 
6
 
7
  // npm i playwright
8
  // npm i web-locks
 
9
  // nohup cloudflared tunnel --url http://localhost:8080 --no-autoupdate & (or setsid)
10
  // setsid node playwright.mjs (nohup doesnt work)
11
 
 
 
12
  globalThis.state = Object.assign(globalThis.state||{}, {
13
  browser: null,
14
  context: null,
@@ -60,6 +65,46 @@ async function text_from_url(url, cookie) {
60
  return text;
61
  }
62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  const server = http.createServer(async function(req, res) {
65
  const {query, pathname} = url.parse(req.url, true);
@@ -70,9 +115,20 @@ const server = http.createServer(async function(req, res) {
70
  let cookie = query.cookie;
71
 
72
  try {
73
- let text = await text_from_url(_url, cookie);
74
-
75
- res.end(text);
 
 
 
 
 
 
 
 
 
 
 
76
  } catch (e) {
77
  res.end(e.toString());
78
  }
 
3
  import * as path from 'path';
4
  import { chromium } from 'playwright';
5
  import { locks } from 'web-locks';
6
+ import crypto from 'crypto';
7
+ import fs from 'fs';
8
 
9
  // npm i playwright
10
  // npm i web-locks
11
+
12
  // nohup cloudflared tunnel --url http://localhost:8080 --no-autoupdate & (or setsid)
13
  // setsid node playwright.mjs (nohup doesnt work)
14
 
15
+ // curl 'https://gowah44030-playwright.hf.space/..
16
+
17
  globalThis.state = Object.assign(globalThis.state||{}, {
18
  browser: null,
19
  context: null,
 
65
  return text;
66
  }
67
 
68
+ async function screenshot(url, cookie) {
69
+ let { browser, context } = globalThis.state;
70
+ if (!browser) {
71
+ await locks.request('playwright_browser', async lock => {
72
+ browser = globalThis.state.browser = await chromium.launch();
73
+ context = globalThis.state.context = await browser.newContext({
74
+ javaScriptEnabled: false
75
+ }/*devices['iPhone 11']*/);
76
+ });
77
+ }
78
+
79
+ const page = await context.newPage();
80
+
81
+ if (cookie) {
82
+ if (cookie.endsWith(';')) cookie = cookie.slice(0, -1);
83
+ let cookies = cookie.split(';');
84
+ cookies = cookies.map(it=>{
85
+ let [name, value] = it.split('=');
86
+ return {name: name.trim(), value: value.trim(), url};
87
+ });
88
+ context.addCookies(cookies);
89
+ }
90
+
91
+ //await context.route("**/*.{png,jpg,jpeg,css,js}", route => route.abort());
92
+ await page.goto(url);
93
+
94
+ await setTimeout(2000);
95
+
96
+ let id = crypto.randomUUID();
97
+ let path = `${id}.png`;
98
+
99
+ await page.screenshot({ path, fullPage: true });
100
+
101
+ await page.close();
102
+ //await context.close();
103
+ // await browser.close();
104
+
105
+ return path;
106
+ }
107
+
108
 
109
  const server = http.createServer(async function(req, res) {
110
  const {query, pathname} = url.parse(req.url, true);
 
115
  let cookie = query.cookie;
116
 
117
  try {
118
+ if (pathname == '/text') {
119
+ let text = await text_from_url(_url, cookie);
120
+
121
+ res.end(text);
122
+ } else if (pathname == '/screenshot') {
123
+ let path = await screenshot(_url, cookie);
124
+
125
+ const readStream = fs.createReadStream(path);
126
+ res.writeHead(200,{'Content-type':'image/png'});
127
+ readStream.pipe(res);
128
+ res.end();
129
+ } else {
130
+ res.end('hello');
131
+ }
132
  } catch (e) {
133
  res.end(e.toString());
134
  }