@rent-scraper/browser-server 1.0.15 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/run-browser-server.mjs +1 -1
- package/dist/index.d.mts +9 -4
- package/dist/index.mjs +1 -1
- package/dist/shared/browser-server.R7u53qIj.mjs +1 -0
- package/package.json +3 -3
- package/src/browser.ts +2 -3
- package/src/cookie.ts +40 -7
- package/src/server.ts +21 -6
- package/dist/shared/browser-server.CTHRk1um.mjs +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{r}from"../shared/browser-server.
|
|
2
|
+
import{r}from"../shared/browser-server.R7u53qIj.mjs";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";r();
|
package/dist/index.d.mts
CHANGED
|
@@ -12,7 +12,7 @@ declare const closeBrowser: () => Promise<void>;
|
|
|
12
12
|
declare const launchBrowser: (source?: ListingsSource) => Promise<{
|
|
13
13
|
status: string;
|
|
14
14
|
}>;
|
|
15
|
-
declare const openBrowser: (url
|
|
15
|
+
declare const openBrowser: (url: string) => Promise<{
|
|
16
16
|
status: string;
|
|
17
17
|
}>;
|
|
18
18
|
declare const shutdownBrowser: () => Promise<{
|
|
@@ -21,7 +21,12 @@ declare const shutdownBrowser: () => Promise<{
|
|
|
21
21
|
|
|
22
22
|
declare function runConfirmBrowserLaunch(): Promise<undefined>;
|
|
23
23
|
|
|
24
|
-
declare const getZillowCookie: () => Promise<
|
|
24
|
+
declare const getZillowCookie: (attempt?: number) => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
value: string;
|
|
27
|
+
} | undefined>;
|
|
28
|
+
declare const getRedfinCookie: (attempt?: number) => Promise<string | undefined>;
|
|
29
|
+
declare const saveRedfinCookie: () => Promise<void>;
|
|
25
30
|
declare const saveZillowCookie: () => Promise<void>;
|
|
26
31
|
|
|
27
32
|
// This extracts the core definitions from express to prevent a circular dependency between express and serve-static
|
|
@@ -1245,6 +1250,6 @@ interface Express extends Application {
|
|
|
1245
1250
|
response: Response;
|
|
1246
1251
|
}
|
|
1247
1252
|
|
|
1248
|
-
declare function runBrowserServer(): Express;
|
|
1253
|
+
declare function runBrowserServer(source?: ListingsSource): Express;
|
|
1249
1254
|
|
|
1250
|
-
export { closeBrowser, getBrowser, getZillowCookie, launchBrowser, openBrowser, runBrowserServer, runConfirmBrowserLaunch, saveZillowCookie, shutdownBrowser };
|
|
1255
|
+
export { closeBrowser, getBrowser, getRedfinCookie, getZillowCookie, launchBrowser, openBrowser, runBrowserServer, runConfirmBrowserLaunch, saveRedfinCookie, saveZillowCookie, shutdownBrowser };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{c as closeBrowser,g as getBrowser,a as getZillowCookie,l as launchBrowser,o as openBrowser,r as runBrowserServer,
|
|
1
|
+
export{c as closeBrowser,g as getBrowser,b as getRedfinCookie,a as getZillowCookie,l as launchBrowser,o as openBrowser,r as runBrowserServer,d as saveRedfinCookie,e as saveZillowCookie,s as shutdownBrowser}from"./shared/browser-server.R7u53qIj.mjs";import{confirm as r,isCancel as a,cancel as s,outro as i}from"@clack/prompts";import{setTimeout as o}from"node:timers/promises";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";async function t(){const e=await r({message:"We need to launch your browser to continue",active:"OK",inactive:"Cancel"});if(a(e)||!e)return s("Create config canceled. Please try again."),process.exit(1);await o(1e3),i("Browser Launching..."),await o(1e3)}export{t as runConfirmBrowserLaunch};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import L from"express";import N from"puppeteer";import{exec as J}from"child_process";import{checkForConfigFile as q,waitForConfigFile as Q,getValueFromConfigFile as X,updateConfigFile as D}from"@rent-scraper/utils/config";import{parseError as H}from"@rent-scraper/utils";const Y="http://127.0.0.1:9222/json/version",C=async()=>{try{return await N.connect({browserURL:Y})}catch{return null}},S=async()=>{const o=await(await C())?.pages();o&&await Promise.all(o.map(s=>s.close()))},T=async(o="zillow")=>{if(await C())return{status:"already launched"};{await q(o)||await Q(o),await q(o);const s=await X(o,"browser")==="brave"?"/Applications/Brave\\ Browser.app/Contents/MacOS/Brave\\ Browser":"/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome";return J(`${s} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`,(f,t,a)=>{if(f){console.error(`Error: ${f.message}`);return}if(a){console.error(`Stderr: ${a}`);return}console.log(`Stdout: ${t}`)}),{status:"launched"}}},y=async o=>{const s=await C();if(s){const f=o,t=(await s.pages())?.[0]??await s.newPage();return(await t.title()).includes("denied")||await t.goto(f,{waitUntil:"load"}),{status:"opened"}}else return{status:"not connected"}},I=async()=>{const o=await C();return o?(await o.close(),{status:"closed"}):{status:"not connected"}},V="http://127.0.0.1:9222/json/version",z=async(o=0)=>{const s=await N.connect({browserURL:V});o===0&&await y("https://www.zillow.com/homes/for_rent/");const[f]=(await s.cookies()).filter(t=>t.name==="_pxvid");return f?(await S(),f):(console.log("refetching zillow cookie"),await new Promise(t=>setTimeout(t,2e3)),await z(o+1))},M=async(o=0)=>{const s=await N.connect({browserURL:V});o===0&&(await y("https://www.redfin.com"),await new Promise(t=>setTimeout(t,3e3)));const f=(await s.cookies()).filter(t=>t.domain.includes("redfin.com"));return f.some(t=>t.name==="aws-waf-token")?(await S(),f.map(t=>`${t.name}=${t.value}`).join("; ")):(console.log("refetching redfin cookie"),await new Promise(t=>setTimeout(t,2e3)),await M(o+1))},G=async()=>{try{const o=await M();o&&await D("redfin",{redfinCookie:o})}catch(o){const{status:s,message:f}=H(o);console.error(s,f)}},U=async()=>{try{const{name:o,value:s}=await z()??{},f={zillowCookie:`${o}=${s}`};await D("zillow",f)}catch(o){const{status:s,message:f}=H(o);console.error(s,f)}};function j(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var Z,W;function x(){if(W)return Z;W=1;function o(t,a){var i=t;a.slice(0,-1).forEach(function(p){i=i[p]||{}});var d=a[a.length-1];return d in i}function s(t){return typeof t=="number"||/^0x[0-9a-f]+$/i.test(t)?!0:/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(t)}function f(t,a){return a==="constructor"&&typeof t[a]=="function"||a==="__proto__"}return Z=function(t,a){a||(a={});var i={bools:{},strings:{},unknownFn:null};typeof a.unknown=="function"&&(i.unknownFn=a.unknown),typeof a.boolean=="boolean"&&a.boolean?i.allBools=!0:[].concat(a.boolean).filter(Boolean).forEach(function(n){i.bools[n]=!0});var d={};function p(n){return d[n].some(function(w){return i.bools[w]})}Object.keys(a.alias||{}).forEach(function(n){d[n]=[].concat(a.alias[n]),d[n].forEach(function(w){d[w]=[n].concat(d[n].filter(function(B){return w!==B}))})}),[].concat(a.string).filter(Boolean).forEach(function(n){i.strings[n]=!0,d[n]&&[].concat(d[n]).forEach(function(w){i.strings[w]=!0})});var r=a.default||{},e={_:[]};function A(n,w){return i.allBools&&/^--[^=]+$/.test(w)||i.strings[n]||i.bools[n]||d[n]}function F(n,w,B){for(var l=n,_=0;_<w.length-1;_++){var g=w[_];if(f(l,g))return;l[g]===void 0&&(l[g]={}),(l[g]===Object.prototype||l[g]===Number.prototype||l[g]===String.prototype)&&(l[g]={}),l[g]===Array.prototype&&(l[g]=[]),l=l[g]}var E=w[w.length-1];f(l,E)||((l===Object.prototype||l===Number.prototype||l===String.prototype)&&(l={}),l===Array.prototype&&(l=[]),l[E]===void 0||i.bools[E]||typeof l[E]=="boolean"?l[E]=B:Array.isArray(l[E])?l[E].push(B):l[E]=[l[E],B])}function h(n,w,B){if(!(B&&i.unknownFn&&!A(n,B)&&i.unknownFn(B)===!1)){var l=!i.strings[n]&&s(w)?Number(w):w;F(e,n.split("."),l),(d[n]||[]).forEach(function(_){F(e,_.split("."),l)})}}Object.keys(i.bools).forEach(function(n){h(n,r[n]===void 0?!1:r[n])});var P=[];t.indexOf("--")!==-1&&(P=t.slice(t.indexOf("--")+1),t=t.slice(0,t.indexOf("--")));for(var m=0;m<t.length;m++){var c=t[m],u,v;if(/^--.+=/.test(c)){var K=c.match(/^--([^=]+)=([\s\S]*)$/);u=K[1];var R=K[2];i.bools[u]&&(R=R!=="false"),h(u,R,c)}else if(/^--no-.+/.test(c))u=c.match(/^--no-(.+)/)[1],h(u,!1,c);else if(/^--.+/.test(c))u=c.match(/^--(.+)/)[1],v=t[m+1],v!==void 0&&!/^(-|--)[^-]/.test(v)&&!i.bools[u]&&!i.allBools&&(!d[u]||!p(u))?(h(u,v,c),m+=1):/^(true|false)$/.test(v)?(h(u,v==="true",c),m+=1):h(u,i.strings[u]?"":!0,c);else if(/^-[^-]+/.test(c)){for(var $=c.slice(1,-1).split(""),O=!1,b=0;b<$.length;b++){if(v=c.slice(b+2),v==="-"){h($[b],v,c);continue}if(/[A-Za-z]/.test($[b])&&v[0]==="="){h($[b],v.slice(1),c),O=!0;break}if(/[A-Za-z]/.test($[b])&&/-?\d+(\.\d*)?(e-?\d+)?$/.test(v)){h($[b],v,c),O=!0;break}if($[b+1]&&$[b+1].match(/\W/)){h($[b],c.slice(b+2),c),O=!0;break}else h($[b],i.strings[$[b]]?"":!0,c)}u=c.slice(-1)[0],!O&&u!=="-"&&(t[m+1]&&!/^(-|--)[^-]/.test(t[m+1])&&!i.bools[u]&&(!d[u]||!p(u))?(h(u,t[m+1],c),m+=1):t[m+1]&&/^(true|false)$/.test(t[m+1])?(h(u,t[m+1]==="true",c),m+=1):h(u,i.strings[u]?"":!0,c))}else if((!i.unknownFn||i.unknownFn(c)!==!1)&&e._.push(i.strings._||!s(c)?c:Number(c)),a.stopEarly){e._.push.apply(e._,t.slice(m+1));break}}return Object.keys(r).forEach(function(n){o(e,n.split("."))||(F(e,n.split("."),r[n]),(d[n]||[]).forEach(function(w){F(e,w.split("."),r[n])}))}),a["--"]?e["--"]=P.slice():P.forEach(function(n){e._.push(n)}),e},Z}var k=x();const tt=j(k);function et(o="zillow"){const s=L(),f=process.env.HOST??"127.0.0.1",t=process.env.PORT??8082;s.use(L.json());const a=tt(process.argv.slice(2)).debug,i=s.listen(Number(t),async()=>{await T(o);const p=setInterval(async()=>{(await C())?.connected&&(clearInterval(p),a&&console.log("Browser listening at 127.0.0.1:9222"),o==="zillow"?await U():o==="redfin"&&(await G(),await I()))},1e3);a&&console.log(`Server listening at ${f}:${t}`)}),d=()=>(i.close(async p=>{const r=await I();a&&(console.log(r),console.log("server closed")),process.exit(p?1:0)}),{status:"shutdown"});return s.get("/server",(p,r)=>{try{r.send({running:!0})}catch(e){r.send(e)}}),s.post("/browser/launch",async(p,r)=>{try{const e=await T();r.send({browser:e})}catch(e){r.send(e)}}),s.post("/browser/open",async(p,r)=>{try{const{url:e}=p?.body??{},A=await y(e);r.send({browser:A})}catch(e){r.send(e)}}),s.get("/cookie",async(p,r)=>{try{const e=await z();r.send({cookie:e})}catch(e){r.send(e)}}),s.post("/cookie/save",async(p,r)=>{try{const e=await U();r.send({cookie:e})}catch(e){r.send(e)}}),s.post("/cookie/redfin/save",async(p,r)=>{try{const e=await G();r.send({cookie:e})}catch(e){r.send(e)}}),s.post("/browser/close",async(p,r)=>{try{const e=await S();r.send({browser:e})}catch(e){r.send(e)}}),s.post("/server/shutdown",(p,r)=>{try{const e=d();r.send({server:e})}catch(e){r.send(e)}}),process.on("SIGINT",d),process.on("SIGTERM",d),s}export{z as a,M as b,S as c,G as d,U as e,C as g,T as l,y as o,et as r,I as s};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rent-scraper/browser-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"express": "^4.21.2",
|
|
27
27
|
"picocolors": "^1.1.1",
|
|
28
28
|
"puppeteer": "^24.11.2",
|
|
29
|
-
"@rent-scraper/utils": "1.0.
|
|
30
|
-
"@rent-scraper/api": "1.0.
|
|
29
|
+
"@rent-scraper/utils": "1.0.16",
|
|
30
|
+
"@rent-scraper/api": "1.0.16"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/express": "^5.0.3",
|
package/src/browser.ts
CHANGED
|
@@ -19,7 +19,7 @@ export const getBrowser = async () => {
|
|
|
19
19
|
export const closeBrowser = async () => {
|
|
20
20
|
const browser = await getBrowser()
|
|
21
21
|
const pages = await browser?.pages()
|
|
22
|
-
pages
|
|
22
|
+
if (pages) await Promise.all(pages.map(page => page.close()))
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export const launchBrowser = async (source = 'zillow' as ListingsSource) => {
|
|
@@ -48,7 +48,7 @@ export const launchBrowser = async (source = 'zillow' as ListingsSource) => {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
export const openBrowser = async (url
|
|
51
|
+
export const openBrowser = async (url: string) => {
|
|
52
52
|
const browser = await getBrowser()
|
|
53
53
|
if (browser) {
|
|
54
54
|
const pageUrl = url
|
|
@@ -71,7 +71,6 @@ export const shutdownBrowser = async () => {
|
|
|
71
71
|
const browser = await getBrowser()
|
|
72
72
|
if (browser) {
|
|
73
73
|
await browser.close()
|
|
74
|
-
await browser.disconnect()
|
|
75
74
|
return { status: 'closed' }
|
|
76
75
|
} else {
|
|
77
76
|
return { status: 'not connected' }
|
package/src/cookie.ts
CHANGED
|
@@ -3,21 +3,54 @@ import { closeBrowser, openBrowser } from './browser.js'
|
|
|
3
3
|
import { updateConfigFile } from '@rent-scraper/utils/config'
|
|
4
4
|
import { parseError } from '@rent-scraper/utils'
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const wsChromeEndpointurl = 'http://127.0.0.1:9222/json/version'
|
|
7
|
+
|
|
8
|
+
export const getZillowCookie = async (attempt = 0): Promise<{ name: string, value: string } | undefined> => {
|
|
8
9
|
const browser = await puppeteer.connect({
|
|
9
10
|
browserURL: wsChromeEndpointurl,
|
|
10
11
|
})
|
|
11
|
-
|
|
12
|
+
if (attempt === 0) {
|
|
13
|
+
await openBrowser('https://www.zillow.com/homes/for_rent/')
|
|
14
|
+
}
|
|
12
15
|
const [cookie] = (await browser.cookies()).filter(cookie => cookie.name === '_pxvid')
|
|
13
16
|
if (cookie) {
|
|
14
17
|
await closeBrowser()
|
|
15
18
|
return cookie
|
|
16
19
|
} else {
|
|
17
|
-
console.log('refetching cookie')
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
console.log('refetching zillow cookie')
|
|
21
|
+
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
22
|
+
return await getZillowCookie(attempt + 1)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const getRedfinCookie = async (attempt = 0): Promise<string | undefined> => {
|
|
27
|
+
const browser = await puppeteer.connect({
|
|
28
|
+
browserURL: wsChromeEndpointurl,
|
|
29
|
+
})
|
|
30
|
+
if (attempt === 0) {
|
|
31
|
+
await openBrowser('https://www.redfin.com')
|
|
32
|
+
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
33
|
+
}
|
|
34
|
+
const cookies = (await browser.cookies()).filter(cookie => cookie.domain.includes('redfin.com'))
|
|
35
|
+
if (cookies.some(cookie => cookie.name === 'aws-waf-token')) {
|
|
36
|
+
await closeBrowser()
|
|
37
|
+
return cookies.map(c => `${c.name}=${c.value}`).join('; ')
|
|
38
|
+
} else {
|
|
39
|
+
console.log('refetching redfin cookie')
|
|
40
|
+
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
41
|
+
return await getRedfinCookie(attempt + 1)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const saveRedfinCookie = async () => {
|
|
46
|
+
try {
|
|
47
|
+
const redfinCookie = await getRedfinCookie()
|
|
48
|
+
if (redfinCookie) {
|
|
49
|
+
await updateConfigFile('redfin', { redfinCookie })
|
|
50
|
+
}
|
|
51
|
+
} catch (error: any) {
|
|
52
|
+
const { status, message } = parseError(error)
|
|
53
|
+
console.error(status, message)
|
|
21
54
|
}
|
|
22
55
|
}
|
|
23
56
|
|
package/src/server.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import express from 'express'
|
|
2
2
|
import minimist from 'minimist'
|
|
3
|
-
import { getZillowCookie, saveZillowCookie } from './cookie.js'
|
|
3
|
+
import { getZillowCookie, saveZillowCookie, saveRedfinCookie } from './cookie.js'
|
|
4
4
|
import { launchBrowser, closeBrowser, getBrowser, shutdownBrowser, openBrowser } from './browser.js'
|
|
5
|
+
import type { ListingsSource } from '@rent-scraper/api'
|
|
5
6
|
|
|
6
|
-
export function runBrowserServer() {
|
|
7
|
+
export function runBrowserServer(source: ListingsSource = 'zillow') {
|
|
7
8
|
const app = express()
|
|
8
9
|
const host = process.env.HOST ?? '127.0.0.1'
|
|
9
10
|
const port = process.env.PORT ?? 8082
|
|
@@ -12,8 +13,8 @@ export function runBrowserServer() {
|
|
|
12
13
|
const args = minimist(process.argv.slice(2))
|
|
13
14
|
const debug = args.debug
|
|
14
15
|
|
|
15
|
-
const server = app.listen(
|
|
16
|
-
await launchBrowser()
|
|
16
|
+
const server = app.listen(Number(port), async () => {
|
|
17
|
+
await launchBrowser(source)
|
|
17
18
|
const connecting = setInterval(async () => {
|
|
18
19
|
const browser = await getBrowser()
|
|
19
20
|
if (browser?.connected) {
|
|
@@ -21,7 +22,12 @@ export function runBrowserServer() {
|
|
|
21
22
|
if (debug) {
|
|
22
23
|
console.log(`Browser listening at 127.0.0.1:9222`)
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
+
if (source === 'zillow') {
|
|
26
|
+
await saveZillowCookie()
|
|
27
|
+
} else if (source === 'redfin') {
|
|
28
|
+
await saveRedfinCookie()
|
|
29
|
+
await shutdownBrowser()
|
|
30
|
+
}
|
|
25
31
|
}
|
|
26
32
|
}, 1000)
|
|
27
33
|
if (debug) {
|
|
@@ -77,7 +83,7 @@ export function runBrowserServer() {
|
|
|
77
83
|
}
|
|
78
84
|
})
|
|
79
85
|
|
|
80
|
-
app.
|
|
86
|
+
app.post('/cookie/save', async (_req, res) => {
|
|
81
87
|
try {
|
|
82
88
|
const cookie = await saveZillowCookie()
|
|
83
89
|
res.send({ cookie })
|
|
@@ -86,6 +92,15 @@ export function runBrowserServer() {
|
|
|
86
92
|
}
|
|
87
93
|
})
|
|
88
94
|
|
|
95
|
+
app.post('/cookie/redfin/save', async (_req, res) => {
|
|
96
|
+
try {
|
|
97
|
+
const cookie = await saveRedfinCookie()
|
|
98
|
+
res.send({ cookie })
|
|
99
|
+
} catch (error) {
|
|
100
|
+
res.send(error)
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
|
|
89
104
|
app.post('/browser/close', async (_req, res) => {
|
|
90
105
|
try {
|
|
91
106
|
const browser = await closeBrowser()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import G from"express";import P from"puppeteer";import{exec as D}from"child_process";import{checkForConfigFile as Z,waitForConfigFile as L,getValueFromConfigFile as H,updateConfigFile as V}from"@rent-scraper/utils/config";import{parseError as W}from"@rent-scraper/utils";const J="http://127.0.0.1:9222/json/version",F=async()=>{try{return await P.connect({browserURL:J})}catch{return null}},y=async()=>{(await(await F())?.pages())?.forEach(async o=>o.close())},I=async(o="zillow")=>{if(await F())return{status:"already launched"};{await Z(o)||await L(o),await Z(o);const w=await H(o,"browser")==="brave"?"/Applications/Brave\\ Browser.app/Contents/MacOS/Brave\\ Browser":"/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome";return D(`${w} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`,(d,n,c)=>{if(d){console.error(`Error: ${d.message}`);return}if(c){console.error(`Stderr: ${c}`);return}console.log(`Stdout: ${n}`)}),{status:"launched"}}},M=async(o="https://zillow.com")=>{const w=await F();if(w){const d=o,n=(await w.pages())?.[0]??await w.newPage();return(await n.title()).includes("denied")||await n.goto(d,{waitUntil:"load"}),{status:"opened"}}else return{status:"not connected"}},K=async()=>{const o=await F();return o?(await o.close(),await o.disconnect(),{status:"closed"}):{status:"not connected"}},S=async()=>{const o=await P.connect({browserURL:"http://127.0.0.1:9222/json/version"});await M("https://www.zillow.com/homes/for_rent/");const[w]=(await o.cookies()).filter(d=>d.name==="_pxvid");if(w)return await y(),w;console.log("refetching cookie"),setTimeout(async()=>{await S()},2e3)},N=async()=>{try{const{name:o,value:w}=await S()??{},d={zillowCookie:`${o}=${w}`};await V("zillow",d)}catch(o){const{status:w,message:d}=W(o);console.error(w,d)}};function Q(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var R,U;function X(){if(U)return R;U=1;function o(n,c){var e=n;c.slice(0,-1).forEach(function(a){e=e[a]||{}});var l=c[c.length-1];return l in e}function w(n){return typeof n=="number"||/^0x[0-9a-f]+$/i.test(n)?!0:/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(n)}function d(n,c){return c==="constructor"&&typeof n[c]=="function"||c==="__proto__"}return R=function(n,c){c||(c={});var e={bools:{},strings:{},unknownFn:null};typeof c.unknown=="function"&&(e.unknownFn=c.unknown),typeof c.boolean=="boolean"&&c.boolean?e.allBools=!0:[].concat(c.boolean).filter(Boolean).forEach(function(t){e.bools[t]=!0});var l={};function a(t){return l[t].some(function(f){return e.bools[f]})}Object.keys(c.alias||{}).forEach(function(t){l[t]=[].concat(c.alias[t]),l[t].forEach(function(f){l[f]=[t].concat(l[t].filter(function($){return f!==$}))})}),[].concat(c.string).filter(Boolean).forEach(function(t){e.strings[t]=!0,l[t]&&[].concat(l[t]).forEach(function(f){e.strings[f]=!0})});var r=c.default||{},b={_:[]};function q(t,f){return e.allBools&&/^--[^=]+$/.test(f)||e.strings[t]||e.bools[t]||l[t]}function g(t,f,$){for(var i=t,O=0;O<f.length-1;O++){var B=f[O];if(d(i,B))return;i[B]===void 0&&(i[B]={}),(i[B]===Object.prototype||i[B]===Number.prototype||i[B]===String.prototype)&&(i[B]={}),i[B]===Array.prototype&&(i[B]=[]),i=i[B]}var _=f[f.length-1];d(i,_)||((i===Object.prototype||i===Number.prototype||i===String.prototype)&&(i={}),i===Array.prototype&&(i=[]),i[_]===void 0||e.bools[_]||typeof i[_]=="boolean"?i[_]=$:Array.isArray(i[_])?i[_].push($):i[_]=[i[_],$])}function h(t,f,$){if(!($&&e.unknownFn&&!q(t,$)&&e.unknownFn($)===!1)){var i=!e.strings[t]&&w(f)?Number(f):f;g(b,t.split("."),i),(l[t]||[]).forEach(function(O){g(b,O.split("."),i)})}}Object.keys(e.bools).forEach(function(t){h(t,r[t]===void 0?!1:r[t])});var A=[];n.indexOf("--")!==-1&&(A=n.slice(n.indexOf("--")+1),n=n.slice(0,n.indexOf("--")));for(var p=0;p<n.length;p++){var s=n[p],u,v;if(/^--.+=/.test(s)){var T=s.match(/^--([^=]+)=([\s\S]*)$/);u=T[1];var z=T[2];e.bools[u]&&(z=z!=="false"),h(u,z,s)}else if(/^--no-.+/.test(s))u=s.match(/^--no-(.+)/)[1],h(u,!1,s);else if(/^--.+/.test(s))u=s.match(/^--(.+)/)[1],v=n[p+1],v!==void 0&&!/^(-|--)[^-]/.test(v)&&!e.bools[u]&&!e.allBools&&(!l[u]||!a(u))?(h(u,v,s),p+=1):/^(true|false)$/.test(v)?(h(u,v==="true",s),p+=1):h(u,e.strings[u]?"":!0,s);else if(/^-[^-]+/.test(s)){for(var E=s.slice(1,-1).split(""),C=!1,m=0;m<E.length;m++){if(v=s.slice(m+2),v==="-"){h(E[m],v,s);continue}if(/[A-Za-z]/.test(E[m])&&v[0]==="="){h(E[m],v.slice(1),s),C=!0;break}if(/[A-Za-z]/.test(E[m])&&/-?\d+(\.\d*)?(e-?\d+)?$/.test(v)){h(E[m],v,s),C=!0;break}if(E[m+1]&&E[m+1].match(/\W/)){h(E[m],s.slice(m+2),s),C=!0;break}else h(E[m],e.strings[E[m]]?"":!0,s)}u=s.slice(-1)[0],!C&&u!=="-"&&(n[p+1]&&!/^(-|--)[^-]/.test(n[p+1])&&!e.bools[u]&&(!l[u]||!a(u))?(h(u,n[p+1],s),p+=1):n[p+1]&&/^(true|false)$/.test(n[p+1])?(h(u,n[p+1]==="true",s),p+=1):h(u,e.strings[u]?"":!0,s))}else if((!e.unknownFn||e.unknownFn(s)!==!1)&&b._.push(e.strings._||!w(s)?s:Number(s)),c.stopEarly){b._.push.apply(b._,n.slice(p+1));break}}return Object.keys(r).forEach(function(t){o(b,t.split("."))||(g(b,t.split("."),r[t]),(l[t]||[]).forEach(function(f){g(b,f.split("."),r[t])}))}),c["--"]?b["--"]=A.slice():A.forEach(function(t){b._.push(t)}),b},R}var Y=X();const j=Q(Y);function x(){const o=G(),w=process.env.HOST??"127.0.0.1",d=process.env.PORT??8082;o.use(G.json());const n=j(process.argv.slice(2)).debug,c=o.listen(8082,async()=>{await I();const l=setInterval(async()=>{(await F())?.connected&&(clearInterval(l),n&&console.log("Browser listening at 127.0.0.1:9222"),await N())},1e3);n&&console.log(`Server listening at ${w}:${d}`)}),e=()=>(c.close(async l=>{const a=await K();n&&(console.log(a),console.log("server closed")),process.exit(l?1:0)}),{status:"shutdown"});return o.get("/server",(l,a)=>{try{a.send({running:!0})}catch(r){a.send(r)}}),o.post("/browser/launch",async(l,a)=>{try{const r=await I();a.send({browser:r})}catch(r){a.send(r)}}),o.post("/browser/open",async(l,a)=>{try{const{url:r}=l?.body??{},b=await M(r);a.send({browser:b})}catch(r){a.send(r)}}),o.get("/cookie",async(l,a)=>{try{const r=await S();a.send({cookie:r})}catch(r){a.send(r)}}),o.get("/cookie/save",async(l,a)=>{try{const r=await N();a.send({cookie:r})}catch(r){a.send(r)}}),o.post("/browser/close",async(l,a)=>{try{const r=await y();a.send({browser:r})}catch(r){a.send(r)}}),o.post("/server/shutdown",(l,a)=>{try{const r=e();a.send({server:r})}catch(r){a.send(r)}}),process.on("SIGINT",e),process.on("SIGTERM",e),o}export{S as a,N as b,y as c,F as g,I as l,M as o,x as r,K as s};
|