我正在尝试编写一个使用凭据自动填充ESXi登录网页的greasemonkey脚本。以下代码填充输入字段并启用提交按钮:
// ==UserScript==
// @name ESXi autofill credentials
// @namespace https://esx_address/ui/*
// @version 0.1
// @description Autofills user and password inputs
// @author Mirek
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @match https://esx_address/ui/*
// @grant none
// ==/UserScript==
try {
waitForKeyElements ("#password", function(jNode) {jNode.val("password");});
waitForKeyElements ("#username", function(jNode) {jNode.val("user");});
waitForKeyElements ("#submit", function(jNode) {jNode.prop("disabled", false);});
} catch(err) {
console.log("Something went wrong: " + err.message);
}
不幸的是,在我点击提交按钮后,即使凭据正确,我也会看到Cannot complete login due to an incorrect user name or password.
。
问题可能在于启用提交按钮。一旦用户在用户名字段中输入内容,登录页面就会启用它。不幸的是,脚本没有触发此行为。我发现启用了脚本后,当我进入登录页面并重新输入用户名和密码字段的最后一个字母时,登录成功。
如何以触发提交按钮的方式填充输入字段?
答案 0 :(得分:1)
这是一个烦人的最差练习 1 ,通常要求你欺骗用户事件。
change
事件。有时你需要假装一个完整的鼠标,按键/按下/向上,鼠标移动,模糊状态机 - 通常在关键步骤之间有时间延迟和/或状态检查。trusted
事件 - 特别是键盘事件。聪明的做法是使用密码管理器。例如,KeePass'“双通道自动类型混淆”会破坏大多数这些cr * ppy登录。 KeePass是开源的。
如果您不使用良好的密码管理器,则需要 种类 代码示例。
这适用于我当地的超市。 对于像许多银行这样的更难的网站来说,这还不够。对于任何其他网站来说,它可能无法正常工作。见上面的#1。
function loginSite () {
//--- Set username and password, from decrypted values. ---
$("div.input_box_div #userId").attr ('value', usr);
$("div.input_box_div #password").attr ('value', pword);
//--- New style login page, approx 10/28/16...
$('#keepMeSignedIn').prop ('checked', true);
$("#input-email").attr ('value', usr);
$("#password-password").attr ('value', pword);
$("#show-password-checkbox")[0].click (); //-- This is needed for blur hack!!!?!?!
setTimeout (function () {
changeAndBlur ("#input-email");
changeAndBlur ("#input-password");
}, 400);
waitForKeyElements ("#create-account-btn", clickWhenPrimed, true);
}
function changeAndBlur (jSelector) {
let node = $(jSelector);
if (node.length) {
var evChng = new Event("change");
node[0].dispatchEvent (evChng);
var evBlur = new Event("blur");
node[0].dispatchEvent (evBlur);
}
}
function clickWhenPrimed (jNode) {
if (jNode.css("background-color") == "rgb(228, 23, 32)") {
click_jNode (jNode);
}
else
return true;
}
请注意,对于所有其他网站,我个人使用密码管理器,可以自动填充我使用的每个网页登录(到目前为止,并进行一些调整)。
1 这样的网站/应用程序很烦人且危险,因为它们削弱了密码管理器的功能。 NIST has recently disapproved of password manager blocking。因此,向有罪的组织大力抱怨并支持您的管辖区可能允许长期短语和密码管理员的任何未决法律/法规。
答案 1 :(得分:0)
感谢Brock的投入,我获得了成功。谢谢!适用于ESXi版本:6.5.0,客户端版本:1.18.0。
更改和模糊事件成功启用了提交按钮。
function loginSite() {
waitForKeyElements("#username", function(jNode) {jNode.val(username);}, true);
waitForKeyElements ("#password", function(jNode) {jNode.val(password);}, true);
setTimeout(function() {
changeAndBlur("#username");
changeAndBlur("#password");
}, 400);
}
function changeAndBlur(jSelector) {
let node = $(jSelector);
if (node.length) {
var evChng = new Event("change");
node[0].dispatchEvent(evChng);
var evBlur = new Event("blur");
node[0].dispatchEvent(evBlur);
}
}
waitForKeyElements("#submit", loginSite, true);