{"record":{"id":"1d930d0f04caed01","repo":"jackwener/OpenCLI","slug":"bilibili-label-api-requires-login-or-permission-1d930d","errorCode":null,"errorMessage":"Bilibili ${label} API requires login or permission: ${message} (${payload.code})","messagePattern":"Bilibili (.+?) API requires login or permission: (.+?) \\((.+?)\\)","errorType":"exception","errorClass":"AuthRequiredError","httpStatus":null,"severity":"error","filePath":"clis/bilibili/summary.js","lineNumber":65,"sourceCode":"        if (!B23_HOST_RE.test(parsed.hostname)) {\n            throw new ArgumentError('Bilibili summary URL must be a bilibili.com or b23.tv URL');\n        }\n    }\n    try {\n        return await resolveBvid(input);\n    } catch (error) {\n        throw new ArgumentError(`Cannot resolve Bilibili BV ID from input: ${input}`, error instanceof Error ? error.message : String(error));\n    }\n}\n\nfunction requireOkPayload(payload, label) {\n    if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n        throw new CommandExecutionError(`Bilibili ${label} API returned a malformed payload`);\n    }\n    if (payload.code !== 0) {\n        const message = payload.message ?? 'unknown error';\n        if (payload.code === -101 || payload.code === -403 || /登录|权限|forbidden|permission|login/i.test(String(message))) {\n            throw new AuthRequiredError('bilibili.com', `Bilibili ${label} API requires login or permission: ${message} (${payload.code})`);\n        }\n        throw new CommandExecutionError(`Bilibili ${label} API failed: ${message} (${payload.code})`);\n    }\n    return payload.data;\n}\n\nfunction readModelResult(data, bvid) {\n    if (!data || typeof data !== 'object' || Array.isArray(data)) {\n        throw new CommandExecutionError('Bilibili conclusion API returned malformed data');\n    }\n    if (data.code !== 0) {\n        throw new EmptyResultError('bilibili summary', `Bilibili has not generated an AI summary for ${bvid}.`);\n    }\n    let modelResult = data.model_result;\n    if (typeof modelResult === 'string') {\n        try {\n            modelResult = JSON.parse(modelResult);\n        } catch {","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/bilibili/summary.js#L47-L83","documentation":"When the Bilibili API returns a non-zero code of -101 or -403, or the message text matches login/permission keywords (登录/权限/forbidden/permission/login), requireOkPayload() throws AuthRequiredError for the bilibili.com realm. These codes mean the endpoint requires an authenticated session (cookies such as SESSDATA) or the account lacks permission for the content.","triggerScenarios":"Calling view/conclusion endpoints without a logged-in cookie jar; SESSDATA cookie expired; the video is region-locked or restricted (charged/members-only content) returning code -403; API message containing 登录/权限 keywords.","commonSituations":"Cookie expired after Bilibili invalidated sessions; running headless/CI without exporting browser cookies; accessing premium or region-locked videos; Bilibili tightening anonymous access to web-interface endpoints.","solutions":["Log in to bilibili.com in a browser and export fresh cookies (SESSDATA) into the CLI's credential/config store.","Re-export cookies if they were rotated/expired (code -101).","For -403, verify the account can view the video in a browser (charged/members-only/region-locked content cannot be summarized).","Retry the command after refreshing credentials."],"exampleFix":"// before\nOPENCLI_BILIBILI_COOKIE= cli summary BV1xx411c7mD  // no cookies -> -101\n// after\nOPENCLI_BILIBILI_COOKIE=\"SESSDATA=...; buvid3=...\" cli summary BV1xx411c7mD","handlingStrategy":"try-catch","validationCode":"if (!cookies || !/SESSDATA=/.test(cookies)) {\n  console.warn('No SESSDATA cookie configured; restricted videos will fail with auth errors');\n}","typeGuard":"function hasBilibiliCredentials(config) {\n  return typeof config?.cookie === 'string' && config.cookie.includes('SESSDATA=');\n}","tryCatchPattern":"try {\n  const summary = await summaryCommand(bvid);\n} catch (e) {\n  if (e.name === 'AuthRequiredError' || /requires login or permission/.test(e.message)) {\n    await refreshBilibiliCookies(); // re-export SESSDATA from browser\n    return summaryCommand(bvid);\n  }\n  throw e;\n}","preventionTips":["Keep fresh SESSDATA cookies in the CLI config; re-export after re-login or cookie rotation.","Test whether the video is viewable while logged in before summarizing restricted content.","In CI, inject cookies via secrets rather than relying on anonymous access.","Expect -101/-403 for members-only, charged, or region-locked videos — filter them out beforehand."],"tags":["authentication","cookies","bilibili","permission"],"backgroundTag":"auth-required-cookie-expired","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}