mirror of
https://git.mirrors.martin98.com/https://github.com/mendableai/firecrawl
synced 2025-08-04 11:20:38 +08:00
feat(v1): proxy option / stealthProxy flag (FIR-1050) (#1196)
* feat(v1): proxy option / stealthProxy flag * feat(js-sdk): add proxy option
This commit is contained in:
parent
e28a44463a
commit
b136e42b53
@ -110,5 +110,27 @@ describe("Scrape tests", () => {
|
|||||||
expectScrapeToSucceed(response);
|
expectScrapeToSucceed(response);
|
||||||
expect(typeof response.body.data.screenshot).toBe("string");
|
expect(typeof response.body.data.screenshot).toBe("string");
|
||||||
}, 15000);
|
}, 15000);
|
||||||
})
|
});
|
||||||
|
|
||||||
|
describe("Proxy API (f-e dependant)", () => {
|
||||||
|
it.concurrent("undefined works", async () => {
|
||||||
|
await scrape({
|
||||||
|
url: "http://firecrawl.dev",
|
||||||
|
});
|
||||||
|
}, 15000);
|
||||||
|
|
||||||
|
it.concurrent("basic works", async () => {
|
||||||
|
await scrape({
|
||||||
|
url: "http://firecrawl.dev",
|
||||||
|
proxy: "basic",
|
||||||
|
});
|
||||||
|
}, 15000);
|
||||||
|
|
||||||
|
it.concurrent("stealth works", async () => {
|
||||||
|
await scrape({
|
||||||
|
url: "http://firecrawl.dev",
|
||||||
|
proxy: "stealth",
|
||||||
|
});
|
||||||
|
}, 15000);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -217,6 +217,7 @@ const baseScrapeOptions = z
|
|||||||
fastMode: z.boolean().default(false),
|
fastMode: z.boolean().default(false),
|
||||||
useMock: z.string().optional(),
|
useMock: z.string().optional(),
|
||||||
blockAds: z.boolean().default(true),
|
blockAds: z.boolean().default(true),
|
||||||
|
proxy: z.enum(["basic", "stealth"]).optional(),
|
||||||
})
|
})
|
||||||
.strict(strictMessage);
|
.strict(strictMessage);
|
||||||
|
|
||||||
|
@ -207,6 +207,7 @@ export async function scrapeURLWithFireEngineChromeCDP(
|
|||||||
timeout, // TODO: better timeout logic
|
timeout, // TODO: better timeout logic
|
||||||
disableSmartWaitCache: meta.internalOptions.disableSmartWaitCache,
|
disableSmartWaitCache: meta.internalOptions.disableSmartWaitCache,
|
||||||
blockAds: meta.options.blockAds,
|
blockAds: meta.options.blockAds,
|
||||||
|
mobileProxy: meta.options.proxy === undefined ? undefined : meta.options.proxy === "stealth" ? true : false,
|
||||||
// TODO: scrollXPaths
|
// TODO: scrollXPaths
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -284,6 +285,7 @@ export async function scrapeURLWithFireEnginePlaywright(
|
|||||||
wait: meta.options.waitFor,
|
wait: meta.options.waitFor,
|
||||||
geolocation: meta.options.geolocation ?? meta.options.location,
|
geolocation: meta.options.geolocation ?? meta.options.location,
|
||||||
blockAds: meta.options.blockAds,
|
blockAds: meta.options.blockAds,
|
||||||
|
mobileProxy: meta.options.proxy === undefined ? undefined : meta.options.proxy === "stealth" ? true : false,
|
||||||
|
|
||||||
timeout,
|
timeout,
|
||||||
};
|
};
|
||||||
@ -338,6 +340,7 @@ export async function scrapeURLWithFireEngineTLSClient(
|
|||||||
atsv: meta.internalOptions.atsv,
|
atsv: meta.internalOptions.atsv,
|
||||||
geolocation: meta.options.geolocation ?? meta.options.location,
|
geolocation: meta.options.geolocation ?? meta.options.location,
|
||||||
disableJsDom: meta.internalOptions.v0DisableJsDom,
|
disableJsDom: meta.internalOptions.v0DisableJsDom,
|
||||||
|
mobileProxy: meta.options.proxy === undefined ? undefined : meta.options.proxy === "stealth" ? true : false,
|
||||||
|
|
||||||
timeout,
|
timeout,
|
||||||
};
|
};
|
||||||
|
@ -27,6 +27,8 @@ export type FireEngineScrapeRequestCommon = {
|
|||||||
instantReturn?: boolean; // default: false
|
instantReturn?: boolean; // default: false
|
||||||
geolocation?: { country?: string; languages?: string[] };
|
geolocation?: { country?: string; languages?: string[] };
|
||||||
|
|
||||||
|
mobileProxy?: boolean; // leave it undefined if user doesn't specify
|
||||||
|
|
||||||
timeout?: number;
|
timeout?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ export const featureFlags = [
|
|||||||
"mobile",
|
"mobile",
|
||||||
"skipTlsVerification",
|
"skipTlsVerification",
|
||||||
"useFastMode",
|
"useFastMode",
|
||||||
|
"stealthProxy",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type FeatureFlag = (typeof featureFlags)[number];
|
export type FeatureFlag = (typeof featureFlags)[number];
|
||||||
@ -87,6 +88,7 @@ export const featureFlagOptions: {
|
|||||||
location: { priority: 10 },
|
location: { priority: 10 },
|
||||||
mobile: { priority: 10 },
|
mobile: { priority: 10 },
|
||||||
skipTlsVerification: { priority: 10 },
|
skipTlsVerification: { priority: 10 },
|
||||||
|
stealthProxy: { priority: 20 },
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export type EngineScrapeResult = {
|
export type EngineScrapeResult = {
|
||||||
@ -145,6 +147,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: false,
|
||||||
},
|
},
|
||||||
quality: 1000, // cache should always be tried first
|
quality: 1000, // cache should always be tried first
|
||||||
},
|
},
|
||||||
@ -161,6 +164,7 @@ export const engineOptions: {
|
|||||||
mobile: true,
|
mobile: true,
|
||||||
skipTlsVerification: true,
|
skipTlsVerification: true,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: true,
|
||||||
},
|
},
|
||||||
quality: 50,
|
quality: 50,
|
||||||
},
|
},
|
||||||
@ -177,6 +181,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: true,
|
||||||
},
|
},
|
||||||
quality: 40,
|
quality: 40,
|
||||||
},
|
},
|
||||||
@ -193,6 +198,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: false,
|
||||||
},
|
},
|
||||||
quality: 30,
|
quality: 30,
|
||||||
},
|
},
|
||||||
@ -209,6 +215,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: false,
|
||||||
},
|
},
|
||||||
quality: 29,
|
quality: 29,
|
||||||
},
|
},
|
||||||
@ -225,6 +232,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: false,
|
useFastMode: false,
|
||||||
|
stealthProxy: false,
|
||||||
},
|
},
|
||||||
quality: 20,
|
quality: 20,
|
||||||
},
|
},
|
||||||
@ -241,6 +249,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: true,
|
useFastMode: true,
|
||||||
|
stealthProxy: true,
|
||||||
},
|
},
|
||||||
quality: 10,
|
quality: 10,
|
||||||
},
|
},
|
||||||
@ -257,6 +266,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: true,
|
useFastMode: true,
|
||||||
|
stealthProxy: false,
|
||||||
},
|
},
|
||||||
quality: 5,
|
quality: 5,
|
||||||
},
|
},
|
||||||
@ -273,6 +283,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: true,
|
useFastMode: true,
|
||||||
|
stealthProxy: true, // kinda...
|
||||||
},
|
},
|
||||||
quality: -10,
|
quality: -10,
|
||||||
},
|
},
|
||||||
@ -289,6 +300,7 @@ export const engineOptions: {
|
|||||||
mobile: false,
|
mobile: false,
|
||||||
skipTlsVerification: false,
|
skipTlsVerification: false,
|
||||||
useFastMode: true,
|
useFastMode: true,
|
||||||
|
stealthProxy: true, // kinda...
|
||||||
},
|
},
|
||||||
quality: -10,
|
quality: -10,
|
||||||
},
|
},
|
||||||
|
@ -94,6 +94,10 @@ function buildFeatureFlags(
|
|||||||
flags.add("useFastMode");
|
flags.add("useFastMode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.proxy === "stealth") {
|
||||||
|
flags.add("stealthProxy");
|
||||||
|
}
|
||||||
|
|
||||||
const urlO = new URL(url);
|
const urlO = new URL(url);
|
||||||
|
|
||||||
if (urlO.pathname.endsWith(".pdf")) {
|
if (urlO.pathname.endsWith(".pdf")) {
|
||||||
|
@ -94,6 +94,7 @@ export interface CrawlScrapeOptions {
|
|||||||
skipTlsVerification?: boolean;
|
skipTlsVerification?: boolean;
|
||||||
removeBase64Images?: boolean;
|
removeBase64Images?: boolean;
|
||||||
blockAds?: boolean;
|
blockAds?: boolean;
|
||||||
|
proxy?: "basic" | "stealth";
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Action = {
|
export type Action = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user