阅读:5184回复:23
怎么用GM脚本实现对哔哩哔哩登录自动填单的功能?
我常常用GM脚本实现对各网站的自动填写帐号密码,虽然我知道这样做的安全性,但是为了便利迅速,还是喜欢这样做。
lastpass也试用过,非常不好用,默认填写的只是带有name属性的元素,而且不能实现自动点击提交或自动聚焦到验证码栏,故我觉得GM脚本实现自动登录是最好的方式。 但在实际操作过程,部分网站填写后是无效的,很奇怪。 例如:https://passport.bilibili.com/login 图片:微信截图_20200304000348.png ![]() if (location.hostname.indexOf('bilibili.com') != -1) { window.addEventListener('load',function(){ document.querySelector('#login-username').value='帐号'; document.querySelector('#login-passwd').value='密码'; },false); } 我在用上述代码放进GM脚本里,表面上是可以实现自动填单,但点击登录时,会提示没有输入帐号密码。试请教,不知道有没有什么更好的办法可以实现填单并能被网站所接受呢? 环境:WIN10 X64,FF72.0.1,暴力猴2.12.7。 |
|
1楼#
发布于:2021-08-20 23:46
shinco20:可否分享一下最后的脚本?谢谢回到原帖 // ==UserScript== // @name AutoFillForm // @namespace none // @description 自动填单 // @include http* // @version 1.0 // ==/UserScript== 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()}, 300); } } addEventListener('animationstart', animationstart); document.head.appendChild(style); } //示例 //autoFill('[name="username"]', 'input', '帐号'); //autoFill('[name="password"]', 'input', '密码'); //autoFill('[name="cookietime"]', 'click'); //autoFill('#verifyCode', 'focus'); if (location.href.indexOf('txffp.com') != -1) { autoFill('#loginName', 'input','帐号'); autoFill('#passwd','input', '密码'); } |
|
2楼#
发布于:2021-08-20 11:36
|
|
3楼#
发布于:2021-06-21 09:04
|
|
4楼#
发布于:2021-06-20 20:24
|
|
5楼#
发布于:2021-06-20 19:45
|
|
6楼#
发布于:2021-06-20 14:08
// ==UserScript== // @name AutoFillForm // @namespace none // @description 自动填单 // @include http* // @version 1.0 // @run-at document-end // ==/UserScript== 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(); } } addEventListener('animationstart', animationstart); document.head.appendChild(style); } if (location.href.indexOf('dl.reg.163.com') != -1) { autoFill('[name="email"]', 'input', '帐号'); autoFill('[name="password"]', 'input', '密码'); } if (location.href.indexOf('cuipixiong.com') != -1) { autoFill('[name="username"]', 'input', '帐号'); autoFill('[name="password"]', 'input', '密码'); autoFill('[name="cookietime"]', 'click'); } 试试这个,加了一个参数,表示模拟类型。 |
|
7楼#
发布于:2021-06-20 10:39
lonely_8:可以的,不过因为登录框是在iframe里面,需要将下面地址加入,而不是上面两个地址。大大您好!以下是我常用的代码: // ==UserScript== // @name AutoFillForm // @namespace none // @description 自动填单 // @include http* // @version 1.0 // @run-at document-end // ==/UserScript== const autoFill = (selector, 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 valueSetter = Object.getOwnPropertyDescriptor( HTMLInputElement.prototype, 'value' ).set; const animationstart = (evt) => { if(evt.animationName !== animationName) return; const input = evt.target; input.focus(); valueSetter.call(input, value); input.dispatchEvent(new Event('input', { bubbles: true })); } addEventListener('animationstart', animationstart); document.head.appendChild(style); } if (location.href.indexOf('dl.reg.163.com') != -1) { autoFill('[name="email"]', '帐号'); autoFill('[name="password"]', '密码'); } if (location.href.indexOf('cuipixiong.com') != -1) { autoFill('[name="username"]', '帐号'); autoFill('[name="password"]', '密码'); document.querySelector('[name="cookietime"]').checked="checked"; }感觉非常好用,无论是怎么样的表格,包括弹窗类的表格都能一样填单,只要加上指定域名,然后两条语句autofill,就能轻轻松松将帐号密码填入。 使用了一段时间,但我发现还是有几个问题,特此想请教一下: 在遇到有些可以勾选“记住密码”的表单时,我在autofill帐号密码之后,添加 document.querySelector('[name="cookietime"]').checked="checked"; 或者,有些验证码栏需要聚焦填入的,添加document.querySelector('#captcha_input').focus(); 该两者都不会生效。 举例:http://cuipixiong.com/forum.php (该网站目前有问题,不登录帐号还能看到论坛,登录后就看不到了,怀疑是cookies的问题,但不影响目前讨论填单代码) 该登录表单为弹窗窗口类表单,帐号密码是能正常填入,在添加 document.querySelector('[name="cookietime"]').checked="checked";后,勾选“自动登录”的操作并不生效。 除此之外,document.querySelector('[name="loginsubmit"]').click(); 欲实现点击登录按钮,也没有反应。假设就这个表单,还另外存在验证码的情况,又如何实现勾选“自动登录”并聚焦到验证码栏呢? 我之前在网上搜寻了一些教程,基本上依靠query来实现这些功能,但是我在脚本加入query后,有些页面填单便出现了问题, 有没有办法,像脚本前面那段内容那样,加一段语句,后续的填单我可以自行添加,无论是不是弹窗类表格,我都能够实现填入帐号密码后会自动勾选“自动登录”,并聚焦“验证码栏”或自动点击“登录按钮”的操作? 谢谢! |
|
8楼#
发布于:2021-03-10 01:22
lonely_8:可以的,不过因为登录框是在iframe里面,需要将下面地址加入,而不是上面两个地址。 ![]() |
|
9楼#
发布于:2021-03-08 13:20
可以的,不过因为登录框是在iframe里面,需要将下面地址加入,而不是上面两个地址。
https://dl.reg.163.com/* |
|
10楼#
发布于:2021-03-08 01:17
lonely_8:const autoFill = (selector, value) => {https://mail.163.com/ 及 https://email.163.com/ 大大,现在碰上网易邮箱无法自动填单了,试过了你上述所有的方法都不管用, ![]() const autoFill = (selector, 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 = document.querySelector(selector); input.focus(); input.value = value; input.dispatchEvent(new Event('input', { bubbles: true })); removeEventListener('animationstart', animationstart); style.remove(); } addEventListener('animationstart', animationstart); document.head.appendChild(style); } autoFill('[name="email"]', 'admin'); autoFill('[name="password"]', 'password'); |
|
11楼#
发布于:2020-11-12 21:59
|
|
12楼#
发布于:2020-11-12 18:00
其实你可以试试bitwarden,我觉得比lastpass强不少
|
|
13楼#
发布于:2020-11-06 21:46
|
|
14楼#
发布于:2020-11-06 12:27
kidzgy:https://www.zhihu.com/signin?next=%2F const autoFill = (selector, 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 valueSetter = Object.getOwnPropertyDescriptor( HTMLInputElement.prototype, 'value' ).set; const animationstart = (evt) => { if(evt.animationName !== animationName) return; const input = evt.target; input.focus(); valueSetter.call(input, value); input.dispatchEvent(new Event('input', { bubbles: true })); } addEventListener('animationstart', animationstart); document.head.appendChild(style); } autoFill('[name="username"]', '帐号'); autoFill('[name="password"]', '密码'); |
|
上一页
下一页