@@ -3,24 +3,46 @@ import StealthPlugin from 'puppeteer-extra-plugin-stealth';
33import { create } from 'xmlbuilder2' ;
44import { XMLParser } from 'fast-xml-parser' ;
55import fs from 'fs' ;
6+ import { executablePath } from "puppeteer" ;
67
7- puppeteer . use ( StealthPlugin ( ) ) ;
8+ const puppeteerStealth = StealthPlugin ( ) ;
9+ puppeteerStealth . enabledEvasions . delete ( 'user-agent-override' ) ;
10+ puppeteer . use ( puppeteerStealth ) ;
811
912const URL = 'https://apkpure.com/android-device-policy/com.google.android.apps.work.clouddpc/versions' ;
1013
1114( async ( ) => {
1215 console . log ( 'Launching browser...' ) ;
13- const browser = await puppeteer . launch ( { headless : true , args : [ '--no-sandbox' , '--disable-setuid-sandbox' ] } ) ;
16+ const browser = await puppeteer . launch ( {
17+ executablePath : executablePath ( ) ,
18+ readTimeout : 5 * 60 * 1000 ,
19+ headless : true ,
20+ args : [
21+ '--no-sandbox' ,
22+ '--disable-notifications' ,
23+ '--disable-dev-shm-usage' ,
24+ ] ,
25+ } ) ;
1426 console . log ( 'Browser launched' ) ;
1527
1628 let versions = [ ] ;
17- let page
18-
29+ const page = await browser . newPage ( ) ;
1930 try {
20- page = await browser . newPage ( ) ;
21- await page . goto ( URL , { waitUntil : 'networkidle2' } ) ;
31+ await page . setUserAgent ( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' )
32+
33+ const URL = 'https://apkpure.com/android-device-policy/com.google.android.apps.work.clouddpc/versions' ;
34+
35+ await page . goto ( URL , { waitUntil : 'domcontentloaded' } ) ;
36+
2237 console . log ( '✅ Page loaded' ) ;
2338
39+ await page . waitForFunction ( ( ) => {
40+ return ! document . querySelector ( 'form#challenge-form, .cf-browser-verification' ) &&
41+ ! / A t t e n t i o n R e q u i r e d / . test ( document . title ) ;
42+ } , { timeout : 20000 } ) . catch ( ( ) => {
43+ throw new Error ( '❌ Cloudflare challenge did not resolve in time' ) ;
44+ } ) ;
45+
2446 versions = await page . evaluate ( ( ) => {
2547 const items = document . querySelectorAll ( 'li a.ver_download_link' ) ;
2648 const result = [ ] ;
@@ -55,6 +77,7 @@ const URL = 'https://apkpure.com/android-device-policy/com.google.android.apps.w
5577 await page . screenshot ( { path : 'screenshot.png' , fullPage : true } ) ;
5678
5779 console . log ( '📝 Saved debug.html and screenshot.png to docs/' ) ;
80+ process . exit ( 0 ) ;
5881 }
5982
6083 if ( versions . length ) console . log ( `✅ Scraped ${ versions . length } versions` ) ;
0 commit comments