mcp-scraper 0.43.2 → 0.43.4

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.
Files changed (39) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/api-server.cjs +92 -52
  3. package/dist/bin/api-server.cjs.map +1 -1
  4. package/dist/bin/api-server.js +2 -2
  5. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  6. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  7. package/dist/bin/mcp-scraper-cli.js +1 -1
  8. package/dist/bin/mcp-scraper-install.cjs +1 -1
  9. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  10. package/dist/bin/mcp-scraper-install.js +1 -1
  11. package/dist/bin/mcp-stdio-server.cjs +1 -1
  12. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  13. package/dist/bin/mcp-stdio-server.js +3 -3
  14. package/dist/bin/paa-harvest.cjs +42 -22
  15. package/dist/bin/paa-harvest.cjs.map +1 -1
  16. package/dist/bin/paa-harvest.js +2 -2
  17. package/dist/{chunk-H7LQ6PTI.js → chunk-6TAQ2MXK.js} +50 -24
  18. package/dist/chunk-6TAQ2MXK.js.map +1 -0
  19. package/dist/{chunk-YJNGNMDO.js → chunk-SXLQZKWC.js} +3 -3
  20. package/dist/chunk-XQIVXIAL.js +7 -0
  21. package/dist/chunk-XQIVXIAL.js.map +1 -0
  22. package/dist/{chunk-DAS7L4SF.js → chunk-ZDVQARDQ.js} +3 -1
  23. package/dist/chunk-ZDVQARDQ.js.map +1 -0
  24. package/dist/index.cjs +42 -22
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +2 -2
  29. package/dist/{server-BPEXEKA6.js → server-K76DL4S7.js} +39 -32
  30. package/dist/server-K76DL4S7.js.map +1 -0
  31. package/dist/{worker-2LIOH744.js → worker-OB6WSWOD.js} +3 -3
  32. package/package.json +2 -1
  33. package/dist/chunk-DAS7L4SF.js.map +0 -1
  34. package/dist/chunk-H7LQ6PTI.js.map +0 -1
  35. package/dist/chunk-MD75M2L5.js +0 -7
  36. package/dist/chunk-MD75M2L5.js.map +0 -1
  37. package/dist/server-BPEXEKA6.js.map +0 -1
  38. /package/dist/{chunk-YJNGNMDO.js.map → chunk-SXLQZKWC.js.map} +0 -0
  39. /package/dist/{worker-2LIOH744.js.map → worker-OB6WSWOD.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  harvest
4
- } from "../chunk-H7LQ6PTI.js";
4
+ } from "../chunk-6TAQ2MXK.js";
5
5
  import {
6
6
  browserServiceApiKey
7
- } from "../chunk-DAS7L4SF.js";
7
+ } from "../chunk-ZDVQARDQ.js";
8
8
  import "../chunk-3ZUBQQPQ.js";
9
9
  import "../chunk-5UN33CGU.js";
10
10
  import "../chunk-FCFQ634B.js";
@@ -1,11 +1,12 @@
1
1
  import {
2
+ HEADLESS_HARVEST_TEST_ENV,
2
3
  HEADLESS_OPS,
3
4
  browserServiceApiKey,
4
5
  browserServiceProxyId,
5
6
  currentCostContext,
6
7
  recordKernelSession,
7
8
  runWithCostContext
8
- } from "./chunk-DAS7L4SF.js";
9
+ } from "./chunk-ZDVQARDQ.js";
9
10
  import {
10
11
  DEFAULT_PROXY_MODE,
11
12
  HarvestOptionsSchema,
@@ -130,10 +131,38 @@ var MapsSelectors = {
130
131
  expandReview: '[data-review-id] button[aria-label*="See more"], [data-review-id] button.w8nwRe'
131
132
  };
132
133
 
134
+ // src/lib/browser-user-agent.ts
135
+ var RUNTIME_BROWSER_UA = /\b(?:HeadlessChrome|Chrome|Chromium|Firefox)\/\d+|\bVersion\/\d+.*\bSafari\//;
136
+ async function detectPageUserAgent(page) {
137
+ try {
138
+ const value = await page.evaluate(() => navigator.userAgent);
139
+ return typeof value === "string" && RUNTIME_BROWSER_UA.test(value) ? value : null;
140
+ } catch {
141
+ return null;
142
+ }
143
+ }
144
+ async function detectRuntimeUserAgent(browser) {
145
+ let probeContext = null;
146
+ try {
147
+ let page = browser.contexts().flatMap((context) => context.pages())[0];
148
+ if (!page) {
149
+ probeContext = await browser.newContext();
150
+ page = probeContext.pages()[0] ?? await probeContext.newPage();
151
+ }
152
+ return await detectPageUserAgent(page);
153
+ } catch {
154
+ return null;
155
+ } finally {
156
+ if (probeContext) await probeContext.close().catch(() => {
157
+ });
158
+ }
159
+ }
160
+ function withRuntimeUserAgent(options, runtimeUserAgent) {
161
+ return runtimeUserAgent ? { ...options, userAgent: runtimeUserAgent } : options;
162
+ }
163
+
133
164
  // src/driver/BrowserDriver.ts
134
165
  chromium.use(StealthPlugin());
135
- var DESKTOP_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
136
- var MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1";
137
166
  var DEFAULT_KERNEL_BROWSER_TIMEOUT_SECONDS = 180;
138
167
  var KERNEL_BROWSER_CLOSE_TIMEOUT_MS = 3e3;
139
168
  var KERNEL_SESSION_DELETE_TIMEOUT_MS = 5e3;
@@ -168,21 +197,11 @@ async function ensureKernelProfile(kernelClient, name) {
168
197
  if (!isKernelProfileConflict(err)) throw err;
169
198
  }
170
199
  }
171
- async function detectRuntimeUserAgent(browser) {
172
- try {
173
- const page = browser.contexts()[0]?.pages()[0];
174
- if (!page) return null;
175
- const ua = await page.evaluate(() => navigator.userAgent);
176
- return typeof ua === "string" && /Chrome\/\d+/.test(ua) ? ua : null;
177
- } catch {
178
- return null;
179
- }
180
- }
181
200
  function rankCheckContextOptions(config, runtimeUserAgent) {
182
201
  return {
183
202
  viewport: config.viewport,
184
203
  locale: config.locale,
185
- userAgent: config.userAgent ?? (config.isMobile ? MOBILE_USER_AGENT : runtimeUserAgent ?? DESKTOP_USER_AGENT),
204
+ ...runtimeUserAgent ? { userAgent: runtimeUserAgent } : {},
186
205
  ...config.deviceScaleFactor ? { deviceScaleFactor: config.deviceScaleFactor } : {},
187
206
  ...config.isMobile !== void 0 ? { isMobile: config.isMobile } : {},
188
207
  ...config.hasTouch !== void 0 ? { hasTouch: config.hasTouch } : {}
@@ -257,7 +276,7 @@ var BrowserDriver = class {
257
276
  viewport: config.viewport,
258
277
  locale: config.locale,
259
278
  device,
260
- userAgent: config.userAgent ?? (config.isMobile ? MOBILE_USER_AGENT : DESKTOP_USER_AGENT),
279
+ userAgent: null,
261
280
  deviceScaleFactor: config.deviceScaleFactor ?? null,
262
281
  isMobile: config.isMobile === true,
263
282
  hasTouch: config.hasTouch === true
@@ -345,7 +364,7 @@ var BrowserDriver = class {
345
364
  }
346
365
  this.browser = await playwrightChromium.connectOverCDP(kernelBrowser.cdp_ws_url);
347
366
  const runtimeUserAgent = await detectRuntimeUserAgent(this.browser);
348
- this.debugSnapshot.context.userAgent = config.userAgent ?? (config.isMobile ? MOBILE_USER_AGENT : runtimeUserAgent ?? DESKTOP_USER_AGENT);
367
+ this.debugSnapshot.context.userAgent = runtimeUserAgent;
349
368
  this.context = await this.browser.newContext(rankCheckContextOptions(config, runtimeUserAgent));
350
369
  await this.installEsbuildHelperShims(this.context);
351
370
  this.page = await this.context.newPage();
@@ -367,17 +386,19 @@ var BrowserDriver = class {
367
386
  ...config.browserExecutablePath ? { executablePath: config.browserExecutablePath } : {},
368
387
  ...config.ignoreDefaultArgs ? { ignoreDefaultArgs: config.ignoreDefaultArgs } : {}
369
388
  };
370
- const ctxOpts = rankCheckContextOptions(config);
371
389
  if (config.profileDir) {
372
390
  this.context = await chromium.launchPersistentContext(config.profileDir, {
373
391
  ...launchOpts,
374
- ...ctxOpts
392
+ ...rankCheckContextOptions(config)
375
393
  });
376
394
  await this.installEsbuildHelperShims(this.context);
377
395
  this.page = await this.context.newPage();
396
+ this.debugSnapshot.context.userAgent = await detectPageUserAgent(this.page);
378
397
  } else {
379
398
  this.browser = await chromium.launch(launchOpts);
380
- this.context = await this.browser.newContext(ctxOpts);
399
+ const runtimeUserAgent = await detectRuntimeUserAgent(this.browser);
400
+ this.debugSnapshot.context.userAgent = runtimeUserAgent;
401
+ this.context = await this.browser.newContext(rankCheckContextOptions(config, runtimeUserAgent));
381
402
  await this.installEsbuildHelperShims(this.context);
382
403
  this.page = await this.context.newPage();
383
404
  }
@@ -1304,8 +1325,6 @@ async function extractAISurfacesFromDocument(config) {
1304
1325
  }
1305
1326
 
1306
1327
  // src/extractor/PAAExtractor.ts
1307
- var DESKTOP_USER_AGENT2 = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
1308
- var MOBILE_USER_AGENT2 = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1";
1309
1328
  var PAAExtractor = class {
1310
1329
  constructor(driver, reporter) {
1311
1330
  this.driver = driver;
@@ -2115,7 +2134,6 @@ var PAAExtractor = class {
2115
2134
  requireUsEgress: options.requireUsEgress,
2116
2135
  viewport: isMobile ? { width: 390, height: 844 } : { width: 1280, height: 800 },
2117
2136
  locale: `${options.hl}-${options.gl.toUpperCase()}`,
2118
- userAgent: isMobile ? MOBILE_USER_AGENT2 : DESKTOP_USER_AGENT2,
2119
2137
  deviceScaleFactor: isMobile ? 3 : 1,
2120
2138
  isMobile,
2121
2139
  hasTouch: isMobile,
@@ -3242,7 +3260,12 @@ async function harvest(rawOptions) {
3242
3260
  max_questions: attemptOptions.maxQuestions
3243
3261
  }));
3244
3262
  const baseCtx = currentCostContext();
3245
- const attempt = baseCtx ? await runWithCostContext({ ...baseCtx, forceHeadful: true }, () => extractOnce(attemptOptions, signal)) : await extractOnce(attemptOptions, signal);
3263
+ const allowHeadlessTest = baseCtx?.harvestBrowserMode === "headless-test" && process.env[HEADLESS_HARVEST_TEST_ENV] === "true";
3264
+ const attempt = baseCtx ? await runWithCostContext({
3265
+ ...baseCtx,
3266
+ forceHeadless: allowHeadlessTest,
3267
+ forceHeadful: !allowHeadlessTest
3268
+ }, () => extractOnce(attemptOptions, signal)) : await extractOnce(attemptOptions, signal);
3246
3269
  if (attempt.error) {
3247
3270
  const err = attempt.error;
3248
3271
  const outcome2 = classifyAttemptError(err);
@@ -3433,6 +3456,9 @@ export {
3433
3456
  OrganicSelectors,
3434
3457
  LocalPackSelectors,
3435
3458
  MapsSelectors,
3459
+ detectPageUserAgent,
3460
+ detectRuntimeUserAgent,
3461
+ withRuntimeUserAgent,
3436
3462
  serpArrivalUrl,
3437
3463
  buildYouTubeChannelVideosUrl,
3438
3464
  BrowserDriver,
@@ -3447,4 +3473,4 @@ export {
3447
3473
  resolveKernelProxyId,
3448
3474
  harvest
3449
3475
  };
3450
- //# sourceMappingURL=chunk-H7LQ6PTI.js.map
3476
+ //# sourceMappingURL=chunk-6TAQ2MXK.js.map