javascript 了解系统上使用的默认浏览器

bnlyeluc  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(329)

我正在使用Node.js编写一个脚本文件,它在默认浏览器中打开一个特定的URL。
我知道如何在用户的默认浏览器中打开URL,以前也曾在堆栈溢出时询问和回答过。
但不讨论了解用户操作系统上的默认浏览器。
我们(开发人员)知道我们在Node.js中运行脚本,有没有办法知道用户系统上使用的默认浏览器?
用户可能使用Mac OS、Windows或任何Linux发行版。

x8diyxa7

x8diyxa71#

您可以使用Node.js确定用户系统上的默认浏览器。
在Windows上:

const { execSync } = require('child_process');

function getDefaultBrowser() {
  try {
    const regResult = execSync('REG QUERY HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice /v ProgId', {encoding: 'utf8'});
    const [, progId] = regResult.trim().split(/\s+/);
    const exeResult = execSync(`REG QUERY HKEY_CLASSES_ROOT\\${progId}\\shell\\open\\command /ve`, {encoding: 'utf8'});
    const exeCmd = exeResult.trim().split(/\s+/)[0];
    return exeCmd;
  } catch (err) {
    console.error('Error occurred while fetching default browser', err);
  }
}

console.log(getDefaultBrowser());

在macOS上:

const { execSync } = require('child_process');

function getDefaultBrowser() {
  try {
    const defaultsResult = execSync('defaults read /Users/$(whoami)/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist | grep https | head -n1 | cut -d \'"\' -f4', {encoding: 'utf8'});
    const bundleId = defaultsResult.trim().split('.').slice(0, -1).join('.');
    const lsResult = execSync(`mdfind "kMDItemContentTypeTree=com.apple.application-bundle&&kMDItemCFBundleIdentifier=='${bundleId}'"`, {encoding: 'utf8'});
    const appPath = lsResult.trim().split('\n')[0];
    const exeCmd = `"${appPath}/Contents/MacOS/${bundleId.split('.').pop()}"`;
    return exeCmd;
  } catch (err) {
    console.error('Error occurred while fetching default browser', err);
  }
}

console.log(getDefaultBrowser());

在Linux上:

const { execSync } = require('child_process');

function getDefaultBrowser() {
  try {
    const xdgResult = execSync('xdg-settings get default-web-browser', {encoding: 'utf8'});
    const exeCmd = execSync(`which ${xdgResult.trim()}`, {encoding: 'utf8'}).trim();
    return exeCmd;
  } catch (err) {
    console.error('Error occurred while fetching default browser', err);
  }
}

console.log(getDefaultBrowser());

这些代码片段将获取相应平台上默认浏览器的可执行命令,然后您可以使用此信息在默认浏览器中使用Node.js打开URL。

sqserrrh

sqserrrh2#

默认浏览器在操作系统级别设置,并注册以执行某些任务,如打开.html页面或通用 URL,这意味着您可以找到一种方法来询问系统 * 哪个 * 是这样的默认浏览器,或者您需要一个 *2步验证 * 过程:
1.在任何开放端口(使用0作为端口)创建服务器,检索该端口并将浏览器指向该0.0.0.0:port,以通过用户代理检测默认情况下哪个浏览器打开页面。
1.您将这些详细信息存储在某个地方,以确保您要显示的真实的 URL 知道哪个浏览器将在那里登陆。

  • store* 部分是可选的,因为您可以有一个 Bootstrap ,它在嗅探用户代理 * 之后 * 执行重定向,考虑用户在会话之间切换默认浏览器,但这种技术应该为您提供一个 * 相当好的 * 启发式方法来检测打开页面的默认OS浏览器。

“相当好”的部分是因为默认浏览器带有随机化的用户代理,以减轻进一步的指纹识别,但我认为这些情况应该通过真实的网站上的功能检测来解决,或者如果您不关心这类浏览器,这些情况就会失败。
或者,您的初始登录页与重定向可以做一些功能检测,以微调和缩小的可能性,浏览器是你所期望的,或有能力,你要在最终网站服务。
为了历史的缘故...这里有两个文件,一个检测 Bootstrap 和你的真实的网站...
detect.js

const server = require('http').createServer((_, res) => {
  res.write(`
    <!doctype html>
    <script>
    const browser = globalThis.chrome ? 'chrome' :
      (globalThis.netscape ? 'firefox' :
        (globalThis.webkit ? 'safari' : 'unknown'));
    document.write(
      '<meta http-equiv="refresh" content="0;url=http://localhost:8080/?browser=' +
        browser +
      '">'
    );
    </script>
  `.replace(/^\s+/gm, '').trim());
  res.end();
  // get out on first launch as bootstrap
  server.close();
})
  .listen(0, () => {
    // to simplify this demo / for demo sake
    // redirect OS default browser here:
    const {port} = server.address();
    console.log(`http://0.0.0.0:${port}/`);
  });

server.js示例:

const {parse} = require('url');
const server = require('http').createServer((req, res) => {
  const {query: {browser}} = parse(req.url, true);
  res.write(`
    <!doctype html>
    <h1>Hello ${browser}!</h1>
  `.replace(/^\s+/gm, '').trim());
  res.end();
})
  .listen(8080);

// for demo sake (stops in 5 seconds)
setTimeout(() => { server.close() }, 5000);

现在,如果你把这些文件保存在本地,你可以通过node server.js & node detect.js运行这两个文件,这样检测就会检测并关闭,* 服务器 * 就会继续运行......用你喜欢的任何东西来改变server.js,或者把detect.js重定向到你喜欢的任何地方。

5cg8jx4n

5cg8jx4n3#

看看这个https://www.npmjs.com/package/x-default-browser
来自自述文件

How it works
Windows:
checks registry value HKCU\Software\Clients\StartMenuInternet
Linuxes:
reads the output of xdg-mime query default x-scheme-handler/http
OS X:
delegated to default-browser-id from Sindre Sorhus

相关问题