有没有办法在Chromium上的Tampermonkey中执行相关文件:// @require?

时间:2016-10-13 23:41:20

标签: chromium userscripts tampermonkey

有没有办法告诉在Tampermonkey中运行的Chromium脚本使用相对@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的性质,我希望这条路径相对而不是绝对,因为绝对意味着我必须硬编码路径并且硬编码任何东西都是坏的。

1 个答案:

答案 0 :(得分:0)

使用脚本和public static int testVal=0; void Awake() { Debug.Log(testVal); // print 0 SetVal(); Debug.Log(testVal); // print 10 } void SetVal() { testVal = 10; } 进行一些测试,我不相信有一种方法可以做一个实际的相对路径,但是如果我指定Process Monitor或者甚至试图通过使用像file:///filename.jsfile:///../filename.js将尝试从包含Chromium的目录中读取文件。

就我的目的而言,chrome.exe文件的路径是已知的并由我控制,我可以将我的“相对”路径脚本放在该目录中并将其引用为chrome.exe

同样,只是为了清楚,以防其他人发现这有用。如果我在 c:\ kiosk \ chrome \ chrome.exe 中有我的file:///filename.js文件,并且我使用 @require file:///filename.js ,那么chrome将尝试加载:

<强> C:\亭\铬\ filename.js

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