Skip to content

Commit 228e11e

Browse files
committed
Prefer static WeChat fallback before Browser Use
1 parent b09e52f commit 228e11e

2 files changed

Lines changed: 49 additions & 23 deletions

File tree

src/__tests__/index-mocked-branches.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,31 @@ describe("index mocked branch coverage", () => {
265265
expect(res.headers.get("X-Markdown-Fallbacks")).toContain("wechat_static_fallback");
266266
});
267267

268+
it("tries static WeChat fetch before Browser Use for anonymous users", async () => {
269+
mocked.browser.alwaysNeedsBrowser.mockReturnValue(true);
270+
const fetchMock = vi.fn().mockResolvedValue(
271+
new Response("<html><body><div id=\"js_content\">wechat static first</div></body></html>", {
272+
status: 200,
273+
headers: { "Content-Type": "text/html; charset=utf-8" },
274+
}),
275+
);
276+
vi.stubGlobal("fetch", fetchMock);
277+
mocked.converter.htmlToMarkdown.mockImplementation((html: string) => ({
278+
markdown: html.includes("wechat static first") ? "# wechat static first" : "",
279+
title: "wechat",
280+
contentHtml: "<article>wechat static first</article>",
281+
}));
282+
283+
const req = new Request("https://md.example.com/https://mp.weixin.qq.com/s/static-first?raw=true", {
284+
headers: { Accept: "text/markdown" },
285+
});
286+
const res = await worker.fetch(req, createMockEnv({ BROWSER_USE_API_KEY: "browser-use-key" }).env, mockCtx());
287+
288+
expect(res.status).toBe(200);
289+
expect(await res.text()).toContain("proxied:# wechat static first");
290+
expect(mocked.browserUse.fetchViaBrowserUse).not.toHaveBeenCalled();
291+
});
292+
268293
it("retries through proxy and succeeds after PROXY_RETRY signal", async () => {
269294
mocked.browser.alwaysNeedsBrowser.mockReturnValue(true);
270295
mocked.browser.fetchWithBrowser.mockRejectedValueOnce(

src/handlers/convert.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -520,8 +520,31 @@ async function tryFetchAndParse(
520520
browserRendered = true;
521521
}
522522
} else if (!finalHtml && requiresBrowser && !browserAllowed) {
523+
// WeChat often serves usable article HTML to a MicroMessenger UA. Try this
524+
// before the slower remote-browser/proxy paths so public page loads do not
525+
// wait on a long-running Browser Use session.
526+
if (targetUrl.includes("mp.weixin.qq.com")) {
527+
const staticResult = await tryStaticFetch(
528+
targetUrl, env, host, format, selector, forceBrowser, noCache, engine,
529+
fallbacks, browserRendered, paywallDetected, sourceContentType,
530+
resolvedUrl, method, progress, abortSignal, browserAllowed,
531+
);
532+
if (staticResult.earlyReturn) {
533+
return staticResult.earlyReturn;
534+
}
535+
finalHtml = staticResult.finalHtml;
536+
method = staticResult.method;
537+
resolvedUrl = staticResult.resolvedUrl;
538+
browserRendered = staticResult.browserRendered;
539+
paywallDetected = staticResult.paywallDetected;
540+
sourceContentType = staticResult.sourceContentType;
541+
if (finalHtml) {
542+
fallbacks.add("wechat_static_fallback");
543+
}
544+
}
545+
523546
// Anonymous 用户无 browser 权限 — 先走 Browser Use 远程浏览器,再降级住宅代理
524-
if (env.BROWSER_USE_API_KEY) {
547+
if (!finalHtml && env.BROWSER_USE_API_KEY) {
525548
throwIfAborted(abortSignal);
526549
await progress("fetch", "Fetching via remote browser");
527550
const buHtml = await fetchViaBrowserUse(targetUrl, env.BROWSER_USE_API_KEY, abortSignal);
@@ -541,28 +564,6 @@ async function tryFetchAndParse(
541564
}
542565
}
543566

544-
// WeChat often serves usable article HTML to a MicroMessenger UA. Use this
545-
// as a low-cost fallback for anonymous users before failing the request.
546-
if (!finalHtml && targetUrl.includes("mp.weixin.qq.com")) {
547-
const staticResult = await tryStaticFetch(
548-
targetUrl, env, host, format, selector, forceBrowser, noCache, engine,
549-
fallbacks, browserRendered, paywallDetected, sourceContentType,
550-
resolvedUrl, method, progress, abortSignal, browserAllowed,
551-
);
552-
if (staticResult.earlyReturn) {
553-
return staticResult.earlyReturn;
554-
}
555-
finalHtml = staticResult.finalHtml;
556-
method = staticResult.method;
557-
resolvedUrl = staticResult.resolvedUrl;
558-
browserRendered = staticResult.browserRendered;
559-
paywallDetected = staticResult.paywallDetected;
560-
sourceContentType = staticResult.sourceContentType;
561-
if (finalHtml) {
562-
fallbacks.add("wechat_static_fallback");
563-
}
564-
}
565-
566567
if (!finalHtml) {
567568
throw new ConvertError(
568569
"Fetch Failed",

0 commit comments

Comments
 (0)