Bilibili-Evolved 搜索栏 UID 跳转插件深度解析:输入即达用户空间
2026/9/20 0:08:21 网站建设 项目流程
  • 前端
  • 音视频

【免费下载链接】Bilibili-Evolved

强大的哔哩哔哩增强脚本

项目地址:https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved
点击查看免费下载

导读

本文聚焦 Bilibili-Evolved 增强脚本中"搜索栏 - UID 跳转"(launchBar.actions.uidSearch)插件的完整技术实现。该插件是脚本全局搜索栏(LaunchBar)动作体系的一员,其核心价值在于:当你在搜索栏输入uid前缀加数字时,脚本会自动识别出用户 ID,调用哔哩哔哩官方 API 解析该用户的昵称,并直接生成"一键跳转到该用户空间主页"的快捷动作。读完本文,你将掌握该插件的触发语法、底层匹配规则、API 调用链路,以及 Bilibili-Evolved 搜索栏动作提供者(Action Provider)的可扩展插件机制。

功能定位:搜索栏里的用户直达通道

原功能文档仅用一句话概括其定位:"在输入 UID (用户 ID) 时, 提供对应的跳转选项。"(见 uid-search 功能描述)

展开来看,这包含三层能力:

  1. 识别:把用户输入的文本与uid前缀格式进行匹配,区分出"这是 UID"还是普通搜索词;
  2. 解析:通过 B 站官方接口把纯数字 UID 反查为可读的用户昵称,让跳转选项更友好;
  3. 跳转:生成一个带图标、带描述的可点击动作,执行后在浏览器新标签页打开对应用户的空间主页。

它属于 Bilibili-Evolved 内置插件中 launch-bar(搜索栏)动作系列,与 数字联想 number-search(纯数字同时提供视频/专栏/直播间/用户跳转)、音频号跳转 audio-search(au/am 号跳转)等插件共同组成一套"输入即跳转"的快捷生态。

使用方式:如何触发 UID 跳转

安装并启用 Bilibili-Evolved 脚本后,在页面顶部的搜索栏(LaunchBar)中输入uid加上纯数字的用户 ID,例如:

uid2 uid1024 uid208259

输入后,搜索栏下方会立即出现一个候选动作,其展示逻辑为:

  • 标题:反查到的用户昵称(若 API 未返回昵称,则回退显示uid + 数字本身);
  • 描述:固定为"用户跳转";
  • 图标mdi-open-in-new(外部打开图标),提示这是一个跳转类动作。

此时按回车或点击该条目,脚本会在新标签页打开https://space.bilibili.com/{uid},直达目标用户的空间主页。如果不满足uid + 数字格式(例如只输入数字、输入其他前缀),该插件不会返回任何动作,输入内容会走 LaunchBar 默认的搜索流程。

实现原理:匹配 → 查询 → 生成动作

该插件的完整实现位于 uid-search/index.ts,整个流程可分为三步,全部封装在一个异步的getActions(input)方法中。

第一步:正则匹配输入

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

这里调用了 launch-bar 系列插件共享的工具函数matchInput(见 common.ts)。其实现为:

export const matchInput = (input: string, pattern: RegExp) => { const match = input.match(pattern) if (!match) { return {} } const type = match[1] const id = match[2] const indexer = `${type}${id}` return { match, type, id, indexer } }

关键细节:

  • 正则/^(uid)(\d+)$/要求完全匹配uid必须位于开头、后跟一位以上数字、且输入中不能有其他字符,因此uid2abcuid 2都不会命中;
  • 正则的捕获组被拆分为type(即uid前缀)与id(纯数字 UID),二者拼接成的indexer(如uid2)将作为该动作在搜索栏中的过滤关键词;
  • 若未匹配,函数返回{},插件随即返回空数组[],表示本插件对此输入"不感兴趣",不会干扰其他提供者的搜索结果。

第二步:调用官方 API 反查昵称

匹配成功后,插件通过 Bilibili-Evolved 的getJson工具(位于 src/core/ajax.ts)请求哔哩哔哩用户信息接口:

const json = await getJson(`https://api.bilibili.com/x/space/wbi/acc/info?mid=${id}`) const { name } = lodash.get(json, 'data', {})
  • 接口路径中的mid参数即为上一步解析出的 UID;
  • 使用 lodash 的get安全取值,从响应data字段中提取name(用户昵称),即使接口异常也只会得到undefined,不会导致插件崩溃;
  • 注意此接口为公开信息接口,未携带登录凭证,因此反查到的昵称与当前登录状态无关。

第三步:生成跳转动作

return [ createLinkAction({ name, description: '用户跳转', link: `https://space.bilibili.com/${id}`, indexer, }), ]

createLinkAction同样是共享工具(common.ts),它把参数标准化为一个符合LaunchBarAction接口的动作对象:

export const createLinkAction = (input: { name; displayName?; description?; indexer; link }): LaunchBarAction => { const { name, displayName, description, indexer, link } = input return { name: name || indexer, displayName, icon: 'mdi-open-in-new', indexer, description, action: () => { window.open(link, '_blank') }, order: 0, } }

可以注意到:

  • 若反查不到昵称,name会回退为indexer(即uid + 数字),保证动作永远有可显示的名称;
  • 动作的实际执行体actionwindow.open(link, '_blank'),即在新标签页打开空间主页链接;
  • order: 0表示该动作在候选列表中的默认排序权重(数字越小越靠前,由 LaunchBar 的排序逻辑消费)。

搜索栏插件机制:动作提供者如何被调度

UID 跳转插件本身并不直接实现界面,而是通过 Bilibili-Evolved 的插件数据总线注册为"动作提供者",由全局搜索栏统一调度。理解这层机制才能看懂插件入口代码:

export const plugin: PluginMetadata = { name: 'launchBar.actions.uidSearch', displayName: '搜索栏 - UID 跳转', async setup({ addData }) { addData('launchBar.actions', (providers: LaunchBarActionProvider[]) => { providers.push({ name: 'uidSearchProvider', getActions: async input => { /* 上述三步逻辑 */ }, }) }) }, }

提供者接口(LaunchBarActionProvider)

搜索栏动作提供者的类型定义见 launch-bar-action.ts:

export interface LaunchBarActionProvider { name: string getActions: (input: string) => Promise<LaunchBarAction[]> }

每个提供者只需实现两个字段:自身名称,以及"根据用户输入返回候选动作"的异步方法。UID 跳转插件注册的提供者名为uidSearchProvider,插件全名launchBar.actions.uidSearch则用于在脚本设置面板中与其他插件区分。

搜索栏的调度与过滤流程

全局搜索栏组件 LaunchBar.vue 在挂载时通过registerAndGetData('launchBar.actions', [searchProvider, historyProvider])获取全部动作提供者(内置的搜索建议与历史记录提供者作为默认值),每当用户输入变化(经过 200ms 防抖),就会遍历所有提供者并收集各自的getActions(input)结果(见getOnlineActionsInternal中的Promise.all并发调用),然后使用 Fuse.js 模糊搜索引擎对候选动作的indexerdisplayNamenamedescription等字段进行打分过滤,最终按order升序展示前 13 条。

因此,uid2这类输入会同时触发多个提供者:UID 跳转插件靠indexer字段(uid2)获得极高的匹配分数从而排在前列,而普通搜索建议则按常规路径兜底,两者互不冲突。

插件的装载方式

从插件体系看,uid-search是 Bilibili-Evolved 内置插件之一。脚本在运行时通过loadAllPlugins(src/plugins/plugin.ts)汇总三类插件——组件附带的插件、内置插件、用户安装的插件——并逐一执行其setup。内置插件通过require.context从插件目录自动收集(plugin.ts),因此每个 launch-bar 子目录下index.ts导出的plugin对象都会被自动注册,无需手工登记。

与同类跳转插件的对比

为了更准确地理解 UID 跳转的设计取舍,可以对比 launch-bar 动作系列中的其他插件:

插件匹配格式跳转目标特点
UID 跳转(本文)uid+ 数字用户空间单目标、需前缀、反查昵称
数字联想纯数字视频 / 直播间 / 专栏 / 用户单次输入并发查询 3 个 API,返回最多 4 个候选
音频号跳转au/am+ 数字音频 / 播放列表前缀区分两种资源类型

从 number-search/index.ts 可以看到,数字联想插件的实现方式是在一次Promise.all中同时请求视频信息(x/web-interface/view)、专栏信息(x/article/viewinfo)与用户卡片(x/web-interface/card)三个接口,再生成多个带不同description的动作。相比之下,UID 跳转插件刻意要求uid前缀,正是为了消除"纯数字到底是 av 号还是 UID"的歧义——这也是两个插件能够共存且互不干扰的设计基础:带前缀的输入交给uidSearchProvider,不带前缀的纯数字交给numberSearchProvider,各自正则互斥。

扩展思路:如何仿写同类提供者

理解了uidSearchProvider的模式后,开发者可以很轻松地仿写出新的跳转类提供者,只需三步:

  1. 定义匹配正则,例如(/^(bv)([\w]+)$/i),用matchInput解析出类型与 ID;
  2. 视需要调用getJson请求 B 站接口反查展示名(可选,失败时name会回退为indexer);
  3. createLinkAction生成带icondescriptionlinkindexer的动作,并通过addData('launchBar.actions', ...)推入提供者数组。

由于提供者机制是数据驱动的(registerAndGetData支持任意插件注入),即使是用户自己安装的第三方插件(通过installPlugin加载的代码,见 plugin.ts),只要遵循PluginMetadata结构并在setup中调用addData,同样能向搜索栏贡献新的跳转动作,这就是该功能模块开放性的直接体现。

小结

  • 功能:在 Bilibili-Evolved 搜索栏输入uid + 数字,即可获得指向对应用户空间的新标签页跳转动作;
  • 实现:正则精确匹配 →getJson请求x/space/wbi/acc/info反查昵称 →createLinkAction生成动作,全程约 30 行代码;
  • 机制:通过addData('launchBar.actions', ...)注册LaunchBarActionProvider,由 LaunchBar 统一并发拉取、Fuse 模糊过滤并按order排序展示;
  • 参考:核心源码位于 uid-search/index.ts、common.ts,调度逻辑见 LaunchBar.vue 与 launch-bar-action.ts。

这套"前缀正则 + 接口反查 + 动作生成"的插件模式,是 Bilibili-Evolved 搜索栏所有快捷跳转能力的通用骨架,也是理解脚本插件数据总线(addData/registerAndGetData)用法的最佳入门样例之一。

  • 前端
  • 音视频

【免费下载链接】Bilibili-Evolved

强大的哔哩哔哩增强脚本

项目地址:https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved
点击查看免费下载

相关推荐

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

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

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

立即咨询