From 4cabca12dfa6ca027b938b80ee6b940b5e89ea5c Mon Sep 17 00:00:00 2001 From: Chencheng Li <49442600+chencheng-li@users.noreply.github.com> Date: Fri, 20 Mar 2026 01:07:46 -0700 Subject: [PATCH] fix: use %20 instead of + for spaces in Bilibili WBI signed requests (#126) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit URLSearchParams.toString() encodes spaces as +, but Bilibili's WBI signature verification expects %20. This mismatch causes search queries with spaces (e.g. "亚马逊 滞销产品") to fail with TypeError: Failed to fetch due to CORS-blocked error responses. Fixes #125 Co-authored-by: Claude Opus 4.6 (1M context) --- src/bilibili.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bilibili.ts b/src/bilibili.ts index 4aca0db..d914bbf 100644 --- a/src/bilibili.ts +++ b/src/bilibili.ts @@ -60,7 +60,9 @@ export async function wbiSign( for (const key of Object.keys(allParams).sort()) { sorted[key] = String(allParams[key]).replace(/[!'()*]/g, ''); } - const query = new URLSearchParams(sorted).toString(); + // Bilibili WBI verification expects %20 for spaces, not + (URLSearchParams default). + // Using + causes signature mismatch → CORS-blocked error response → TypeError: Failed to fetch. + const query = new URLSearchParams(sorted).toString().replace(/\+/g, '%20'); const wRid = await md5(query + mixinKey); sorted.w_rid = wRid; return sorted; @@ -78,7 +80,7 @@ export async function apiGet( } const qs = new URLSearchParams( Object.fromEntries(Object.entries(params).map(([k, v]) => [k, String(v)])), - ); + ).toString().replace(/\+/g, '%20'); const url = `${baseUrl}${path}?${qs}`; return fetchJson(page, url); }