- // ==UserScript==
- // @name BugMeNot Everywhere
- // @namespace https://greasyfork.org/users/37096/
- // @homepage https://greasyfork.org/scripts/35957/
- // @supportURL https://greasyfork.org/scripts/35957/feedback
- // @version 1.0.1
- // @description Add a list of login accounts from BugMeNot(bugmenot.com) on any website when focusing on username input
- // @author Hồng Minh Tâm
- // @icon http://bugmenot.com/favicon.ico
- // @include *
- // @grant GM_addStyle
- // @grant GM_xmlhttpRequest
- // @license GNU GPLv3
- // ==/UserScript==
-
- (function () {
- 'use strict';
- GM_addStyle([
- '@import url(//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css);',
- '.list-bugmenot { display:none; list-style: none; border: 1px solid #ccc; padding: 0; margin: 0; background-color: #fff; position: absolute; cursor: default; z-index: 9999999999; box-sizing: border-box; overflow: auto; text-align: left; }',
- '.list-bugmenot.show { display:block; }',
- '.list-bugmenot > li { padding: 5px 10px; cursor: pointer; border-bottom: 1px solid #aaa; color: #333; }',
- '.list-bugmenot > li:hover { background-color: #ddd; }',
- '.list-bugmenot .username { font-weight: 700; margin-bottom: 4px; }',
- '.list-bugmenot .password { margin-bottom: 4px; color: #666; }',
- '.list-bugmenot .success { display: inline-block; font-weight: 700; }',
- '.success-100 { color: rgb(0,198,0); }',
- '.success-90 { color: rgb(50,180,0); }',
- '.success-80 { color: rgb(99,164,0); }',
- '.success-70 { color: rgb(149,146,0); }',
- '.success-60 { color: rgb(199,129,0); }',
- '.success-50 { color: rgb(247,112,0); }',
- '.success-40 { color: rgb(247,90,0); }',
- '.success-30 { color: rgb(247,67,0); }',
- '.success-20 { color: rgb(247,45,0); }',
- '.success-10 { color: rgb(247,22,0); }',
- '.list-bugmenot .vote { display: inline-block; margin-left: 16px; float: right; }',
- '.list-bugmenot .no-logins-found, .list-bugmenot .no-logins-found:hover { cursor: default; text-align: center; background-color: #a90000; color: #fff; }',
- ].join(''));
-
- String.prototype.toDOM = function (isFull) {
- var parser = new DOMParser(),
- dom = parser.parseFromString(this, 'text/html');
- return isFull ? dom : dom.body.childNodes[0];
- };
-
- function getOffset(element, noScroll) {
- var rec = element.getBoundingClientRect();
- return {
- left: rec.left + window.scrollX,
- right: rec.right + window.scrollX,
- top: rec.top + window.scrollY,
- bottom: rec.bottom + window.scrollY,
- noScroll: {
- left: rec.left,
- right: rec.right,
- top: rec.top,
- bottom: rec.bottom,
- }
- };
- }
-
- function handleEvent(func, data) {
- return function (event) {
- func.bind(this)(event, data);
- };
- }
-
- // function setDataset(element, key, value) {
- // element.dataset[key] = JSON.stringify(value);
- // }
-
- // function getDataset(element, key) {
- // return JSON.parse(element.dataset[key]);
- // }
-
- // function realStyle(element, property) {
- // var transparent = 'rgba(0, 0, 0, 0)';
- // if (!element) return '';
- // var color = getComputedStyle(element).getPropertyValue(property);
- // if (color === transparent) {
- // return realStyle(element.parentElement, property);
- // } else {
- // return color;
- // }
- // }
-
- var accounts = [];
- var inputUsernameCurrentEl, inputPasswordCurrentEl;
- var minHeightListBMN = 100;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'http://bugmenot.com/view/' + location.hostname,
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded'
- },
- onload: function (response) {
- var bmnEl = response.responseText.toDOM(true);
- var accountEls = bmnEl.getElementsByClassName('account');
- for (var i = 0; i < accountEls.length; i++) {
- var accountEl = accountEls[i];
- var infoEl = accountEl.getElementsByTagName('kbd');
- var statsEl = accountEl.getElementsByClassName('stats')[1].getElementsByTagName('li');
- var account = {
- username: infoEl[0].innerHTML || '',
- password: infoEl[1].innerHTML || '',
- success: parseInt(statsEl[0].innerHTML.match(/\d+(?=%)/)[0]),
- vote: parseInt(statsEl[1].innerHTML.match(/\d+(?=\svotes)/)[0]),
- time: statsEl[2].innerHTML
- };
- accounts.push(account);
- }
- init();
- },
- onerror: function (response) {
-
- }
- });
-
- function init() {
- var listBMNEl = document.createElement('ul');
- listBMNEl.classList.add('list-bugmenot');
- document.body.appendChild(listBMNEl);
-
- function showListBMNEl() {
- listBMNEl.classList.add('show');
- }
-
- function hideListBMNEl() {
- listBMNEl.classList.remove('show');
- }
-
- if (accounts.length) {
- accounts.forEach(function (account, index) {
- var itemBMNEl = document.createElement('li');
- var itemBMNElHTML = [
- '<div>',
- ' <i class="fa fa-user fa-fw"></i>',
- ' <span class="username">' + account.username + '</span>',
- '</div>',
- '<div>',
- ' <i class="fa fa-key fa-fw"></i>',
- ' <span class="password">' + account.password + '</span>',
- '</div>',
- '<div>',
- ' <div class="success ' + getClassSuccess(account.success) + '">' + account.success + '%</div>',
- ' <div class="vote">' + account.vote + ' votes</div>',
- '</div>',
- // ',<div class="time">' + account.time + '</div>',
- ].join('');
- itemBMNEl.innerHTML = itemBMNElHTML;
- itemBMNEl.title = [
- 'Username: ' + account.username,
- 'Password: ' + account.password,
- '',
- account.success + '% success rate',
- account.vote + ' votes',
- account.time
- ].join('\n');
- // setDataset(itemBMNEl, 'account', account);
- itemBMNEl.onmousedown = handleEvent(onMouseDownItem);
- itemBMNEl.onclick = handleEvent(onClickItem, account);
- itemBMNEl.onmouseover = handleEvent(onMouseOverItem, account);
- itemBMNEl.onmouseout = handleEvent(onMouseOutItem);
- listBMNEl.appendChild(itemBMNEl);
- });
- } else {
- var itemBMNNoLoginsFoundEl = document.createElement('li');
- itemBMNNoLoginsFoundEl.classList.add('no-logins-found');
- itemBMNNoLoginsFoundEl.innerHTML = 'No logins found';
- listBMNEl.appendChild(itemBMNNoLoginsFoundEl);
- }
-
- window.onscroll = function (event) {
- if (inputUsernameCurrentEl) {
- addStyleListBMNEl(inputUsernameCurrentEl);
- }
- };
-
- window.onresize = function (event) {
- if (inputUsernameCurrentEl) {
- addStyleListBMNEl(inputUsernameCurrentEl);
- }
- };
-
- var enableMouseOut = true;
-
- function setValueInput(inputUsernameEl, inputPasswordEl, username, password) {
- inputUsernameEl.value = username;
- inputPasswordEl.value = password;
- }
-
- function onMouseDownItem(event) {
- event.preventDefault();
- }
-
- function onClickItem(event, account) {
- enableMouseOut = false;
- if (inputUsernameCurrentEl && inputPasswordCurrentEl) {
- setValueInput(inputUsernameCurrentEl, inputPasswordCurrentEl, account.username, account.password);
- hideListBMNEl();
- }
- }
-
- function onMouseOverItem(event, account) {
- if (inputUsernameCurrentEl && inputPasswordCurrentEl) {
- setValueInput(inputUsernameCurrentEl, inputPasswordCurrentEl, account.username, account.password);
- }
- }
-
- function onMouseOutItem(event) {
- if (!enableMouseOut) {
- enableMouseOut = true;
- return;
- }
- if (inputUsernameCurrentEl && inputPasswordCurrentEl) {
- setValueInput(inputUsernameCurrentEl, inputPasswordCurrentEl, '', '');
- }
- }
-
- function getClassSuccess(success) {
- if (success > 91) return 'success-100';
- else if (success > 81) return 'success-90';
- else if (success > 71) return 'success-80';
- else if (success > 61) return 'success-70';
- else if (success > 51) return 'success-60';
- else if (success > 31) return 'success-50';
- else if (success > 21) return 'success-30';
- else if (success > 11) return 'success-20';
- else return 'success-10';
- }
-
- function addStyleListBMNEl(inputEl) {
- // listBMNEl.style.backgroundColor = realStyle(inputEl, 'background-color');
- // listBMNEl.style.color = realStyle(inputEl, 'color');
- listBMNEl.style.width = inputEl.offsetWidth + 'px';
- var offsetTarget = getOffset(inputEl);
- if (offsetTarget.top - window.scrollY >= minHeightListBMN) {
- listBMNEl.style.top = '';
- listBMNEl.style.bottom = (window.innerHeight - offsetTarget.top) + 'px';
- listBMNEl.style.left = offsetTarget.left + 'px';
- listBMNEl.style.maxHeight = offsetTarget.noScroll.top + 'px';
- } else {
- listBMNEl.style.bottom = '';
- listBMNEl.style.top = offsetTarget.bottom + 'px';
- listBMNEl.style.left = offsetTarget.left + 'px';
- listBMNEl.style.maxHeight = (window.innerHeight - offsetTarget.noScroll.bottom) + 'px';
- }
- }
-
- function onFocusInput(event, data) {
- inputUsernameCurrentEl = data.inputUsernameEl;
- inputPasswordCurrentEl = data.inputPasswordEl;
- showListBMNEl();
- addStyleListBMNEl(inputUsernameCurrentEl);
- }
-
- function onBlurInput(event) {
- if (!event.target.isSameNode(document.activeElement)) {
- hideListBMNEl();
- }
- }
-
- function onInputInput(event) {
- enableMouseOut = false;
- hideListBMNEl();
- }
-
- function getInputEls() {
- var inputEls = [];
- var inputElTemps = document.getElementsByTagName('input');
- var inputElTemp;
- for (var i = 0; i < inputElTemps.length; i++) {
- inputElTemp = inputElTemps[i];
- switch (inputElTemp.type) {
- case "text":
- case "password":
- case "email":
- inputEls.push(inputElTemp);
- break;
- }
- }
- return inputEls;
- }
-
- var inputEls = getInputEls();
- for (var i = 0; i < inputEls.length; i++) {
- if (inputEls[i].type === 'password') {
- if ((inputEls[i + 1] && inputEls[i + 1].type === 'password')) {
- continue;
- }
-
- if (inputEls[i - 1]) {
- if (inputEls[i - 1].type === 'password') {
- continue;
- } else {
- var inputPasswordEl = inputEls[i];
- var inputUsernameEl = inputEls[i - 1];
- var data = {
- inputUsernameEl: inputUsernameEl,
- inputPasswordEl: inputPasswordEl
- };
- inputUsernameEl.onclick = handleEvent(onFocusInput, data);
- inputUsernameEl.onfocus = handleEvent(onFocusInput, data);
- inputUsernameEl.onblur = handleEvent(onBlurInput);
- inputUsernameEl.oninput = handleEvent(onInputInput);
- }
- }
-
- }
- }
- }
- })();