Bilibili-Evolved 搜索栏「数字联想」插件解析:纯数字输入的一键跳转机制
2026/9/20 2:17:08 网站建设 项目流程

Bilibili-Evolved 搜索栏「数字联想」插件解析:纯数字输入的一键跳转机制

【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved

导读

Bilibili-Evolved 内置的全局搜索栏(LaunchBar)除了常规的关键词搜索外,还提供了一系列「联想跳转」插件。其中,number-search(数字联想)插件负责在用户输入纯数字时,自动识别并给出对应的视频、直播间、专栏与用户空间跳转选项。本文以该插件为切入点,结合其功能文档与源码实现,深入讲解纯数字输入的匹配规则、背后调用的 B 站接口,以及 LaunchBar 动作提供者(Action Provider)的插件化机制,帮助读者理解如何扩展这一快捷跳转能力。

功能概述:纯数字输入得到什么

按功能文档的说明,当用户在搜索栏中输入纯数字时,插件会提供以下跳转选项:

  • 跳转至相应的视频(视为 av 号)
  • 跳转至相应的专栏(视为 cv 号)

需要说明的是,文档记录的是该插件的核心能力概述;而实际源码(见number-search/index.ts)在发布版本中进一步扩展为四个候选动作,除文档所述的两项外,还包含直播间跳转与用户空间跳转。也就是说,同一个纯数字串会被同时按 av 号、直播间房间号、cv 号与 UID 四种身份尝试解析,并一次性给出全部可行的跳转入口。

源码级实现解析

1. 输入匹配:/^()(\d+)$/

插件的入口定义在number-search/index.ts,它通过setup({ addData })launchBar.actions数据槽注册一个名为numberSearchProvider的动作提供者(LaunchBarActionProvider)。提供者的核心是getActions方法,它接收用户输入,首先进行正则匹配:

const { match, id, indexer } = matchInput(input, /^()(\d+)$/) if (!match) { return [] }

这里的matchInput工具函数定义于launch-bar/common.ts,它按三个捕获组拆解输入:第一组type(前缀类型)、第二组id(纯数字本体)、第三组用于拼接indexer(过滤关键词)。/^()(\d+)$/意味着第一组类型为空、第二组捕获连续多位数字,因此只有「纯数字」输入(如170001)才能命中,任何包含字母或符号的输入都会返回空数组,直接跳过本提供者。

2. 并行请求四个接口,解析实体名称

命中后,插件用Promise.all并行请求四个 B 站接口,分别解析该数字对应的实体名称:

const [aidJson, cvJson, uidJson] = await Promise.all([ await getJsonWithCredentials(`https://api.bilibili.com/x/web-interface/view?aid=${id}`), await getJson(`https://api.bilibili.com/x/article/viewinfo?id=${id}`), await getJson(`https://api.bilibili.com/x/web-interface/card?mid=${id}`), ])
数据来源请求接口对应实体提取字段
视频x/web-interface/view?aid=(带凭证请求)av 号对应视频data.title
专栏x/article/viewinfo?id=cv 号对应专栏data.title
用户x/web-interface/card?mid=UID 对应用户data.card.name
直播间无请求(直接构造链接)直播间房间号

其中视频接口使用getJsonWithCredentials(core/ajax.ts 中定义)携带登录凭证请求,这与评论区等需要用户身份的接口保持一致;其余两个接口使用普通getJson。直播间跳转不依赖接口,因为直播房间号与live.bilibili.com/{id}的 URL 结构直接对应,无需额外解析名称,选项名直接回退为数字本身。

各字段通过lodash.get安全取值,即使某接口返回失败或数据结构变化,也只是对应字段为空,不会中断整体流程。

3. 构造四个跳转动作

解析完成后,插件基于createLinkAction(定义于launch-bar/common.ts)构造四个LaunchBarAction,并按固定顺序返回:

createLinkAction({ name: videoName, description: '视频跳转', link: `https://www.bilibili.com/av${id}` }) createLinkAction({ name: id, description: '直播间跳转', link: `https://live.bilibili.com/${id}` }) createLinkAction({ name: articleName,description: '专栏跳转', link: `https://www.bilibili.com/read/cv${id}` }) createLinkAction({ name: userName, description: '用户跳转', link: `https://space.bilibili.com/${id}` })

createLinkAction会把这些字段组装成一个标准动作对象:

  • name:内部名称,取实体标题;若标题为空则回退为indexer(即纯数字本身);
  • icon: 'mdi-open-in-new':动作图标;
  • indexer:提供给搜索栏过滤的关键词(即输入的纯数字);
  • action:用户回车或点击时执行window.open(link, '_blank'),在新标签页打开目标链接。

LaunchBarAction的完整字段定义见launch-bar-action.ts,除上述字段外还支持content(自定义 Vue 渲染内容)、suggestName(回填建议词)、order(排序权重)等扩展能力,本插件未使用这些字段,保持默认展示。

插件化机制:launchBar.actions数据槽

numberSearchProvider并非写死在 LaunchBar 内部,而是通过 Bilibili-Evolved 的插件数据槽(data slot)机制注入的。LaunchBarActionProviders = 'launchBar.actions'(见launch-bar-action.ts)定义了数据槽键名,任何插件都可以在setup中通过addData('launchBar.actions', providers => {...})往这个数组里追加自己的提供者。搜索栏在用户输入时,会遍历所有已注册提供者并合并它们返回的动作列表(LaunchBarActionProvider.getActions的接口定义见同一文件的 L31-L37)。

正是这套机制让「联想跳转」家族得以低成本扩展。除本文主角外,registry/lib/plugins/launch-bar/目录下还包含若干同类插件,它们共享matchInputcreateLinkAction两个公共工具,仅通过不同正则区分输入形态:

插件正则匹配前缀跳转目标
number-search/^()(\d+)$/无前缀(纯数字)视频 / 直播间 / 专栏 / 用户
uid-search/^(uid)(\d+)$/uid用户空间(x/space/wbi/acc/info
cv-search/^(cv\|rl)(\d+)$/cv/rl专栏 / 文集
audio-search/^(a[um])(\d+)$/au/am音频 / 播放列表
bangumi-search/^(md\|ss\|ep)(\d+)$/md/ss/ep番剧详情 / 剧集

例如 uid-search/index.ts 使用/^(uid)(\d+)$/,仅当输入以uid开头时才触发;cv-search/index.ts 则额外区分rl前缀的文集跳转。这些插件与number-search形成互补:纯数字命中「四合一」联想,带前缀的输入则走更精确的单目标跳转。

使用方式与搜索栏整体协作

Bilibili-Evolved 的搜索栏本体是一个隐藏组件(hidden: true,见launch-bar/index.ts),通过快捷键唤起。相关插件在launch-bar/plugin.ts 中注册了showLaunchBar动作,默认绑定/键。在任意页面按下/唤起搜索栏后:

  1. 直接输入纯数字,如170001,回车即可看到「视频跳转 / 直播间跳转 / 专栏跳转 / 用户跳转」四个候选(各选项会优先显示解析出的真实标题,例如视频名、用户名);
  2. 选择对应项后,动作会通过window.open在新标签页打开目标页面;
  3. 输入带前缀的数字(如av170001uid123)则交由其他提供者处理,实现精确跳转。

值得注意的是,数字联想的解析结果依赖 B 站接口的实时返回,若当前网络无法访问对应接口(或接口返回非成功状态),该实体对应的选项标题会为空、仍保留数字形态的兜底名称,跳转链接本身始终可用。此外,searchProvider(见search-provider.ts)负责常规关键词搜索与 B 站搜索建议,与数字联想插件互不干扰,共同构成搜索栏的完整交互。

小结

number-search是 Bilibili-Evolved 搜索栏「数字联想」能力的实现样例:通过一个正则完成输入分类,通过三个 B 站公开接口并行解析实体,最终借助createLinkAction统一产出可执行的跳转动作。其价值不仅在于「输数字跳视频」这一层体验,更在于它演示了launchBar.actions数据槽的插件化扩展方式——任何开发者都可以仿照registry/lib/plugins/launch-bar/下的现有插件,编写自己的LaunchBarActionProvider注入搜索栏,实现任意自定义跳转规则。

若想深入理解完整机制,建议按以下顺序阅读仓库源码:

  • 动作与提供者接口定义:src/components/launch-bar/launch-bar-action.ts
  • 提供者注册机制与快捷键绑定:src/components/launch-bar/plugin.ts
  • 公共匹配与动作构造工具:registry/lib/plugins/launch-bar/common.ts
  • 同类插件实现:uid-search、cv-search、audio-search、bangumi-search

【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询