linux 系统打开虎牙直播等网页出现 xdg-open 弹窗解决办法
01. xdg-open 是什么?
xdg-open 是 XDG Utilities 提供的一个命令,它用于 打开 URL 或文件,并调用系统默认的应用来处理。例如:
xdg-open https://www.google.com会调用默认浏览器打开网页。xdg-open file.pdf会调用默认的 PDF 阅读器。xdg-open mailto:someone@example.com会调用默认的邮件客户端。
当 Chrome 访问虎牙直播时,虎牙的网页可能会尝试使用 xdg-open 来打开某些自定义协议(如 kiwi://),但 Linux 上 没有注册 kiwi:// 的处理程序,所以 xdg-open 无法正确处理,最终导致错误弹窗。
02. kiwi:// 是什么?
kiwi:// 可能是虎牙直播用来处理 Web 事件的一个 自定义协议,可能用于:
- 直播插件或扩展的内部通信(比如检测网页状态)。
- 调用某个本地应用(如虎牙 PC 客户端)。
- 触发特定的浏览器事件(如
domcontentloaded)。
在 Windows 或 macOS,虎牙可能有相应的软件可以处理 kiwi:// 协议,但在 Linux,这个协议没有被正确注册,所以 xdg-open 直接报错。
03. Chrome 为什么调用 xdg-open?
Chrome 会调用 xdg-open 处理某些协议(如 mailto:、webcal:),以及一些网站定义的自定义协议。虎牙直播的 JavaScript 可能包含类似的代码:
1 | |
或者:
1 | |
这会导致 Chrome 触发 xdg-open kiwi://domcontentloaded,然后 xdg-open 由于找不到处理程序而报错。
问题在于:
- Chrome 不检查
kiwi://是否有处理程序,直接调用xdg-open。 xdg-open发现kiwi://不是标准 URL,也 没有找到相应的应用,就会报错。
04. 强行解决问题
sudo vim /usr/bin/xdg-open 在 xdg-open 文件的最前面添加:
1 | |
这样它在执行任何逻辑之前就会检查 kiwi:// 相关的 URL,从而告诉 xdg-open:
- 如果 URL 以
kiwi://开头,直接退出,不执行任何操作。 - 这样,Chrome 即使调用
xdg-open kiwi://domcontentloaded,也不会触发弹窗。
最终,xdg-open 不会继续执行 默认的 URL 解析逻辑,错误弹窗也不会出现。
在
/usr/bin/xdg-open里添加拦截规则,可以避免不必要的错误。这个方法适用于 任何未知的、导致错误的协议,比如:
1
2
3>if [[ "$1" =~ ^(kiwi|huya|wegame):// ]]; then
exit 0
>fi
05. 温和的解决方案
在 Linux 上注册 kiwi:// 处理程序(静默处理请求) 可以手动创建一个假的 kiwi:// 处理器:
1 | |
然后注册它:
1 | |
这样 xdg-open kiwi://xxx 就不会弹窗了。