有没有办法在 Chromium 的 Tampermonkey 中做一个相对文件:// @require?

Is there a way to do a relative file:// @require in Tampermonkey on Chromium?

有没有办法告诉 Chromium 中的 Tampermonkey 脚本 运行 使用相对 @require 文件路径?例如,如果我有以下脚本头:

// ==UserScript==
// @name         test
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  test script
// @author       me
// @match        *://*/*
// @require      file://relative/path/to/external.js
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

我能否将 @requirefile:// 一起使用,并使其与我用户的 Chromium 配置文件或 Tampermonkey 扩展目录相关联?如果那不可能,有没有办法在 Chromium 启动时将参数传递给 Tampermonkey 脚本,或者以不同的方式在脚本中包含外部 .js 文件?

澄清一下,我正在尝试创建一个 Kiosk 系统,用户需要能够指定显示哪些仪表板,其中一些需要登录。我想让他们在外部 .js 文件中指定所需的信息。这是代码和示例外部文件。

样本logins.js

var config =
{
  "sites": [
    {
      "description": "All X dashboards",
      "site": "https://dashboards.X.com/index.php?return=",
      "username": "username",
      "password": "password",
      "form": "form-login",
      "username_field": "login",
      "password_field": "password",
      "submit_button": "button-login",
      "redirect": ""
    }
};

使用外部文件的 Tampermonkey 脚本

// ==UserScript==
// @name         test
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  test script
// @author       me
// @match        *://*/*
// @require      file://relative/path/to/logins.js
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

var delay = 500;
var attempts = 0;
var maxAttempts = 40;

(function() {
    'use strict';

    var url = GM_getValue("redirect");
    if (url !== undefined && url !== null)
    {
        GM_setValue("redirect", null);
        document.location.href = url;
        return;
    }

    var site = null;
    for (var i = 0, len = config.sites.length; i < len; i++)
    {
        if (document.location.href.includes(config.sites[i].site))
        {
            site = config.sites[i];
            break;
        }
    }

    if (site === null)
        return;

    setTimeout(doLogin.bind(null, site), delay);

})();

function doLogin(site)
{
    var form = document.forms[site.form];
    if (!form)
        form = document.forms[0];

    var username = form[site.username_field];
    var password = form[site.password_field];

    if (!form || !username || !password)
    {
        attempts++;
        if (attempts > maxAttempts)
            return;

        setTimeout(doLogin.bind(null, site), delay);
    }

    username.value = site.username;
    password.value = site.password;

    var login = form[site.submit_button];

    if (site.redirect && site.redirect.length > 0)
        GM_setValue("redirect", site.redirect);

    if (login)
        login.click();
    else
        form.submit();
}

由于信息亭和 Chromium 的性质,我希望这条路径是相对的而不是绝对的,因为绝对意味着我必须对路径进行硬编码,而硬编码任何东西都是不好的。

用脚本和 Process Monitor 做一些测试,我不相信有办法做一个实际的相对路径,但如果我指定 file:///filename.js 或什至尝试通过使用file:///../filename.jsChromium 之类的内容将尝试从包含 chrome.exe.

的目录中读取文件

出于我的目的,chrome.exe 文件的路径由我所知并由我控制,我可以将我的 "relative" 路径脚本放在该目录中并将它们引用为 file:///filename.js

再次声明,以防其他人发现这有用。如果我在 c:\kiosk\chrome\chrome.exe 中有我的 chrome.exe 文件并且我使用 @require file:///filename.js 然后 chrome 将尝试加载:

c:\kiosk\chrome\filename.js

这也适用于 chrome 目录内的任何相对路径,即 file:///scripts/filename.js 将解析为 c:\kiosk\chrome\scripts\filename.js