有没有办法告诉在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==
我可以将@require
与file://
一起使用并使其与我的用户的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的性质,我希望这条路径相对而不是绝对,因为绝对意味着我必须硬编码路径并且硬编码任何东西都是坏的。
答案 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.js
,file:///../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 强>