阅读:3496回复:2
如何用脚本对jkforum的登录页自动填单?
我之前在本社区发过类似的帖子:https://www.firefox.net.cn/read.php?tid=121467
lonely_8老哥给了一段代码: const autoFill = (selector, type, value) => { const animationName = btoa(Math.random()).replace(/[^a-z]/ig, 'a'); const style = document.createElement('style'); style.textContent = ` @keyframes ${animationName} {from{opacity:.9;}to{opacity:1;}} ${selector} {animation: ${animationName} 1ms;} `; const animationstart = (evt) => { if (evt.animationName !== animationName) return; const input = evt.target; input.focus(); if (type === 'input') { Object.getOwnPropertyDescriptor( HTMLInputElement.prototype, 'value' ).set.call(input, value); input.dispatchEvent(new Event('input', { bubbles: true })); } else if (type === 'click') { input.click(); } else if (type === 'focus') { setTimeout(() => {input.focus()}, 1500); } } addEventListener('animationstart', animationstart); document.head.appendChild(style); } if (location.hostname.indexOf('baidu.com') != -1){ autoFill('[name="username"]', 'input', '用户名'); autoFill('[name="password"]', 'input', '密码'); autoFill('[name="cookietime"]', 'click'); autoFill('#verifyCode', 'focus'); } 确实非常好用,可以适用99%的登录页。 除了脚本,我另外试用过lastpass以及bitwarden,发现都不好用。我的诉求是这样的: 1、打开登录页,实现自动填单,自动勾选记住密码,至于是否自动登录,可由使用者自行选择。 2、支持小弹窗,以及页面切换(比如很多外国网站是要先输入帐户,按了回车才输入密码,微软和谷歌就是这样)的自动填单 3、安全性是最不需要考虑的,因为压根没什么值钱的东西。即便有黑客黑我电脑要帐号密码,他所盗取东西的价值甚至比不过他的时间成本。 问题: 像https://www.jkforum.net/member.php?mod=logging&action=login 这样的登录页,能否通过改善以上的代码,实现自动登录? ![]() |
|
1楼#
发布于:2023-09-21 19:14
const wait = (root, selector, callback)=> { if (typeof root === "string") { callback = selector; selector = root; root = document; } if (root.querySelector(selector) !== null) { callback(); } else { setTimeout(()=>{ wait(root, selector, callback); }, 100); } } const autoFill = (root, selector, type, value) => { if (typeof root === "string") { value = type; type = selector; selector = root; root = document; } const fill = (input) => { input.focus(); if (type === 'input') { Object.getOwnPropertyDescriptor( HTMLInputElement.prototype, 'value' ).set.call(input, value); input.dispatchEvent(new Event('input', { bubbles: true })); } else if (type === 'click') { input.click(); } else if (type === 'focus') { setTimeout(() => {input.focus()}, 1500); } } if (root.nodeType !== root.DOCUMENT_FRAGMENT_NODE) { const animationName = btoa(Math.random()).replace(/[^a-z]/ig, 'a'); const style = document.createElement('style'); style.textContent = ` @keyframes ${animationName} {from{opacity:.9;}to{opacity:1;}} ${selector} {animation: ${animationName} 1ms;} `; const animationstart = (evt) => { if (evt.animationName !== animationName) return; fill(evt.target); } addEventListener('animationstart', animationstart); (root.head || root).appendChild(style); } else { fill(root.querySelector(selector)); } } if (location.hostname.indexOf('baidu.com') != -1){ autoFill('[name="username"]', 'input', '用户名'); autoFill('[name="password"]', 'input', '密码'); autoFill('[name="cookietime"]', 'click'); autoFill('#verifyCode', 'focus'); } else if (location.hostname.indexOf('jkforum.net') != -1) { wait('#pan-f2e', ()=>{ let root = document.querySelector('#pan-f2e').shadowRoot; autoFill(root, "#pan-body .other>button:nth-child(2)", 'click'); wait(root, "input[type=password]", ()=>{ autoFill(root, "input[type=text]", 'input', '用户名'); autoFill(root, "input[type=password]", 'input', '密码'); wait(root, "button:not([disabled])", ()=>{ autoFill(root, "button", 'click'); }); }); }); }差不多这样吧 |
|
2楼#
发布于:2023-09-21 19:51
|
|