【问题标题】:Is there any way to get command line parameters in Google Chrome extension?有没有办法在谷歌浏览器扩展中获取命令行参数?
【发布时间】:2015-11-24 01:06:16
【问题描述】:

我需要使用自定义参数从命令行启动 Chrome 包含一些 js 文件的路径。此外,该路径将用于 扩展名。

我仔细浏览了所有相关文档并单击了所有节点 Chrome 调试器,但在命令行上找不到任何类似的东西 参数。无论如何都可以获得这些参数还是需要 写更复杂的npapi-extension? (理论上在这样的 npapi- 扩展我们可以通过win-api,命令行获取自己的进程 自处理等)。

【问题讨论】:

  • 仅供参考,您描述的 NPAPI 方法不起作用,因为插件将在完全不同的进程中运行(由 Chrome 使用它决定的命令行参数启动)。
  • 你是错的,也是对的。我已经尝试过这样的方案,并且可以通过扩展获得有关单独当前进程的信息。这意味着还可以获取有关父进程和父进程命令行的信息。
  • 我还发现了特殊页面 chrome://version。此页面包含我需要的确切信息 - 带有所有开关的命令行。我尝试调试此页面,但发现对我没有任何用处。
  • chrome://version 上显示的数据在chrome://version/strings.js 中定义,但不允许扩展访问。

标签: google-chrome command-line google-chrome-extension


【解决方案1】:

Hack alert: this post 建议传递一个虚假 URL 以打开,该 URL 具有所有命令行参数作为查询字符串参数,例如,

chrome.exe http://fakeurl.com/?param1=val1&param2=val2

【讨论】:

  • +1 谢谢!我稍微改进了这种方法,请。看看我的回答。我很乐意听取您的意见。
  • 工作...可能还想以./ 为前缀,例如./chrome.exe MY_URL
【解决方案2】:

也许可以在通过命令行设置的自定义用户代理字符串中将路径传递给您的扩展程序。例如:

chrome.exe --user-agent='Chrome 43. My path is:/path/to/file'

然后,在你的扩展中:

var path = navigator.userAgent.split(":");
console.log(path[1])

【讨论】:

    【解决方案3】:

    基本上我使用@dfrankow's answer 中给出的技术,但我打开127.0.0.1:0 而不是假网址。这种方法有两个优点:

    1. 名称解析尝试被跳过。 好的,如果我仔细选择了虚假 URL 以避免打开现有 URL,则名称解析肯定会失败。但是没有必要,那为什么不跳过这一步呢?
    2. 没有服务器侦听 TCP 端口 0 仅使用 127.0.0.1 是不够的,因为客户端计算机上可能运行 Web 服务器,而我不希望扩展连接不小心给它。所以我必须指定一个端口号,但是哪个?端口0 是完美的选择:根据RFC 1700,这个端口号是“保留的”,即不允许服务器使用它。

    将参数 abcxyz 传递给您的扩展程序的示例命令行:

    chrome "http://127.0.0.1:0/?abc=42&xyz=hello"
    

    您可以通过这种方式在 background.js 中读取这些参数:

    chrome.windows.onCreated.addListener(function (window) {
        chrome.tabs.query({}, function (tabs) {
            var args = { abc: null, xyz: null }, argName, regExp, match;
            for (argName in args) {
                regExp = new RegExp(argName + "=([^\&]+)")
                match = regExp.exec(tabs[0].url);
                if (!match) return;
                args[argName] = match[1];
            }
            console.log(JSON.stringify(args));
        });
    });
    

    控制台输出(在扩展后台页面的控制台中):

    {"abc":"42","xyz":"hello"} 
    

    【讨论】:

      【解决方案4】:

      你可以试试:

      var versionPage = "chrome://version/strings.js";
      $.post(versionPage, function(data){
          data = data.replace("var templateData = ", "");
          data = data.slice(0, -1);
          var jsonOb = $.parseJSON(data);
          alert(jsonOb.command_line);
      });
      

      这假设您在加载序列中使用 jQuery,您总是可以用任何其他 AJAX 方法替换

      【讨论】:

      • 此方法仅在您打开版本页面时才有效,要解决此问题,我会将 $.post 包装为:chrome.tabs.create({url: versionPage, active: false}, function(){ });
      • 也许一旦帖子完成,您就可以关闭标签:)
      • 这种技术曾经有效,但在 chrome 47 上不再有效。我现在使用 --user-agent 技术取得了巨大成功。
      【解决方案5】:

      在上面关于使用 URL 传递参数的答案的基础上,请注意只有扩展程序,而不是应用程序,可以做到这一点。我发布了一个 Chrome 扩展程序,它只是截取 URL 并使其可用于另一个应用程序。

      https://chrome.google.com/webstore/detail/gafgnggdglmjplpklcfhcgfaeehecepg/

      源代码位于:

      https://github.com/appazur/kiosk-launcher

      Wi-Fi Public Display Screens

      【讨论】:

      • 两个链接都失效了
      • 抱歉,是的,我改为使用组策略来获取应用程序的参数,所以未发布。
      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多