| async function findAcceptLanguage(page) { |
| return await page.evaluate(async () => { |
| const result = await fetch("https://httpbin.org/get") |
| .then((res) => res.json()) |
| .then( |
| (res) => |
| res.headers["Accept-Language"] || res.headers["accept-language"] |
| ) |
| .catch(() => null); |
| return result; |
| }); |
| } |
|
|
| function getSource({ url, proxy }) { |
| return new Promise(async (resolve, reject) => { |
| if (!url) return reject("Missing url parameter"); |
| const context = await global.browser |
| .createBrowserContext({ |
| proxyServer: proxy ? `http://${proxy.host}:${proxy.port}` : undefined, |
| }) |
| .catch(() => null); |
| if (!context) return reject("Failed to create browser context"); |
|
|
| let isResolved = false; |
|
|
| var cl = setTimeout(async () => { |
| if (!isResolved) { |
| await context.close(); |
| reject("Timeout Error"); |
| } |
| }, global.timeOut || 60000); |
|
|
| try { |
| const page = await context.newPage(); |
|
|
| if (proxy?.username && proxy?.password) |
| await page.authenticate({ |
| username: proxy.username, |
| password: proxy.password, |
| }); |
| let acceptLanguage = await findAcceptLanguage(page); |
| await page.setRequestInterception(true); |
| page.on("request", async (request) => request.continue()); |
| page.on("response", async (res) => { |
| try { |
| if ( |
| [200, 302].includes(res.status()) && |
| [url, url + "/"].includes(res.url()) |
| ) { |
| await page |
| .waitForNavigation({ waitUntil: "load", timeout: 5000 }) |
| .catch(() => {}); |
| const cookies = await page.cookies(); |
| let headers = await res.request().headers(); |
| delete headers["content-type"]; |
| delete headers["accept-encoding"]; |
| delete headers["accept"]; |
| delete headers["content-length"]; |
| headers["accept-language"] = acceptLanguage; |
| await context.close(); |
| isResolved = true; |
| clearInterval(cl); |
| resolve({ cookies, headers }); |
| } |
| } catch (e) {} |
| }); |
|
|
| await page.goto(url, { |
| waitUntil: "domcontentloaded", |
| }); |
| } catch (e) { |
| if (!isResolved) { |
| await context.close(); |
| clearInterval(cl); |
| reject(e.message); |
| } |
| } |
| }); |
| } |
| module.exports = getSource; |
|
|