有没有办法在 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==
我能否将 @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 的性质,我希望这条路径是相对的而不是绝对的,因为绝对意味着我必须对路径进行硬编码,而硬编码任何东西都是不好的。
用脚本和 Process Monitor
做一些测试,我不相信有办法做一个实际的相对路径,但如果我指定 file:///filename.js
或什至尝试通过使用file:///../filename.js
、Chromium
之类的内容将尝试从包含 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
有没有办法告诉 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==
我能否将 @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 的性质,我希望这条路径是相对的而不是绝对的,因为绝对意味着我必须对路径进行硬编码,而硬编码任何东西都是不好的。
用脚本和 Process Monitor
做一些测试,我不相信有办法做一个实际的相对路径,但如果我指定 file:///filename.js
或什至尝试通过使用file:///../filename.js
、Chromium
之类的内容将尝试从包含 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